#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char const duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码
sbit wei1=P3^0; // 四位数码管控制选定
sbit wei2=P3^1;
sbit wei3=P3^2;
sbit wei4=P3^3;
sbit baoj=P3^7; //声光报警控制
sbit didi=P3^6;
sbit ST=P1^7; //AD0809采集端口控制
sbit EOC=P1^6;
sbit OE=P1^5;
sbit CLK=P1^4;
sbit qued=P1^3; //独立按键设置
sbit xiax=P1^2;
sbit shangx=P1^1;
sbit kaig=P1^0;
sbit jia=P3^4;
sbit jian=P3^5;
sbit baojd=P3^7;
#define baojd_kai baojd=0;
#define baojd_guan baojd=1;
#define duan1 wei1=0;wei2=1;wei3=1;wei4=1;
#define duan2 wei1=1;wei2=0;wei3=1;wei4=1;
#define duan3 wei1=1;wei2=1;wei3=0;wei4=1;
#define duan4 wei1=1;wei2=1;wei3=1;wei4=0;
void didikai(uint coun);
void delay(uint ms);
void didi2(uint coun);
void didi1(uint coun);
void display();
void init();
void AD();
void shangs();
void xias();
void displays();
void displayx();
uchar dianyaz,jia1;
bit baojt;
uint wenduz,shuju,shangw,xiaw;
uchar wen;
float wendu;
main()
{
jia1=0;
didi=0;
baojt=1;
shangw=80;
xiaw=40;
didi2(4);
init(); //初始化
while(1)
{
AD();
jia1++;
wenduz+=dianyaz;
if(jia1==10) //数据采集10次
{
jia1=0;
shuju=wenduz/10;
wenduz=0;
}
display(); //温度显示
if(shangx==0) //上限设置
{
didi2(2);
shangs();
}
if(xiax==0) //下限设置
{
didi2(2);
xias();
}
if(wen>xiaw) //温度大于下限,警灯开
{
baojd_kai;
}
if(wen<xiaw) //温度小于下限,警灯开关
{
baojd_guan;
}
if(wen>shangw) //温度大于上限
{
if(baojt==0)
didi=1;
else
didi=0;
}
if(kaig==0)
{
didi2(2);
baojt=~baojt;
if(baojt==1)
didikai(1);
else
didikai(3);
}
}
}
void init() //初始化
{
EA = 1; //开总中断
TMOD = 0x02; //设定定时器T0工作方式
TH0=216; //利用T0中断产生CLK信号
TL0=216;
TR0=1; //启动定时器T0
ET0=1;
ST=0;
OE=0;
}
void delay(uint ms) //延时函数
{
uint i,j;
for(i=0;i<ms;i++)
for(j=0;j<110;j++);
}
void didi1(uint coun) //蜂鸣器报警函数 1
{
uint j;
for(j=coun;j>0;j--)
{
didi=1;
delay(2);
didi=0;
delay(2);
}
}
void didi2(uint coun) //蜂鸣器报警函数2
{
uint j;
for(j=coun;j>0;j--)
{
didi=1;
delay(20);
didi=0;
delay(20);
}
}
void didikai(uint coun) //蜂鸣器开
{
uint j;
for(j=coun;j>0;j--)
{
didi=1;
delay(200);
didi=0;
delay(200);
}
}
void shangs() //上限设置
{
while(qued==1)
{
displays();
if(jia==0)
{
shangw++;
didi1(1);
while(jia==0);
}
if(jian==0)
{
shangw--;
if(shangw==65535)
shangw=0;
didi1(1);
while(jian==0);
}
}
didi2(4);
}
void xias() //下限设置
{
while(qued==1)
{
displayx();
if(jia==0)
{
xiaw++;
didi1(1);
while(jia==0);
}
if(jian==0)
{
xiaw--;
if(xiaw==65535)
xiaw=0;
didi1(1);
while(jian==0);
}
}
didi2(4);
}
void display() // 温度显示
{
float dianya,redian;
uchar ge,shi,bai,xiao;
uint shu;
dianya=((float)shuju/255.0)*5.0;
redian=dianya*4;
wendu=redian*24.21976+25.0;
shu=(wendu)*10;
bai=shu/1000%10;
shi=shu/100%10;
ge=shu/10%10;
xiao=shu%10;
wen=shi*10+ge;
duan1;
P2=duan[bai];
delay(2);
duan2;
P2=duan[shi];
delay(2);
duan3;
P2=duan[ge]+0x80;
delay(2);
duan4;
P2=duan[xiao];
delay(0);
dianya=0;
wendu=0;
redian=0;
}
void displays() //上限设置显示
{
uchar ge,shi,bai;
bai=shangw/100%10;
shi=shangw/10%10;
ge=shangw%10;
duan1;
P2=0xf6;
delay(3);
duan2;
P2=duan[bai];
delay(3);
duan3;
P2=duan[shi];
delay(3);
duan4;
P2=duan[ge];
delay(1);
}
void displayx() //下限设置显示
{
uchar ge,shi,bai;
bai=xiaw/100%10;
shi=xiaw/10%10;
ge=xiaw%10;
duan1;
P2=0xb8;
delay(3);
duan2;
P2=duan[bai];
delay(3);
duan3;
P2=duan[shi];
delay(3);
duan4;
P2=duan[ge];
delay(1);
}
void AD() //AD子程序
{
ST=0;
delay(2);
ST=1; //启动AD转换
delay(2);
ST=0;
while(EOC==0);
OE=1;
dianyaz=P0;
OE=0;
}
void t0(void) interrupt 1 using 0
{
CLK=~CLK;
}