/*
24路温度巡检仪:(测温范围-50~+80°C)
功能概述:
依次循环检测并显示24路温度,查看各路温度,设置报警温度
操作规则:
开机自动从1-24路循环检测温度。按按键3,进入手动查看功能。每按一次按键1立即增加显示下一路温度
按按键2,立即减少显示上一路温度,若停止按键,将一直显示当前路号的温度,再按按键3,再次进入自动循环显示
设置报警温度:按按键4,进入报警温度设置。进入温度设置后,首先按按键1,
设置报警温度的正负,再按按键4确定温度正负,并进入报警温度数值设置,按按键1
增加数值,按按键2减少数值,确定数值后,按按键4确定报警温度设置并退出设定。
*/
#include"reg52.h"
#include"lcd.h"
#include<intrins.h>
#define u16 unsigned int
#define u8 unsigned char
#define AD_Data P1;
//u8 code wei[]={}
sbit Button1=P3^5;//按键端口定义
sbit Button2=P3^6;
sbit Button3=P3^7;
sbit Button4=P2^3;
sbit Co_A=P0^1;//8选1选择器编码输出端口定义
sbit Co_B=P0^2;
sbit Co_C=P0^3;
sbit ST=P3^0;
sbit OE=P3^1;
sbit EOC=P3^2;//AD0809 转换结束口
sbit CLK=P3^3;//AD0809 时钟输入口
sbit E1=P0^4;//AD0809 8路选择编码输入端口和各8路选择器74151使能位
sbit E2=P0^5;
sbit E3=P0^6;
sbit ALE=P3^4;
sbit SPK=P2^7;
//sbit AD_Data = P1;
u8 code wei[] = {0x60,0x50,0x30};
uchar code_table2[]={0x00,0x07,0x05,0x07,0x00,0x00,0x00,0x00};
// 函数声明
void Send_Byte(u8 byte);
void Delay_ms(u16 z);
void delay();
void Led_Display(u8 Wei, u8 number, u8 point);
void Display_Temp(float number);
void Display_Road(u8 number);
void ADC_Init(void);
float ADC_Read(u8 road);
void Timer_Init();
void Set_Road();
int Set_Temp();
int Key_Get();
void Init();
void Alarm(float t);
void Delay10ms(void);
int count,sflag,ssflag,Road, counter,i,j,k,key,rflag;
float Temp_Set,Temp_Get;
// 主函数
void main()
{
Init();
Timer_Init();
j=0;
k=0;
while(1){
if(sflag==1){//显示当前温度的正负
LcdWriteCom(0xc3);
LcdWriteData('-');
}
else{
LcdWriteCom(0xc3);
LcdWriteData('+');
}
key=Key_Get();
if(key==3){
//key=0;
j=1;
rflag=1;
Set_Road();
}
if(key==4){
Temp_Set=0;
Set_Temp();
}
//Set_Road();//设置路数
Display_Road(Road);//显示路数
Temp_Get=ADC_Read(Road);
Display_Temp(Temp_Get);//显示温度
Alarm(Temp_Get);
}
}
void Alarm(float t)
{
if(((int)t>=Temp_Set)&&(ssflag==sflag)){
SPK=~SPK;
Delay_ms(50);
SPK=~SPK;
}
}
void Timer_Init()
{
TMOD=0x11; //定时器1,0模式设置
TH0=(65536-24)/256;
TL0=(65536-24)%256;
TH1 = (65536 - 50000)/256;//定时50ms
TL1 = (65536 - 50000)%256;
EA=1; //全局中断允许位
ET0=1; //打开T0中断
ET1=1;//打开T1中断
TR0=1; //定时器0运行控制位,置1启动定时器0
TR1=1;//定时器1运行控制位,置1启动定时器1
}
//T0定时器中断给ADC0809提供时钟信号
void timer0() interrupt 1 //中断服务程序
{
TH0=(65536-24)/256;
TL0=(65536-24)%256;
CLK=~CLK;
}
//T1定时器中断,提供定时
void timer1() interrupt 3 //中断服务程序
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
counter++;
if((counter==100))//5s
{
counter=0;
if(rflag==0)//模式标志位
Road++;
if(Road==25)
{
Road=1;
}
}
}
/*******************************************************************************
* 函数名 : KeyGet()
* 函数功能 :获取按键的值
* 输入 : v
* 输出 : 无
*******************************************************************************/
void Set_Road()
{
//ET1=0;//关掉中断1
while(1){
key=Key_Get();
if(key==3){
//key=0;
j++;
if(j%2==0){
rflag=0;
j=0;
ET1=1;
break;
}
}
if(key==1)//按键1被按下
{
//key=0;
Road++;
if(Road==25)
Road=1;
}
if(key==2)//按键2被按下
{
//key=0;
if(Road==1)
Road=24;
else
Road--;
}
if(sflag==1){//显示当前温度的正负
LcdWriteCom(0xc3);
LcdWriteData('-');
}
else{
LcdWriteCom(0xc3);
LcdWriteData('+');
}
Display_Road(Road);
Temp_Get=ADC_Read(Road);
Display_Temp(Temp_Get);
Alarm(Temp_Get);
}
}
//设置报警温度
int Set_Temp()
{
i=1;
while(1)
{
key=Key_Get();
if(key==1)//设置正负0为正,1为负。或者增加报警温度
{
if(i==1){//设置正负
ssflag++;
ssflag%=2;
if(ssflag==0){
LcdWriteCom(0xc3);
LcdWriteData('+');
}
else
{
LcdWriteCom(0xc3);
LcdWriteData('-');
}
}
if(i==0)
{
Temp_Set++;
}
}
if(key==2)//减小报警温度。
{
if(Temp_Set!=0)
Temp_Set--;
}
if(key==4)//确认温度设置或正负设置
{
if(i==1)
i=0;//确认设置温度的正负
else{
i=1;
key=0;
break;
}
}
Display_Temp(Temp_Set);
}
return 0;
}
int Key_Get()
{
if((P3&0xe0)!=0xe0)
{
//delay();
if(Button1==0){
while(!Button1);//消抖
return 1;
}
if(Button2==0){
while(!Button2);//消抖
return 2;
}
if(Button3==0){
while(!Button3);//消抖
return 3;
}
}
if(!Button4){
//delay();
if(!Button4){
while(!Button4);//消抖
return 4;
}
}
else
return 0;
}
/*******************************************************************************
* 函 数 名 : Delay10ms
* 函数功能 : 延时函数,延时10ms
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void Delay10ms(void) //误差 0us
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}
/*******************************************************************************
* 函 数 名 : Init()
* 函数功能 : 初始化函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void Init(){
counter=0;
Road=1;
SPK=0;
rflag=0;
Temp_Set=80;
ADC_Init();
LcdInit();
LcdWriteCom(0x40);
for(count=0;count<8;count++)
{
LcdWriteData(code_table2[count]);
}
LcdWriteCom(0xca); //写地址 c7表示初始地址
LcdWriteData(0x00);
LcdWriteCom(0xcb);
LcdWriteData('C');
}
/*******************************************************************************
* 函 数 名 : LCD_display()
* 函数功能 : LCD显示函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void Display_Road(u8 number)
{
LcdWriteCom(0x81);
LcdWriteData('N');
LcdWriteCom(0x82);
LcdWriteData('o');
LcdWriteCom(0x83);
LcdWriteData(':');
LcdWriteCom(0x84);
LcdWriteData('0'+number/10); //百位
LcdWriteCom(0x85);
LcdWriteData('0'+number%10); //十位
}
/*******************************************************************************
* 函 数 名 : display_r(uchar k)
* 函数功能 : 显示温度记录值
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void Display_Temp(float number){
int zheng, xiao;
xiao=((int)(number*100)%100);
zheng=(int)number;
LcdWriteCom(0xc4);
LcdWriteData('0'+zheng/100); //百位
LcdWriteCom(0xc5);
LcdWriteData('0'+zheng%100/10); //十位
LcdWriteCom(0xc6);
LcdWriteData('0'+zheng%10); //个位
LcdWriteCom(0xc7);
LcdWriteData('.');//小数点
LcdWriteCom(0xc8);
LcdWriteDa
评论1
最新资源