单片机远程灯控箱设计
该系统的软件设计由主程序、中断程序、串行接收子程序、串行发送子程序、X5045读写子程序及若干功能实现子程序。其中,:X5045读写子程序需对时钟进行精确操作,用汇编语言编写,其他均用C语言编写。
3.1主程序设计
在主程序中,先将SST89C58及X5045初始化,然后等待新命令。当NewData=1时,表示已接收到一个有效的命令帧,否则继续等待。接着判断是否是本机地址,若是则判断控制命令,否则继续等待。上位机发送指定的字符串,分别表示开灯、关灯、查询、设置等命令。通过字符串比较,判断出命令指令,跳到相应的入口子程序中;操作成功后,通过串口发送子程序返回相应的提示符,其具体流程如图3所示。在本系统中,上位机的人机交互界面由C++Builder开发,限于篇幅,在此从略。
3.2串口中断程序设计
为了增强抗干扰性,有效地区分噪声和数据便于操作,串口中断程序加强了通讯协议的制定[2],具体实现方法是加开始标志和结束标志。噪声是以随机字节出现的,通过测试和实验,发现在本系统中0x00后跟0xFF时噪声不容易发生。因此,设置开始标志为0x000xFF,结束标志为回车换行符0x0D0x0A。如果接收命令帧成功,则置NewData=1,表示新命令有效。考虑到纠检错,数据采用短包方式。中间采用延时,以保证起始位可靠。串口中断程序流程如图4所示。部分程序清单如下。
//串行接子函数
INT8U ReUART(INT8U*ch)
{INTl6U delay=6000;
while(--delay) //延时
{if(RI),/串行接收中断标志
{RI=0;//接收中断标志软件复位
、 *ch=SBU F=//读数据缓冲器
return 1;}//成功返回l
}
return(0);//接收失败返回0
)
//串行中断处理程序
void UART_Inter(void)interrupt 4
{INT8U ii;
INT8U temp,templ;
ReUART(temp、);//先连续接收2个字节
ReUART(templ);
//开始标志
if((temp==0x00)(templ==0xFF))
//连续接收一个命令帧
{for(ii=0;ii12;ii++)
{if(ReUART(buff[ii])==0)
goto Inter._end;}//跳出中断
if((buf[10]==0x0D)(buf[ll]==0x0A)),/结束标志
NewData=l; //新命令标志有效
}
Inter_end:;//中断出口
}
评论