#include<reg52.h> #define uint unsigned int #define uchar unsigned char sbit P0_1=P0^1; sbit P0_0=P0^0; sbit P0_2=P0^2; sbit P1_4=P1^4; sbit K1=P3^2; sbit K2=p3^4; //sbit K1=P3^6; //sbit K2=P3^7; uchar aa,bb; void main() { P1_4=0; aa=0; bb=0; TMOD=0x01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1; ET0=1; TR0=1; while(1) { if(K1==0) { P1_4=0; P0_0=0; P0_1=0; bb=8; } if((aa==100)&&(bb==8)) { aa=0; P0_1=1; P0_2=0; bb=0; } if(K2==0) { P1_4=0; P0_0=1; P0_2=1; } } } void timer0() interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; aa++; }
以上是程序:
以下是实际烧写的过程:(我的板子是:51hei-5型,stc89c52的单片机,晶振12MHZ)
接通电源——(按键1按下——1、2号灯亮——延时5秒——2号灯灭3号灯亮——按键2按下——1、3号灯灭)括号内循环执行,
当我再一次按按键1执行下一个周期循环的时候,本应延时5秒时间却变乱了(从1秒到12秒都出现过),
但是如果每次在按按键1之前先按一下复位键的话,它就会每一次都是5秒,
按照道理讲是不该出现这种问题的:我考虑到会不会是因为T0即作定时/中断用,又做按键开关用,对定时时间有会不会有影响,故有将两个按键开关更改端口,可是结果是一样的,运行的时候,只要在每个周期结束后不按复位键的话,它仍然不会固定是5秒。
求哪位热心人帮忙指点指点哪能里出问题了?会不会是编译器的问题或者是线路板问题?
十分感谢!
小李致上!
#include<reg52.h> #define uint unsigned int #define uchar unsigned char sbit P0_1=P0^1; sbit P0_0=P0^0; sbit P0_2=P0^2; sbit P1_4=P1^4; sbit K1=P3^2; sbit K2=p3^4; //sbit K1=P3^6; //sbit K2=P3^7; uchar aa,bb; void main() { P1_4=0; aa=0; bb=0; TMOD=0x01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1; ET0=1; TR0=1; while(1) { if(K1==0) {P1_4=0; P0_0=0; P0_1=0; bb=8; } if(aa==100) {aa=0; if(bb==8) { P0_1=1; P0_2=0; bb=0; } } if(K2==0) { P1_4=0; P0_0=1; P0_2=1; } } } void timer0() interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; aa++; }
程序写的太糙,不够规矩。
我给你个思路。如果是要解决两个开关控制LED的点亮和延时的问题。
定时器程序 比如 设计成0.25mS一次的循环。每次激活判断 开关电平是否拉低(即开关按下)。短延时,消颤,再次确认判断。确认,置2个标志位。A 控制 定时器里面 打开 计数。B控制主程序里 开始动作
定时器里 如果A=真,开始每0.25mS计数1次。到达5S后,清标志A,开标志C。
在主程序里 死循环等待标志位B 的到来。B到 ,则LED点亮。C到则关闭。 不就实现延时5S了么。而且肯定延时稳定
我试过了:
if((aa==100)&&(bb==8))
{
aa=0;
if(bb==8)
{
P0_1=1;
P0_2=0;
bb=0;
}
}
烧写的时候,时间还是不能固定为5秒,除非每个周期结束后按一下复位键
哈:
我是新手噢,感谢您的思路,可是我一时还编不出程序来,如果你有程序,可否上传分享分享?
#include<reg52.h> #define uint unsigned int #define uchar unsigned char sbit P0_1=P0^1; sbit P0_0=P0^0; sbit P0_2=P0^2; sbit P1_4=P1^4; sbit K1=P3^2; sbit K2=p3^4; //sbit K1=P3^6; //sbit K2=P3^7;
uchar aa,bb; void main() { P1_4=0; aa=0; bb=0; TMOD=0x01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1; ET0=1; TR0=1; while(1) { if(K1==0) {P1_4=0; P0_0=0; P0_1=0; bb=8; } if((aa==100)&&(bb==8)) {aa=0; if(bb==8) { P0_1=1; P0_2=0; bb=0;
} } if(K2==0) { P1_4=0; P0_0=1; P0_2=1; } } } void timer0() interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; aa++; }
我再写了一遍
我好像试错了,今天下班后我再回去试下
2010-8-19晚试了,没成功:
if(aa==100)
{aa=0;
if(bb==8)
{ P0_1=1;
P0_2=0;
bb=0;
} }
自己也稍改动了程序,也没成功:
if((aa==100))&&(bb==8))
{aa=0;
if(bb==8)
{ P0_1=1;
P0_2=0;
bb=0;
} }
我的邮箱是: yjxianger@126.com ,欢迎爱好单片机的朋友一起讨、进步
QQ:125991680
此问题已解决,谢谢大家关心
还是初学者常遇到的问题
if((aa==100)&&(bb==8))
这里,aa=100是“点”判断拦截的问题, 一下子就可能跑过去了,变成aa>=101,这样,aa只能继续aa++直到溢出,从头再来,这样时间就会不准确,试着改成“ if((aa>=100)&&(bb==8))”或“ if((aa>=100)&&(bb>=8))”将aa>=100的所有情况拦截。试试看。
此程序到现在为止已经历时半个多月了,真心的感谢各位朋友一直的观注,现在一位QQ好友的指导下,经过烧机试验,通过。不敢贪功现将这位高手好友发给我的邮件及程序挂上与大家共同分享,
再次感谢各位同学与老师的关心与帮助!
if(K1==0) { P1_4=0; P0_0=0; P0_1=0; bb=8; aa=0; } |
欢迎光临 (http://www.51hei.com/bbs/) | Powered by Discuz! X3.1 |