📄 main.c
字号:
#include <c8051f020.h>
#include <stdio.h>
#include "CPU_Init.h"
#include "RS485M.h"
#include "LCD_send.h"
#include "ZLG7290_key.h"
void LCDSend_Int(void);
void Key_Disp(void);
void UARTRX_Disp(void);
void Help_1(void);
void KeyDisp_F0(void);
void KeyDisp_KX(unsigned char pass_data);
void PASS_Disp(unsigned char pass_data);
unsigned char Sum_verify(unsigned char verify[],unsigned char ii);
void CYC_Disp(void);
unsigned char RX[10];//UART0接收数据存放数组
unsigned char TX[10];//UART0发送数据存放数组
unsigned char key; //按键键值
unsigned char pass_data;//选择的采集通道
bit ReceiveBit=0; //接收完成标志
bit key_sign=0; //按键标志
bit F0_sign=0; //F0按键标志
bit KX_sign=0; //处理通道已选标志
bit F2_sign=0; //循环采集标志
void main(void)
{
WDTCN = 0xde; //关闭看门狗
WDTCN = 0xad;
Init_Device();
LCDSend_Int();
EA=1;
DE_RE = 0;
while(1)
{
if(key_sign==1) //有按键
{
key_sign=0;
Key_Disp(); //按键处理
}
}
}
void UARTRX_Disp(void)
{
UART0_TX(TX,5);
}
void Key_Disp(void)
{
if(key==F0)
{
F0_sign=1;
KX_sign=0;
F2_sign=0;
lcd_init();
send_asc16str(0,0,"->");
send_hz(1,0,"请选择采集通道");
send_asc16str(2,16,"K1-K8:");
send_hz(4,1,"通道");
send_asc16str(12,16,"1-8");
send_asc16str(2,32,"F2:");
send_hz(3,2,"循环采集");
}
if(key==F1)
{
Help_1();
}
if(F0_sign==1&&F2_sign==0&&(key==K1||key==K2||key==K3||key==K4||key==K5||key==K6||key==K7||key==K8))
{
KX_sign=1; //单路采集模式
F2_sign=0; //选择循环采集模式
pass_data=(key%8)+(key/8)*4;
lcd_init(); //通道已选择显示
send_hz(1,0,"单路采集模式");
send_hz(1,1,"采集通道");
send_asc16str(10,16,":");
send_ascii16(12,16,pass_data+0x30);
send_asc16str(4,32,"F3->");
send_hz(4,2,"确定");
send_asc16str(4,48,"F0->");
send_hz(4,3,"返回");
}
if(F0_sign==1&&key==F2&&KX_sign==0)
{
F2_sign=1; //选择循环采集模式
KX_sign=0; //关闭通道选择
lcd_init();
send_hz(1,0,"循环采集模式");
send_asc16str(4,16,"F3->");
send_hz(4,1,"确定");
send_asc16str(4,32,"F0->");
send_hz(4,2,"返回");
}
if(KX_sign==1&& key==F3)
{
KX_sign=0; //只有再次按下F0键以后才能重新操作
F0_sign=0;
F2_sign=0;
PASS_Disp(pass_data);//通道选择确定后数据处理
}
if(F2_sign==1&& key==F3)
{
KX_sign=0; //只有再次按下F0键以后才能重新操作
F0_sign=0;
F2_sign=0;
CYC_Disp();
}
}
void LCDSend_Int(void)
{
lcd_init();
send_asc16str(0,0,"**");
send_asc16str(14,0,"**");;
send_hz(1,0,"多路采集系统");
send_asc16str(2,16,"F0:");
send_hz(3,1,"通道选择");
send_asc16str(2,32,"F1:");
send_hz(3,2,"帮助");
}
void Help_1(void) //显示帮助内容
{
lcd_init();
send_asc16str(0,0,"**");
send_asc16str(14,0,"**");;
send_hz(1,0,"按键功能定义");
send_asc16str(2,16,"F0:");
send_hz(3,1,"通道选择");
send_asc16str(2,32,"F2:");
send_hz(3,2,"选择确定");
send_asc16str(2,48,"K1-K8:");
send_hz(4,3,"通道");
}
void PASS_Disp(unsigned char pass_data)
{
bit exit_sign=0; //数据处理结束标志
unsigned char TX_time=0;//数据重发次数计数
unsigned char Verify_data=0;//接收和检验值
unsigned char Verify_ET=0; //和校验错误发生次数
unsigned char anew_TX[3]={0x01,0x00,0x00};//要求从机重发指令数组
unsigned char send_Num=0; //条码显示计数
unsigned char delay_num=0; //超时计数
bit RX_sign=0;//接收数据是否为第一次数据标志
unsigned int i;//定时控制变量
lcd_init();
send_asc16str(2,0,"->");
send_hz(2,0,"采集通道");
send_asc16str(12,0,":");
send_ascii16(13,0,pass_data+0x30);
send_hz(0,1,"系统处理中请稍后");
TX[0]=0x01; //从机地址
TX[1]=0x01; //数据采集命令字
TX[2]=0x02; //数据长度
TX[3]=pass_data-1;//采集通道值(0-7)
TX[4]=pass_data-1;//和检验
UART0_TX(TX,5);
while(exit_sign==0)
{
for(i=65535;i>0;i--);
if(ReceiveBit==0)
{
UART0_TX(TX,5);
}
if(RX_sign==0)
{
send_asc16str(send_Num,32,">");//动态显示系统处理状态">>>>>>>>>>>>>>>>"
send_Num++;
if(send_Num==15)
{
send_Num=0;
send_asc16str(0,32," ");
delay_num++;
if(delay_num==3)
{
delay_num=0;
lcd_init();
send_hz(2,1,"通讯超时");
send_asc16str(0,32,"->");
send_hz(1,2,"请检查通信网络");
exit_sign=1;
}
}
}
if(ReceiveBit==1) //接收到一帧数据
{
ReceiveBit=0; //清除接收完成标志
if(RX[1]==0) //从机要求重发数据
{
REN0=1;//重新允许接收
UART0_TX(TX,5);
TX_time++;
if(TX_time==3)//重发次数超过三次报警
{
TX_time=0;
lcd_init();
send_hz(1,1,"从机通讯错误");
send_asc16str(0,32,"->");
send_hz(1,2,"请检查通讯线路");
exit_sign=1;
}
}
else
{
if(RX[1]==1)
{
Verify_data=Sum_verify(RX+3,4);//对接收的数据(一字节通道字节数据)进行和校验
if(Verify_data==RX[7]) //和校验正确,显示采集数值
{
if(RX_sign==0)//第一次数据发送
{
RX_sign=1;
lcd_init();
send_asc16str(0,0,">> <<");
send_hz(1,0,"采集通道");
send_asc16str(10,0,":");
send_ascii16(12,0,RX[3]+0x30);
send_hz(1,2,"采集值");
send_asc16str(8,32,":");
send_ascii16(9,32,RX[4]+0x30);
send_ascii16(10,32,'.');
send_ascii16(11,32,RX[5]+0x30);
send_ascii16(12,32,RX[6]+0x30);
send_ascii16(13,32,'V');
}
else
{
send_ascii16(12,0,RX[3]+0x30);
send_ascii16(9,32,RX[4]+0x30);
send_ascii16(11,32,RX[5]+0x30);
send_ascii16(12,32,RX[6]+0x30);
}
for(i=65535;i>0;i--);
TX[0]=0x01; //从机地址
TX[1]=0x01; //数据采集命令字
TX[2]=0x02; //数据长度
TX[3]=pass_data;//采集通道值
TX[4]=pass_data;//和检验
UART0_TX(TX,5);
REN0=1;//重新允许接收
if(key_sign==1) //有按键
exit_sign=1;
}
else //和校验错误
{
REN0=1;//重新允许接收
UART0_TX(anew_TX,3);//请求从机重新发送上一次数据
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -