|
#include "reg51.h"
#include "intrins.h"
sbit p24=P2^4;//数码管位控制口
sbit p25=P2^5;
sbit p26=P2^6;
sbit p27=P2^7;
sbit jdq=P2^0;//控制继电器
sbit p10=P1^0;//键控制按键抠
sbit p11=P1^1;
sbit p12=P1^2;
sbit p13=P1^3;
bit b0=1;//控制数码管的亮熄
bit b1=1;
bit b2=1;
bit b3=1;
bit a0=0;//数码管闪烁控制位
bit a1=0;//数码管闪烁控制位
unsigned char k=0;//累计按键按下次数
unsigned int d=0;//低位
unsigned int e=0;//高位
unsigned int f=0;//fx测量累计频率
unsigned int baocun=0;//保存数据
unsigned int t=0;//温度
unsigned char led5=0xfe;//灯初始位置
unsigned char code x[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
void fun()//数码管延时
{
unsigned char i;
for(i=0;i<50;i++)
;
}
void xs()//显示程序
{
P0=x[e/10];
p24=0;
fun();
p24=1;
P0=x[e%10];
p25=0;
fun();
p25=1;
P0=x[d/10];
if(b1)
p26=0;
fun();
p26=1;
P0=x[d%10];
if(b0)
p27=0;
fun();
p27=1;
}
void kongzhi()//温度控制
{
if(t
{
jdq=0;//继电器工作
}
}
void inetop1() interrupt 3//T1控制数码管闪
{
if(a0)
{
TH1=0X3C;//0.1s
TL1=0XB0;
if(a0) b0=!b0;//闪的控制
if(a1) b1=!b1;
}
else
{
TR0=0;
TR1=0;//定时计数都停止
f=(TH0*256+TL0);//取频率数据
if((f<1900)&&(f>=1540))
{
t=(f-1500)/38+40;//40~80度
}
else if((f<1540)&&(f>1520))
{
t=40;//40度
}
else if((f<1520)&&(f>=1200))
{
t=(f-1220)/30+30;//30~40度
}
else if((f<1200)&&(f>=900))
{
t=(f-930)/29+20;//20~30度?
}
else
{
t=0xff;
}
kongzhi();//比较后控制继电器
d=t%100;//低位
e=t/100;//求温度,高位
TH1=0X3c;
TL1=0Xb0;//0.1s
TH0=0X0;
TL0=0X0; //频率为0
TR0=1;
TR1=1;//为下一次计数器工作 作准备
}
}
void key() interrupt 0//键盘函数
{
p10=1;p11=1;
if(p10==0)
{k++;//按键次数累计
if(k==1)
{
a0=1;//数码管闪烁控制位
a1=0;
TR0=0;
TR1=0;//计数器停止工作
}
if(k==2)
{ k=0;
a0=1;
TR0=1;
TR1=1;
baocun=d;//保存数据
b0=1;b1=1;//数码管正常工作,按键次数清0
//修改参数保存
}
}
if(p11==0)
{//闪烁时对应数码管加1
if(a0)
{
d++;
if(d==100)
{
d=0;
}
}
}
}
void main()
{ TMOD=0X15;//方式1控制
TH0=0X0;//赋初值T0,控制数码管计时
TL0=0X0;
TH1=0X3c;//赋初值T1,控制数码管闪烁
TL1=0Xb0;
TR0=1;//启动T0,控制时间
TR1=1;//启动T1,控制数码管?
IT0=1;//选择触发方式
EX0=1;//开允许位T0
ET1=1;//开允许位T
// EX1=1;//开允许位T1
EA=1;//开总中断
for(;;)
{
xs();
}
}
徐老师,这个程序能够测温度,测量温度基本正确,20~50度误差不太大,就是退出,保存时不正确,(参数修改后不能退出到测量模式)
|
|