刚开始学习51单片机,写了个小程序,当P3^2口按键按下,点亮P1^0口的LED,并间隔约0.5秒闪烁;当P3^7口按键按下,熄灭LED。现在看到的现象是能点亮和熄灭,但不会闪烁。请大家帮忙看看是什么问题。
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
uchar num;
sbit key_sec05=P3^2;
sbit key_stop=P3^7;
sbit out=P1^0;
void allport_Init() //端口初始化
{
P0=P1=P2=P3=0xff;
}
void delayms(uint xms) //延时
{
uint b,c;
for(b=xms;b>0;b--)
for(c=100;c>0;c--);
}
void keyscan() //按键扫描
{
if(key_sec05==0)
{
delayms(10);
if(key_sec05==0)
{
while(1)
{
out=0;
if(num==10)
{
num=0;
out=~out; //使发光管状态取反
}
if(key_stop==0)
{
delayms(10);
if(key_stop==0)
{
out=1;
break;
}
}
}
}
}
}
void T0_time() interrupt 1
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
num++;
}
void main()
{
allport_Init();
TMOD=0x01;//定时器0工作于方式1
TH0=(65535-45872)/256;
TL0=(65535-45872)%256;
EA=1;//开总中断
ET0=1;//开定时器0的中断
TR0=1;//启动定时器
while(1)
{
keyscan();
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
- void keyscan(void)
- {
- if(key_sec05 == 0)
- {
- delayms(10);
- if(key_sec05 == 0)
- {
- out = 0;
- while(1)
- {
- if(num == 10)
- {
- num = 0;
- out = ~out;
- }
- if(key_stop == 0)
- {
- delayms(10);
- if(key_stop == 0)
- {
- out = 1;
- break;
- }
- }
- }
- }
- }
- }
复制代码你想一下,当下面这个 if 语句成立后会出现什么情况
- if(num==10)
- {
- num=0;
- out=~out; //使发光管状态取反
- }
复制代码情况就是灯确实取反了,但是程序马上进入下次的 while (1)里,在这里面执行的第一条
程序就是点灯
- out=0;
复制代码上面这个过程非常快,你肉眼看到的就是灯一直在亮,没闪烁……
你的要求实现起来很简单的,你再仔细想想吧
一周热门 更多>