51单片机数码管

我想让数码管的第一位显示从零开始,一秒自加一次到九清零,但是为什么开始显示一个零2秒之后就直接变为8,是我的程序错了,还是电路图错了,是不是少了锁存器?#include<... 我想让数码管的第一位显示从零开始,一秒自加一次到九清零,但是为什么开始显示一个零2秒之后就直接变为8,是我的程序错了,还是电路图错了,是不是少了锁存器?

#include<reg52.h>
sbit D1=P1^7;
sbit D2=P1^2;
sbit a=P0^0;
sbit b=P0^1;
sbit c=P0^2;
sbit d=P0^3;
sbit e=P0^4;
sbit f=P0^5;
sbit g=P0^6;
sbit wei1=P2^1;
sbit wei2=P2^0;
sbit wei3=P2^3;
sbit wei4=P2^2;
unsigned int i;
unsigned int overflow_count;
void number(unsigned int num);
void delay_1ms(void);
void main()
{
i=0;
P0=0xFF;
TMOD=0x01;
TH0=0x4c;
TL0=0x00;
//启动定时器,开中断
TR0=1;
ET0=1;
EA=1;
D1=0;
D2=0;

while(1)
{
number(i);
wei1=1;
wei2=0;
wei3=0;
wei4=0;
if(overflow_count==20)
{

overflow_count=0;
D2=!D2;
i++;
if(i>=10)i=0;
}
//delay_1ms();
}
}
void number(unsigned int num)
{
switch(num)
{
case 0:a=0;b=0;c=0;d=0;e=0;f=0;break;
case 1:b=0;c=0;break;
case 2:a=0;b=0;g=0;e=0;d=0;break;
case 3:a=0;b=0;c=0;d=0;g=0;break;
case 4:b=0;c=0;f=0;g=0;break;
case 5:a=0;c=0;d=0;f=0;g=0;break;
case 6:a=0;c=0;d=0;e=0;f=0;g=0;break;
case 7:a=0;b=0;c=0;break;
case 8:a=0;b=0;c=0;d=0;e=0;f=0;g=0;break;
case 9:a=0;b=0;c=0;d=0;f=0;g=0;break;
default:break;
}
}
void timer0_ISR(void) interrupt 1 using 1
{
//定时器初始重载
TH0=0x4c;
TL0=0x0c;
overflow_count++;
}
/*void delay_1ms(void) //误差 0us
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=142;b>0;b--)
for(a=2;a>0;a--);
i++;
if(i==10)i=0;
}*/
展开
 我来答
单片机技术宅
2013-03-12 · 知道合伙人教育行家
单片机技术宅
知道合伙人教育行家
采纳数:251 获赞数:552
飞思卡尔智能赛车邀请赛二等奖全国大学生电子设计竞赛成功参赛奖

向TA提问 私信TA
展开全部
定时器函数有问题。程序太乱,数码管显示一般都是把要显示的断码做为数组,显示的时候调用数组中的显示码就可以了,没必要abcdefg的这样去定义。
追问
怎么弄出数组?怎么算?
追答
共阳数码管
unsigned char leddata[]={

0xC0, //"0"
0xF9, //"1"
0xA4, //"2"
0xB0, //"3"
0x99, //"4"
0x92, //"5"
0x82, //"6"
0xF8, //"7"
0x80, //"8"
0x90, //"9"
0x88, //"A"
0x83, //"B"
0xC6, //"C"
0xA1, //"D"
0x86, //"E"
0x8E, //"F"
0x89, //"H"
0xC7, //"L"
0xC8, //"n"
0xC1, //"u"
0x8C, //"P"
0xA3, //"o"
0xBF, //"-"
0xFF, //熄灭
0xFF //自定义

};

共阴数码管
unsigned char leddata[]={

0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5"
0x7D, //"6"
0x07, //"7"
0x7F, //"8"
0x6F, //"9"
0x77, //"A"
0x7C, //"B"
0x39, //"C"
0x5E, //"D"
0x79, //"E"
0x71, //"F"
0x76, //"H"
0x38, //"L"
0x37, //"n"
0x3E, //"u"
0x73, //"P"
0x5C, //"o"
0x40, //"-"
0x00, //熄灭
0x00 //自定义

};
做而论道
高能答主

2013-03-12 · 把复杂的事情简单说给你听
知道大有可为答主
回答量:3万
采纳率:80%
帮助的人:1.2亿
展开全部
void number(unsigned int num)
{
P0 = 255; //加上这一句,用来消除以前的显示
switch(num)
{
……
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zhangxuelei_
2013-03-12
知道答主
回答量:58
采纳率:0%
帮助的人:17.4万
展开全部
overflow_count=0;这句话放在if(overflow_count==20)外边试试
追问
不成功~  一直都是零 而且灯也不闪了~
追答
保持刚才那句话的移动,将这句话overflow_count++移到if(overflow_count==20){ }下边试试
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
零度JFC
2013-03-12 · TA获得超过708个赞
知道小有建树答主
回答量:195
采纳率:0%
帮助的人:121万
展开全部
void number(unsigned int num)
{ P0=0xff;
switch(num)
{
case 0:a=0;b=0;c=0;d=0;e=0;f=0;break;
case 1:b=0;c=0;break;
case 2:a=0;b=0;g=0;e=0;d=0;break;
case 3:a=0;b=0;c=0;d=0;g=0;break;
case 4:b=0;c=0;f=0;g=0;break;
case 5:a=0;c=0;d=0;f=0;g=0;break;
case 6:a=0;c=0;d=0;e=0;f=0;g=0;break;
case 7:a=0;b=0;c=0;break;
case 8:a=0;b=0;c=0;d=0;e=0;f=0;g=0;break;
case 9:a=0;b=0;c=0;d=0;f=0;g=0;break;
default:break;
}
}
即switch(num)前边加入一句P0=0xff;即可正常显示。
但是这样写数码管的显示不太好(有些乱),建议改成如下
void number(unsigned int num)
{
switch(num)
{
case 0:P0=0xc0;break;
case 1:P0=0xf9;break;
case 2:P0=0xa4;break;
case 3:P0=0xb0;break;
case 4:P0=0x99;break;
case 5:P0=0x92;break;
case 6:P0=0x82;break;
case 7:P0=0xf8;break;
case 8:P0=0x80;break;
case 9:P0=0x90;break;
default:break;
}
}
程序总体还有改进空间
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式