|
本帖最后由 huq2012 于 2013-4-18 10:36 编辑
我刚学单片机,想用个电饭锅做个定时煮沸锅,我电路图设想如下,感应器用电压力锅的感应器,把感应器装在电饭锅锅底,加水加热。我测量到在常温下是约80K电阻,在水开时约7.5K电阻。根据这特性,我设想利用2051内的比较器输出,水开后开始按设定好的时间倒计时煮汤,到时停止工作。我回来就可以有汤喝了。
失业在家终于把这做好了,感觉不是很理想,程序还是修改坛友的定时器。想做个工作模式还不懂怎样编程,只好把这端口暂用来做温度检测输出。这程序我用关闭总中断后几分钟,总是显示乱码,但输出不影响。只好把TR0中断关了才显示正常。请各位帮我分析下是什么原因。
煮沸定时器
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define leddata P3 //共阳p3口,P3.0=a......P3.7=h
sbit enshifen=P1^6; //定义十分位数码管阳极
sbit engefen=P1^7; //定义个分位数码管阳极
sbit typesw=P1^5; //定义功能键
sbit upkey=P1^4; //定义加键
sbit runkey=P1^3; //定义运行倒计时键
sbit run=P1^2; //定义控制用电器的继电器控制脚
sbit ttsacn=P3^6; //温度检测口
uchar code table[]={
0xc0,0xf9,0x64,0x30,
0x59,0x52,0x42,0xf8,
0x40,0x50,}; //共阳数码管字符表0-9
uchar fen;
uchar count=0; //定义100ms计数次数变量,count=20即到1S
uchar miao=60; //定义秒初值,减到0分就减1
uchar tt; //定义检测常数
void delay1ms(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
} //延时子程序,延时Z个ms
void display (uchar shifen,uchar gefen,uchar cishu) //数码管动态扫描程序
{ uchar x;
for(x=cishu;x>0;x--)
{
if(shifen!=0)
{
enshifen=0;
leddata=table[shifen];
delay1ms(2);
enshifen=1; //显示十位1ms左右
}
else
enshifen=0;
leddata=0x4e;
delay1ms(2);
enshifen=1;
engefen=0;
leddata=table[gefen];
delay1ms(2);
engefen=1; //显示个位1ms左右
}
}
void init() //定时器设置打开,暂未开总中断,当EA=1时候就会产生定时器中断。
{
TMOD=0x01;
TH0=(65536-46080)/256;
TL0=(65536-46080)%256; //预装初值定时50MS
ET0=1; //开定时器T0
}
void timer0() interrupt 1
{
TH0=(65536-46080)/256;
TL0=(65536-46080)%256; //重装初值
count++; //用于100MS定时的计数单元加1
if(count==10) //1s定时到,秒减1
{
count=0; // 用于50MS定时的计数单元归零
miao--;
if(miao==0) //一分钟到
{
miao=60; //秒重置60
fen--; //分减1
}
}
}
void main()
{
init();
fen=1; //上电先显示F1分钟
run=1;//先关闭用电器继电器
tt=200;
while(1)
{
display((fen/10),(fen%10),1); //显示
if(upkey==0) //加1
{
delay1ms(10); //按键防抖 ,再检测
if(upkey==0)
fen++;
if(fen==16)
fen=1;
display((fen/10),(fen%10),50); //调用显示程序,用于延时
}
if(ttsacn==0)
{
tt--;
}
if(tt==0)
{
EA=1; //开总中断
typesw=0;
}
if(runkey==0) //启动倒计时
{
delay1ms(10); //按键防抖 ,再检测
if(runkey==0)
{
run=0; //开用电器继电器
TR0=1; //开定时器T0中断
tt=200;
ttsacn=1; //复位温度检测口
}
display((fen/10),(fen%10),100); //调用显示程序,用于延时,这样可以消除闪烁,还能自减
}
if(fen==0){EA=0;TR0=0;run=1;} //时间到0,输出控制,关闭总中断,,关闭用电器继电器
}
}
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|