标题:
单片机计数输出不稳定
[打印本页]
作者:
bachana
时间:
2019-3-7 17:11
标题:
单片机计数输出不稳定
请各位大神帮忙看下,为什么这个程序在运行的时候,预计截断的位置总是变换,即计数完成周期不定(预计11步,实际在第8、9、10都可能会提前计数)请大神帮忙看下程序是不是哪边不完善
#include <REGX52.H>
sbit k1=P3^0;
sbit LED1=P0^1;
unsigned char count=0;
unsigned char flag=0;
unsigned char cs=0;
void delay(unsigned char i)//延时i个机器周期,有误差
{
while(i--);
}
void tim0() interrupt 1
{
TH0=0x3c;
TL0=0xb0;
cs++;//每50ms加1
}
void main()
{
TMOD=0x01;//设置定时器0工作方式1
TH0=0x3c;
TL0=0xb0;//50ms
TR0=1;
ET0=1;//开定时器0
EA=1;//开中断
//设置定时器0工作方式1,50ms进一次
while(1)
{
if(k1==0)//判断按键按下
{
delay(500);//延时防抖
if(k1==0)flag=1;//标志位置1
}
if(k1==1&&flag==1)//判断按键松开
{
delay(500);//延时防抖
if(k1==1)
{
flag=0;count++;//标志位置0,次数+1
if(count==1)
{
cs=0;//清空时间标志位
while(cs!=10);//等待500ms
LED1=0;
}
if(count==2)
{
cs=0;//清空时间标志位
while(cs!=10);//等待750s
LED1=1;
}
if(count==3)
{
cs=0;//清空时间标志位
LED1=1;
}
if(count==4)
{
cs=0;//清空时间标志位
LED1=1;
}
if(count==5)
{
cs=0;//清空时间标志位
LED1=1;
}
if(count==6)
{
cs=0;//清空时间标志位
LED1=1;
}
if(count==7)
{
cs=0;//清空时间标志位
LED1=1;
}
if(count==8)
{
cs=0;//清空时间标志位
LED1=1;
}
if(count==9)
{
cs=0;//清空时间标志位
LED1=1;
}
if(count==10)
{
cs=0;//清空时间标志位
LED1=1;
}
if(count==11)
{
cs=0;//清空时间标志位
while(cs!=10);//等待0.5s
LED1=1;
count=0;//重新计数
}
}
}
}
}
作者:
wulin
时间:
2019-3-7 21:18
看不出楼主想要实现什么功能,莫非是为了按11次按键LED1闪一下?那也不必写这么多条语句啊!
作者:
zhengchong60
时间:
2019-3-7 22:33
看不出楼主想要实现什么功能,想好了思路再重编
作者:
bachana
时间:
2019-3-8 08:24
wulin 发表于 2019-3-7 21:18
看不出楼主想要实现什么功能,莫非是为了按11次按键LED1闪一下?那也不必写这么多条语句啊!
对的 是需要按键11次亮灯1次 但是不知道程序有什么问题 在输出的时候次数上总是不定 !
作者:
yzwzfyz
时间:
2019-3-8 08:29
自己不把意图说清楚,先要别人花时间猜。
作者:
HC6800-ES-V2.0
时间:
2019-3-8 08:56
大既搞懂你的意图了。
第一:if太多,扫描键盘时间达长,不能连续按键。我快速地按键,计数会很多灯才灭。
第二:你在数次数时,第一次和第11次灯的状态一样,会不会数错了?
我改成前10次都是一个状态亮,只有第11次是灭,慢慢按键,一次一次地,就可以到11次灯灭。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1