定时一秒,数码管变化一个数字,定时怎么不准确

2019-07-15 23:09发布

各位前辈,小弟有个问题想请教,刚学单片机,磕磕碰碰。现在是有共阴极数码管,然后我想让它准确定时一秒,然后数字发生变化。代码如下
#include<stc89c54rd+.h>
sbit duan=P2^2;//共阴极数码管,段锁存
sbit wei=P2^3;//共阴极数码管,位锁存
unsigned char i;
unsigned int tt;
void timer0();
unsigned char code duanma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};      //0123456789
void main()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;//设定初值,,计数50MS
EA=1;
ET0=1;//开定时器0
TR0=1;//启动定时器0
wei=1;//打开位选通位
P0=0xfe;//选定第一个数码管
wei=0;//关闭位选通位
while(1)
{
for(i=0;i<9;i++)
{
if(tt==20)
{
tt=0;
//duan=1;                这个和下面那个//duan=0调试时发现不要用,如果加上就直接停在数字2不动了,没搞懂
P0=duanma;
//duan=0;
}
}
}
}
void timer0() interrupt 1
{
TH0= (65536-50000)/256 ;
TL0=  (65536-50000)%256 ;
tt++;


存在的问题是1,上面红 {MOD}代码,for语句,如果吧数字改成<=9,就直接乱变化0,7,5,,,等不按顺序来,只好改成小于,但只能变化到8,如果改成小于10又和前面的问题一样乱变化。2,前面那两个duan=1和0怎么不需要呢在程序中,不是用来选通段,改变数字的么,写上直接变化到2就不动了。3,在前面这些问题都没有的情况下,数字的变化怎么不是一秒钟变化一次。。哎,,搞了好久,是在不知道在哪出问题了,请各位不吝赐教。小弟初学者感觉单片机好难啊
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
背包少年
1楼-- · 2019-07-16 01:42
P0应该写成P0=duanma[i]      段码就是P0 ,选通数码管 应该是位就是你的 定义的WEI  
天凡幽星
2楼-- · 2019-07-16 01:59
首先赋定时器初值时最好用16进制,否则51还要帮你转化会浪费一段时间。然后tt++;tt=20也最好放中断里,一类的就归一类。还有就楼上说的。最后提醒一下,段选赋完值关段选后要消影,共阴0xff,阳0x00;还要延时1ms差不多

一周热门 更多>