📄 main.c
字号:
//main.c 可能中文文件夹下有问题 //电机输出应该屏蔽其他电机异动
//风扇 12v 0.37A 灯 12mA 12V 门磁 0.67A 24V
#include "AT89X51.h"
#include "main.h"
#include <intrins.h>
#include <absacc.h>
//#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
BYTE workState = HALT_STATUS; //工作状态
//输出数组
uchar ACK_BUF[LENMAX]; //Command in length=3 数据(命令) 接收 缓冲区
uchar DLE_BUF[DLELENMAX]; //state out length=3 数据(状态) 发送 缓冲区
//uchar TRUE_LEN=0; //接收字符个数统计变量
uchar IN_LENGTH;
bit first_DLE=0;
uchar CMDIN[LENMAX]; //Command in length=3 数据(命令) 接收 缓冲区
uchar count=0; //接收字符个数统计变量
bit RECE_flag=0; //接收标志位(1=成功接收)
//bit RECE_bak=0; //接收标志位(1=成功接收) 长时间保留位
//bit SEND_flag=0; //发送标志位(1=一次发送完毕,接下去等待 成功接收了)
//bit timerOver; //=1:定时器时间到了 标志位
//uint timeCounter=0;
bit timerHap; //=1:定时器时间到了 标志位
uint counter=0; //定时器循环次数计数器
extern BYTE bdata outputByte2; //XBYTE[0x1000];
extern bit OLT8; //控制投币口 开 关
extern bit OLT9; //控制维修灯 亮 灭
extern bit OLTA; //控制出卡处灯 亮 灭
//extern bit OLTB; //
extern bit OLTE; //控制fan1 亮 灭
extern bit OLTF; //控制fan2 亮 灭
uchar pwm1; //调制脉宽计数
bit fan1=0; //风扇1
uchar pwm2; //调制脉宽计数
bit fan2=0; //风扇2
uchar pwm3; //调制脉宽计数
bit cardlamp=0; //出票口灯
uchar pwm4; //调制脉宽计数
bit mainlamp=0; //维修处灯
//time0
#define RELOAD_HIGH 0xD8
#define RELOAD_LOW 0xF0
//time2
#define LD_T2H 0xFF
#define LD_T2L 0x9B
//FC17 1ms
//FE0C 0.5ms
//FFCD 50us
//FF9B 100us
/**********************************************************************
** 函数名称: init_time2
** 功能描述: 初始化定时器2 Door
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
***********************************************************************/
void INIT_TIME2(void)
{
T2CON=0x00; //16位自动重载定时器
T2MOD=0x00; //DCEN=0,定时器向上计数
TH2=0xFF; //
TL2=0xFF; //上顶点,加计数到该点了 就溢出
RCAP2H=LD_T2H;//
RCAP2L=LD_T2L;//下位点,向上计数的开始点
ET2=1; //使能定时器2中断
EA = 1;
TR2=1; //开始定时
}
/**********************************************************************
** 函数名称: init_time0
** 功能描述: 初始化定时器0 com
***********************************************************************/
void INIT_TIME0(void)
{
PX0=1; //
PX1=1; //外部中断01位高于定时器0的中断级别
TMOD=TMOD|0x01; //定时器0在模式1下工作
TL0=RELOAD_LOW;//0x00; //定时器每50ms产生一次溢出
TH0=RELOAD_HIGH;//0x4C; //自动重装的值
ET0=1; //使能定时器0中断
EA=1; //使能总中断
TR0=1; //开始计时
}
void tick_int(void) interrupt 1 //using 0 //定时器
{
TR0=0; // 停止定时器
P2_0=!P2_0; //先不喂狗
if(counter > 0)
{
counter--;
if(counter == 0) timerHap=1;
}
TH0=RELOAD_HIGH; // 设置重装值
TL0=RELOAD_LOW;
TR0=1; // 重新启动定时器
}
/**********************************************************************
** 函数名称: TIME2 定时器中断益处程序--
** 全局变量:
***********************************************************************/
void timer2 (void) interrupt 5
{
TR2=0; //关定时
P2_0=!P2_0; //先不喂狗
/*if(timeCounter > 0)
{
timeCounter--;
if(timeCounter == 0) timerOver=1;
}*/
if(fan1)
{
if(pwm1<=PWM50)//导通时间 1-8
{
OLTE = 0;
}//正方向 转
else
{
if(pwm1<PWM100) //关断时间 9-10
{
OLTE = 1;
}//停
else
{ pwm1=0; }
}
pwm1++;
}
else { OLTE = 1; } //停
if(fan2)
{
if(pwm2<=PWM50)//导通时间 1-8
{
OLTF = 0;
}//正方向 转
else
{
if(pwm2<PWM100) //关断时间 9-10
{
OLTF = 1;
}//停
else
{ pwm2=0; }
}
pwm2++;
}
else { OLTF = 1; } //停
/*if(mainlamp)
{
if(pwm4<=PWM50)//导通时间 1-8
{
OLT9=0;
}//正方向 转
else
{
if(pwm4<PWM100) //关断时间 9-10
{
OLT9=1;
}//停
else
{ pwm4=0; }
}
pwm4++;
}
else {
OLT9=1;
} //停
if(cardlamp)
{
if(pwm3<=PWM50)//导通时间 1-8
{
OLTA=0;
}//正方向 转
else
{
if(pwm3<PWM100) //关断时间 9-10
{
OLTA=1;
}//停
else
{ pwm3=0; }
}
pwm3++;
}
else {
OLTA=1;
} //停
*/
XBYTE[0x1000] = outputByte2; //公用
RCAP2H=LD_T2H;
RCAP2L=LD_T2L;
TR2=1; //开始定时
}
/////////////////////////////
//名称: timerSet
//功能: 设置定时器2
//输入: ms,定时时间,毫秒 1ms 最小单位
//输出: 定时时间到时,
///////////////////////
/*void timerSet(uchar ms)
{
TR2=0; // 停止定时器
timerOver = 0;
timeCounter = ms;
TR2=1; // 重新启动定时器
}*/
/////////////////////////////
//名称: setTimer
//功能: 设置定时器
//输入: ms,定时时间,毫秒 10ms 最小单位
//输出: 定时时间到时,输出TF0
///////////////////////
void setTimer(WORD ms)
{
TR0=0; // 停止定时器
timerHap = 0;
counter = ms/10;
//TF0=0; //清除标志位
TR0=1; // 重新启动定时器
}
main()
{
INIT_TIME2(); //first
//releaseAllMotor(); //锁住所有电机
init_serialcom();
INIT_TIME0();
// send_string_com(STAOUT,LENGTH);//发送 for test
while(1)
{
P2_0=!P2_0; //喂狗
switch(workState)
{
case HALT_STATUS:
if(RECE_flag) //1/ 如果有新数据 //pass
{
workState=EXEC_STATUS;
}
break;
case EXEC_STATUS: //执行报文
if(RECE_flag) //1/ 如果有新数据 //pass
{
execCommand();
RECE_flag=0;
}
break;
default:
break;
}
}//while end
}//main end
/**********************************************************************
** 函数名称: serial_recive //pass
** 功能描述: 串口接收中断函数接收一个字符串
** 输 入: 无
** 输 出: 无
** 全局变量: count: 接收字符个数统计变量
inbuf1[LENGHT] 数据接收缓冲区
LENGHT 接收数据总长度
RECE_flag 接收标志位
** 调用模块: 无
***********************************************************************/
void serial_recive () interrupt 4
{
if(RI)
{
unsigned char ch;
RI = 0;
ch=SBUF;
if(first_DLE==0)
{
if(ch==DLE) //
{
first_DLE=1;
//丢掉 ch
}
else //(ch!=0x10)
{
if(ch==ETX)// 03 03 未处理
{
CMDIN[count++]=ch;
RECE_flag=1; //表示已经完成一次完整接收
IN_LENGTH=count; //接收到数据的总长度
count=0;
}
else
{
CMDIN[count++]=ch;
}
first_DLE=0;
}
}
else //first_DLE==1
{
// if(ch==DLE||ch==ETX||ch==STX) //
// {}//
// else {} //
CMDIN[count++]=ch;
first_DLE=0;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -