📄 main.c
字号:
#include <reg52.h>
#include <IO_define.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define max_len 0x10//最大长度
//void delay10ms(uint count);
uchar send_buf[max_len]={0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x0a};//发送缓冲区
uchar recv_buf[max_len]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//接收缓冲区
uchar count_s;//发送计数
uchar count_r;//接收计数
bit flag1;
bit sflag;
send(void);
getout();
receive();
restio();
extern write_bit(uchar line,bit value);
extern control(void);
outio(void);
//主程序..........................................................................................
void main()
{
P1=0;//取消片选
P0=0xff;
count_s=0;
count_r=0;
//系统初始化
TMOD= 0x21;// 定时器0工作模式1, 16位定时方式// 定时器1工作于8位自动重载模式, 用于产生波特率
TCON= 0x05;
TH0 = 0xfd;
TL0 = 0xfe;
EA = 1;
ET0 = 0;
ET1 = 0;
IP = 0x10;
TR0 = 0;
//串口设置
TH1=250;
TL1=250;
TR1=1;
PCON=0X80;//SMOD=1,速率加倍
SCON=0X50;//工作方式1,9600
ES=1;//开串口中断
while(1)//主循环................................................................................
{
outio();
// control();//调用控制子程序
sflag=0;//一秒一次标志位清零
if(fsec==0)flag1=1;//0.5秒执行一次程序
if((fsec==1)&&(flag1==1))//一秒钟执行一次程序
{
flag1=0;
sflag=1;
}
if(sflag)
{
;
}
}
}//主程序结束...................................................................................
//接收数据处理..................................................................................
receive()
{
uchar i,j;
uint lrc;
if((recv_buf[0]==0x3a)&(recv_buf[1]==0x01))
{
for(i=1;i<=11;i++)
{
lrc+=recv_buf[i];
}
i=lrc;
lrc=_irol_(lrc,8);
j=lrc;
lrc=0;
if((i==recv_buf[12])&(j==recv_buf[13]))
{
send_buf[1]=0x02;
send_buf[2]=0x01;
send_buf[12]=0x03;
send();
getout();
}
else
{
send_buf[1]=0x02;
send_buf[2]=0x02;
send_buf[12]=0x04;
send_buf[13]=0x00;
send();
}
}
else
{
send_buf[1]=0x02;
send_buf[2]=0x02;
send_buf[12]=0x04;
send_buf[13]=0x00;
send();
}
}
//将收到的数据送io口
getout()
{
uchar i;
restio();
outio();
for(i=2;i<=11;i++)
{
write_bit(recv_buf[i],0);
}
}
send()
{
count_r=0;
count_s=0;
SBUF=send_buf[count_s];//发送第一个数据
count_s++;
}
restio()
{
qw1=0xff;
qw2=0xff;
qw3=0xff;
qw4=0xff;
qw5=0xff;
qw6=0xff;
qw7=0xff;
qw8=0xff;
qw9=0xff;
}
//串口中断处理...................................................................................
void serial_int() interrupt 4 using 2
{
if(TI)//发送中断
{
if(count_s<max_len)
{
TI=0;
SBUF=send_buf[count_s];
count_s++;
}
else
{
count_s=0;
TI=0;
}
}
if(RI)//接收中断
{
if(count_r<(max_len-1))
{
recv_buf[count_r]=SBUF;
count_r++;
RI=0;
}
else
{
RI=0;
recv_buf[count_r]=SBUF;
receive();
return;
}
}
}
//T0中断子程序:.............................................................................
void timer0() interrupt 1 using 1
{
//T0 reroad
TH0 = 252;
TL0 = 17;
//产生秒信号
if(++msec >= 449)
{
msec=0;
if (++fsec >= 2)
{
fsec=0;
if (++sec >= 60)
{
sec=0;
if(++min >= 60)
{
min=0;
if(++hour >= 24)
{
hour=0;
}
}
}
}
}
}
/*void delay10ms(uint count)
{
uint i,j;
for(i=0;i<count;i++)
{
for(j=0;j<10000;j++);
}
}*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -