📄 main.c
字号:
/****************************************/
/* Copyright (c) 2004, 通信工程学院 */
/* All rights reserved. */
/****************************************/
#include "head.h"
void ClearR_bufR_data(); // 清除r_buf和r_data函数
void RecOverDeal(); // 串口中断处理函数
void TimeOverDeal(); // 超时处理函数
void CheckErrorDeal(); // 校验错误处理函数
void RecRightDeal(); // 接收正确处理函数
xdata uchar Flag_Data = 0 ; //数据处理标志位
xdata uchar FLag_StartRec = 0 ; //开始接受数据标志位
xdata uchar Flag_RecOver = 0 ; //接收结束标志位
xdata uchar Flag_TimeOver = 0 ; //接收超时标志位
xdata uchar Flag_CheckError = 0 ; //校验错误标志位
xdata uchar Flag_CheckRight = 0 ; //接收正确标志位
xdata uchar gCount = 0 ;
xdata uchar r_buf[11]; // 1开始字节"$",1长度字节LEN,
// 7字节数据,1校验和字节,
// 1 结束字节"*"
xdata uchar r_data[7];
xdata ulong RecData = 0 ;
xdata uchar TCount = 0 ;
xdata uchar Time0Sel = 0 ;
/* 定时器0中断服务子程序 */
void timer() interrupt 1 using 2
{
if (!Time0Sel)
{
if (!Flag_RecOver)
{
Flag_TimeOver = 1; //超时100ms
Flag_CheckError = 0;
Flag_CheckRight = 0;
}
TH0 = -100000/256;
TL0 = -100000%256;
ET0 = 0;
TR0 = 0;
}
else
{
Time0Sel = 0;
P1_0 = 0; // 开关控制信号清零,形成脉冲
ET0 = 1;
TR0 = 1;
}
}
void main(void)
{
ClearR_bufR_data();
P1_0 = 0;
Time0Sel = 0;
/* 11.0592MHz下,设置串行口2400波特率,工作方式1
8位数据位,1位停止位,无奇偶校验,*/
TMOD = 0x21;
SCON = 0xb8;
PCON = 0x00;
/* Timer1 定时器1 */
TL1 = 0xf4;
TH1 = 0xf4;
TR1=1;
/* Timer0 */
PT0 = 1;
TH0 = -100000/256; //100ms
TL0 = -100000%256;
IE = 0x90;
while (1)
{
if (Flag_RecOver)
{
RecOverDeal();
Flag_RecOver = 0;
}
if (Flag_TimeOver)
{
TimeOverDeal();
Flag_TimeOver = 0;
RI = 0;
}
if (Flag_CheckError)
{
CheckErrorDeal();
Flag_CheckError = 0;
RI = 0;
}
if (Flag_CheckRight)
{
RecRightDeal();
Flag_CheckRight = 0;
RI = 0; //打开接收中断
}
}
}
/* 串口中断服务子程序 */
void serial ( ) interrupt 4 using 1
{
/* 判断是否收到字符'$',其数值为0x24,置开始接收标志位*/
if ((!FLag_StartRec) && (SBUF == 0x24))
{
FLag_StartRec = 1;
/* 启动定时器0,计算超时*/
TH0 = -100000/256;
TL0 = -100000%256;
ET0 = 1;
TR0 = 1;
}
if ((FLag_StartRec) && (gCount <11))
{
r_buf[gCount ] = SBUF;
gCount ++;
}
/* 判断是否收到字符'*',其数值为0x2A,置接收完成标志位*/
if ((r_buf[gCount -1] == 0x2A)||(gCount == 11))
{
r_buf[gCount -1] == 0x2A;
Flag_RecOver = 1; //一帧接收完毕
gCount = 0;
FLag_StartRec = 0;
/* 关闭定时器0 */
ET0 = 0;
TR0 = 0;
}
else
{
RI = 0 ;
}
}
void ClearR_bufR_data(void)
{
uchar xdata k ;
for (k=0;k++;k<11)
{
r_buf[k] = 0;
}
for (k=0;k++;k<7)
{
r_data[k] = 0;
}
}
/* 接收完成处理函数*/
void RecOverDeal(void)
{
uchar xdata j = 0;
uchar xdata len = 0;
uchar xdata CheckSum =0 ;
len = r_buf[1];
for ( j=0;j++;j<len)
{
r_data[j] = r_buf[j+2];
CheckSum = CheckSum + r_data[j];
}
if (CheckSum == r_buf[len+2])
{
Flag_CheckRight = 1; //接收正确
Flag_CheckError = 0;
Flag_TimeOver = 0;
RecData =0;
for ( j=0;j++;j<r_data[1])
{
RecData =r_data[j] + RecData*10;
}
}
else
{
Flag_CheckError = 1; //校验错误
Flag_CheckRight = 0;
Flag_TimeOver = 0;
}
}
/* 超时处理函数*/
void TimeOverDeal(void)
{
ClearR_bufR_data();
FLag_StartRec = 0;
gCount = 0;
SBUF = TIMEOVER; //回送超时响应字节
while ( TI ==0 );
TI =0 ;
}
/* 校验错误处理函数*/
void CheckErrorDeal(void)
{
ClearR_bufR_data();
SBUF = CHECKERROR; //回送校验错误响应字节
while ( TI ==0 );
TI =0 ;
}
/* 接收正确处理函数*/
void RecRightDeal(void)
{
unsigned char xdata i,j,k;
unsigned long xdata tmp;
unsigned char xdata D1,D2,D3 = 0;
ClearR_bufR_data();
TCount = 0;
/* 产生开关控制信号*/
tmp = RecData;
if (tmp/V_2_19 == 1)
{
D3 = D3 + 0x08;
tmp = tmp%V_2_19;
}
else if (tmp/V_2_18 == 1)
{
D3 = D3 + 0x04;
tmp = tmp%V_2_18;
}
else if (tmp/V_2_17 == 1)
{
D3 = D3 + 0x02;
tmp = tmp%V_2_17;
}
else if (tmp/V_2_16 == 1)
{
D3 = D3 + 0x01;
tmp = tmp%V_2_16;
}
else if (tmp/V_2_15 == 1)
{
D2 = D2 + 0x80;
tmp = tmp%V_2_15;
}
else if (tmp/V_2_14 == 1)
{
D2 = D2 + 0x40;
tmp = tmp%V_2_14;
}
else if (tmp/V_2_13 == 1)
{
D2 = D2 + 0x20;
tmp = tmp%V_2_13;
}
else if (tmp/V_2_12 == 1)
{
D2 = D2 + 0x10;
tmp = tmp%V_2_12;
}
else if (tmp/V_2_11 == 1)
{
D2 = D2 + 0x08;
tmp = tmp%V_2_11;
}
else if (tmp/V_2_10 == 1)
{
D2 = D2 + 0x04;
tmp = tmp%V_2_10;
}
else if (tmp/V_2_9 == 1)
{
D2 = D2 + 0x02;
tmp = tmp%V_2_9;
}
else if (tmp/V_2_8 == 1)
{
D2 = D2 + 0x01;
tmp = tmp%V_2_8;
}
else if (tmp/V_2_7 == 1)
{
D1 = D1 + 0x80;
tmp = tmp%V_2_7;
}
else if (tmp/V_2_6 == 1)
{
D1 = D1 + 0x40;
tmp = tmp%V_2_6;
}
else if (tmp/V_2_5 == 1)
{
D1 = D1 + 0x20;
tmp = tmp%V_2_5;
}
else if (tmp/V_2_4 == 1)
{
D1 = D1 + 0x10;
tmp = tmp%V_2_4;
}
else if (tmp/V_2_3 == 1)
{
D1 = D1 + 0x08;
tmp = tmp%V_2_3;
}
else if (tmp/V_2_2 == 1)
{
D1 = D1 + 0x04;
tmp = tmp%V_2_2;
}
else if (tmp/V_2_1 == 1)
{
D1 = D1 + 0x02;
tmp = tmp%V_2_1;
}
else if (tmp/V_2_0 == 1)
{
D1 = D1 + 0x01;
}
P1_0 = 1; // 使能开关控制信号输出
/* 写20位开关控制信号,D3取前4位 */
KAIGUAN1 = D1;
KAIGUAN2 = D2;
KAIGUAN3 = D3;
Time0Sel = 1;
/* Timer0 */
PT0 = 1;
TH0 = -500000/256; //500ms, 开关控制脉冲宽度
TL0 = -500000%256;
/* 启动定时器0,计算超时*/
ET0 = 1;
TR0 = 1;
// 延时几百毫秒
for (i=0;i++;i<1000)
for (j=0;j++;j<3000)
{
k=0;
}
SBUF = RECRIGHT; //回送接收正确响应字节
while ( TI ==0 );
TI =0 ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -