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;
}*/ 展开
#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;
}*/ 展开
4个回答
2013-03-12 · 知道合伙人教育行家
关注
展开全部
定时器函数有问题。程序太乱,数码管显示一般都是把要显示的断码做为数组,显示的时候调用数组中的显示码就可以了,没必要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 //自定义
};
展开全部
void number(unsigned int num)
{
P0 = 255; //加上这一句,用来消除以前的显示
switch(num)
{
……
{
P0 = 255; //加上这一句,用来消除以前的显示
switch(num)
{
……
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
overflow_count=0;这句话放在if(overflow_count==20)外边试试
追问
不成功~ 一直都是零 而且灯也不闪了~
追答
保持刚才那句话的移动,将这句话overflow_count++移到if(overflow_count==20){ }下边试试
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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;
}
}
程序总体还有改进空间
{ 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;
}
}
程序总体还有改进空间
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询