📄 chunling.c
字号:
#pragma src(aa.inc)
#include <reg52.h>
#include <main.h>
#include <zlg7289A.h>
extern uchar ReadKey();
extern void write24c16(uint address,uchar ddata);
extern void LedShow(uchar position,uchar dfuction,uchar ddata,uchar dp);
extern uchar Read_TLC0834(uchar channel);
extern void SingleCommand(uchar command);
extern void page_rd(uint firstrd_ad,uint count,uchar *firstwr_ad);
//单片机与MAX813L之间的引脚定义
sbit WDI_813L=P1^1;
//单片机与蜂鸣器之间的引脚定义
sbit CONTROL_SPEAKER=P2^4;
//三通道上下限参数值存储变量
uchar data limit_data[6]; // tempeture_up; 温度上限
//uchar data tempeture_down; 温度下限
// uchar data preasure_up; 压力上限
// uchar data preasure_down; 压力下限
//uchar data flux_up; 流量上限
//uchar data flux_down; 流量下限
uchar data tempeture_variable; //存储实时的温度值
uchar data preasure_variable; //存储实时的压力值
uchar data flux_variable; //存储实时的流量值
uchar data qianwei; // 千位 电压值在0-5v之间
uchar data baiwei; // 百位
uchar data shiwei; // 十位
uchar data gewei; // 个位
float data transform_value=(5/256)*1000; // (5v/256)×测试的值×1000倍再取整数部分用于显示 一位代表的电压值的一千倍
bit status=0 ; //0=设置,1=测量
uchar data realtime_channel=0; //实时通道数 0-2
bit set_up_down_sign=0; //设置上下限标志 =0 下限 =1上限
uchar data set_position=3 ; //设置时的位置 从千位开始设置
uchar data waring_status; //报警状态 低六位 分别为D0:温度下限报警 D1:温度上限报警
// D2:压力下限报警 D3:压力上限报警D4:流量下限报警D5: 流量上限报警
/////////////////////////////////////////////////////////////////////////////////////
void delay_ms(uint T_ms) //毫秒级延时子程序
{
uint i,j;
for(j=0;j<T_ms;j++)
{
for(i=0;i<100;i++);
}
}
///////////////////////////////////////////////////////////////////////////////////
void SerialPortInit() //串口初始化
{
SCON=0xD0; //1100 0000 串口方式3 允许接收
PCON=0x00;
TMOD=0x20; //定时器T1 0010 0000
TH1=0xFD; //波特率设为9600
TL1=0xFD;
TR1=1; //允许定时器T1记数
}
//////////////////////////////////////////////////////////////////////////////////////
void Initialize() //本机初始化
{
uchar *read_data;
uchar j=0;
uint i;
SerialPortInit(); //串口初始化
SingleCommand(ResetClearCommand); // 复位ZLG7289,清除闪烁和消隐属性
LedShow(7,DownDataCom_1,0x0A,0); //在通道处显示“A” 外形和“R”一样
LedShow(6,DownDataCom_1,0x0E,0); //在 数据(千位)处显示“E”
LedShow(5,DownDataCom_1,0x0A,0); //在数据(百位)处显示“A”
LedShow(4,DownDataCom_1,0x0D,0); //在数据(十位)处显示“D”
LedShow(3,DownDataCom,0x33,0); //在数据(个位)处显示“Y”
delay_ms(5000);
page_rd(0,3,read_data); //读取温度的上下限数据
if(*read_data==0xAA)
{
limit_data[0]=0;limit_data[1]=0;
}
else
{
limit_data[0]=*(++read_data);limit_data[1]=*(++read_data);
}
page_rd(1,3,read_data); //读取压力的上下限数据
if(*read_data==0xAA)
{
limit_data[2]=0;limit_data[3]=0;
}
else
{
limit_data[2]=*(++read_data);limit_data[3]=*(++read_data);
}
page_rd(2,3,read_data); //读取流量的上下限数据
if(*read_data==0xAA)
{
limit_data[4]=0;limit_data[5]=0;
}
else
{
limit_data[4]=*(++read_data);limit_data[5]=*(++read_data);
}
i=limit_data[0]*transform_value;
qianwei=i/1000;
baiwei=(i/100)%10;
shiwei=(i/10)%10;
gewei=i%10;
LedShow(5,DownDataCom_0,0,1); //显示通道"0." 温度通道 下限
LedShow(4,DownDataCom_0,qianwei,0); //显示千位
LedShow(3,DownDataCom_0,baiwei,0); //显示百位
LedShow(2,DownDataCom_0,shiwei,0); //显示十位
LedShow(1,DownDataCom_0,gewei,0); //显示个位
LedShow(0,DownDataCom,4,0); //设置灯点亮
}
///////////////////////////////////////////////////////////////////////////////
void main()
{
uint i;
uchar symbol,j;
uchar bsbuf;
Initialize();
do{
if(KEY_ZLG7289A==0)
{
symbol = ReadKey(); // 读出按键的值
switch(symbol)
{
case(7): // 检测到按下 输入键 ENTER
if(status==0) //为测试时 enter才有作用
{ if(set_up_down_sign==1)
{
limit_data[realtime_channel*2+1]=(uchar)((qianwei*1000+baiwei*100+shiwei*10+gewei)/ transform_value);
write24c16(realtime_channel*256,0x55);
write24c16(realtime_channel*256+8,limit_data[realtime_channel*2]);
write24c16(realtime_channel*256+16,limit_data[realtime_channel*2]);
}
else
{
limit_data[realtime_channel*2]=(uchar)((qianwei*1000+baiwei*100+shiwei*10+gewei)/ transform_value);
set_up_down_sign=1;
}
if(realtime_channel==2&&set_up_down_sign==1)
{
realtime_channel=0;set_up_down_sign=0;
}
else if(realtime_channel<2&&set_up_down_sign==1)
{
realtime_channel++;set_up_down_sign=0;
}
}
while(KEY_ZLG7289A==0);
break;
case(15): // 检测到按下 测量键 MEASURE
LedShow(0,DownDataCom,0x20,0); //测量灯点亮
status=1;//处于测量状态
while(KEY_ZLG7289A==0);
break;
case(23): // 检测到按下 右移键 ->
if(status==0) //设置状态才有作用
{
if(set_position>1)
{
set_position--;
}
else
{
set_position=3; //从千位开始重设
}
}
while(KEY_ZLG7289A==0);
break;
case(31): // 检测到按下 减少键 -
if(status==0) //处于设置状态 改变位置处的值大小
{
switch(set_position)
{
case(3):
if(qianwei>=1) //千位
{
qianwei--;
}
LedShow(4,DownDataCom_0,qianwei,0); //显示千位
break;
case(2): //百位
if(baiwei>=1)
{
baiwei--;
}
LedShow(3,DownDataCom_0,baiwei,0); //显示百位
break;
case(1): //十位
if(shiwei>=1)
{
shiwei--;
}
LedShow(2,DownDataCom_0,shiwei,0); //显示十位
break;
case(0): //个位
if(gewei>=1)
{
gewei--;
}
LedShow(1,DownDataCom_0,gewei,0); //显示个位
break;
default: break;
}
}
else //处于测试时改变通道号
{
if(realtime_channel>1)
{
realtime_channel--;
}
else
{
realtime_channel=2; //从二通道开始
}
LedShow(0,DownDataCom,0x20,0); //测量灯点亮
}
while(KEY_ZLG7289A==0);
break;
case(39): // 检测到按下 增加键 +
if(status==0) //处于设置状态 改变位置处的值大小
{
switch(set_position)
{
case(3):
if(qianwei<=5) //千位
{
qianwei++;
}
LedShow(4,DownDataCom_0,qianwei,0); //显示千位
break;
case(2): //百位
if(baiwei<=9)
{
baiwei++;
}
LedShow(3,DownDataCom_0,baiwei,0); //显示百位
break;
case(1): //十位
if(shiwei<=9)
{
shiwei++;
}
LedShow(2,DownDataCom_0,shiwei,0); //显示十位
break;
case(0): //个位
if(gewei<=9)
{
gewei++;
}
LedShow(1,DownDataCom_0,gewei,0); //显示个位
break;
default: break;
}
}
else //处于测试时改变通道号
{
if(realtime_channel>2) //?????
{
realtime_channel++;
}
else
{
realtime_channel=2; //从二通道开始
}
}
LedShow(0,DownDataCom,0x20,0); //测量灯点亮
while(KEY_ZLG7289A==0);
break;
case(47): // 检测到按下 设置键 OPTION
LedShow(0,DownDataCom,0x40,0); //设置灯点亮
status=0;
while(KEY_ZLG7289A==0);
break;
default: break;
}
}
else
{
// 没有按键按下
if(status==0) //处于设置状态
{
}
else if(status==1) //处于测量状态
{
switch(realtime_channel)
{
case(0):
tempeture_variable=Read_TLC0834(realtime_channel);
i=tempeture_variable;
break;
case(1):
preasure_variable=Read_TLC0834(realtime_channel);
i= preasure_variable;
break;
case(2):
flux_variable=Read_TLC0834(realtime_channel);
i=flux_variable;
break;
default: break;
}
i=i*transform_value;
qianwei=i/1000;
baiwei=(i/100)%10;
shiwei=(i/10)%10;
gewei=i%10;
LedShow(5,DownDataCom_0,realtime_channel,1); //显示通道"*." 温度通道 下限
LedShow(4,DownDataCom_0,qianwei,0); //显示千位
LedShow(3,DownDataCom_0,baiwei,0); //显示百位
LedShow(2,DownDataCom_0,shiwei,0); //显示十位
LedShow(1,DownDataCom_0,gewei,0); //显示个位
if(limit_data[realtime_channel*2]>i) //低于下限报警
{
CONTROL_SPEAKER=0; //
LedShow(0,DownDataCom,0x10|0x20,0); //下限报警灯点亮
}
else if(limit_data[realtime_channel*2+1]<i) //高于上限报警
{
CONTROL_SPEAKER=0;
LedShow(0,DownDataCom,0x8|0x20,0); //上限报警灯点亮
}
}
}
if(RI==1) //判断接收中断标志
{
bsbuf=SBUF;
RI=0;
if(bsbuf==0xAA) // 向上位机发送实时测量结果和报警状态
{
if(TI==1){;}
TI=0;
SBUF=tempeture_variable; //发测量结果
if(TI==1){;}
TI=0;
SBUF=preasure_variable;
if(TI==1){;}
TI=0;
SBUF=flux_variable;
if(TI==1){;}
TI=0;
break;
if(TI==1){;}
TI=0; //清发送标志
SBUF= waring_status; //发报警状态
if(TI==1){;}
TI=0;
}
else if(bsbuf==0x55)//向上位机发送设置的上下限报警值
{
for(j=0;j>=5;j--)
{
SBUF=limit_data[j];
if(TI==1){;}
TI=0;
}
}
}
}while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -