有关51单片机的问题
我用定时器扫描数码管,编写一个时钟的程序时,数码管上只有那个秒的个位是亮的,而其它都是很暗,这是什么原因???求大神。。。。下面是代码:#include<reg52.h>...
我用定时器扫描数码管,编写一个时钟的程序时,数码管上只有那个秒的个位是亮的,而其它都是很暗,这是什么原因???求大神。。。。下面是代码:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar code wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar duan[8];
uchar h,m,s;
/*void delay(uint t)
{
while(t--);
} */
void T_0()
{
TMOD|=0x01;
//TH0=0x00;
//TL0=0x00;
EA=1;
ET0=1;
TR0=1;
}
main()
{
void display(uchar f,uchar n);
T_0();
while(1)
{
duan[0]=table[h/10];
duan[1]=table[h%10];
duan[2]=0x40;
duan[3]=table[m/10];
duan[4]=table[m%10];
duan[5]=0x40;
duan[6]=table[s/10];
duan[7]=table[s%10];
}
}
void display(uchar f,uchar n)
{
uchar i;
for(i=0;i<n;i++)
{
P0=0x00;
P1=wei[i+f];
P0=duan[i];
}
}
void Te_0() interrupt 1
{
static uint t;
TH0=(65536-2000)/256; //2ms
TL0=(65536-2000)%256;
display(0,8);
t++;
if(t==500)
{
t=0;
s++;
if(s==60)
{
s=0;
m++;
if(m==60)
{
m=0;
h++;
if(h==24)
h=0;
}
}
}
} 展开
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar code wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar duan[8];
uchar h,m,s;
/*void delay(uint t)
{
while(t--);
} */
void T_0()
{
TMOD|=0x01;
//TH0=0x00;
//TL0=0x00;
EA=1;
ET0=1;
TR0=1;
}
main()
{
void display(uchar f,uchar n);
T_0();
while(1)
{
duan[0]=table[h/10];
duan[1]=table[h%10];
duan[2]=0x40;
duan[3]=table[m/10];
duan[4]=table[m%10];
duan[5]=0x40;
duan[6]=table[s/10];
duan[7]=table[s%10];
}
}
void display(uchar f,uchar n)
{
uchar i;
for(i=0;i<n;i++)
{
P0=0x00;
P1=wei[i+f];
P0=duan[i];
}
}
void Te_0() interrupt 1
{
static uint t;
TH0=(65536-2000)/256; //2ms
TL0=(65536-2000)%256;
display(0,8);
t++;
if(t==500)
{
t=0;
s++;
if(s==60)
{
s=0;
m++;
if(m==60)
{
m=0;
h++;
if(h==24)
h=0;
}
}
}
} 展开
3个回答
展开全部
1、8位二进制补码表示十六位进制的范围是多少?是-80H~7FH么
是。
----
2、“8051单片机的外部拓展EEPROM程序存储器进行适当的连接可以作为数据存储器使用,而8051单片机的外部拓展数据存储器也可以作为程序存储器进行程序调试”
前一句懂,后一句为什么是对的呢?如果外部数据存储器没有连接方式的话,MOVC这种查表指令该怎么办呢?数据存储和程序存储器的指令不是不同吗?还有我们编写KEILC程序时,指令是存在单片机哪里的?是外部程序存储器还是内部程序存存储器里?(可能存在外部数据存储器么)
这些话,是否正确,要看硬件电路。
如果把 PSEN 和 RD 相与,外部拓展数据存储器,也可以作为程序存储器。
前一句:外部拓展EEPROM程序存储器进行适当的连接可以作为数据存储器使用,
这里已经说了,需要适当的连接。
就是说,电路进行了改动,什么事情,都是可能发生的。
不要再提出疑问。
----
3、“能够用于寄存器寻址的寄存器有:Rn、Ri、DPTR、A、B、CY",
DPTR为毛也行啊,有MOV A,DPTR这种指令吗?徐汉斌单片机教材上就DPTR有关的指令只有4个,MOVX A,@DPTR;MOVX @DPTR,A;MOV DPTR,#addr16;MOVC A,@DPTR+A
你复习考试,要选定一本教材,不同的作者,说法不一。
----
4、“MSC 51单片机定时\计数器对外部脉冲进行计数时,要求输入的计数脉冲的高电平或低电平的持续时间不少于一个机器周期”,这句话哪里有错,实在没看出来
有错吗?
----
5、两数相减用补码运算时,是不是CY等于0表示第一个数小于第二个数,CY等于1表示第一个数大于第二个数
单片机的计算,是按照无符号数进行的,Cy,可以反应出无符号数的大小。
想像成补码,并不这么简单,补码是有正负的。
----
6、单片机怎样区别BCD码与16进制数?比如说计算BCD码的补码时,其模9AH与16进制相同,单片机怎么区分这是BCD码的100?
单片机不区别这个,需要编程人,编写程序来解决 BCD 码的问题。
----
这样可以么?
是。
----
2、“8051单片机的外部拓展EEPROM程序存储器进行适当的连接可以作为数据存储器使用,而8051单片机的外部拓展数据存储器也可以作为程序存储器进行程序调试”
前一句懂,后一句为什么是对的呢?如果外部数据存储器没有连接方式的话,MOVC这种查表指令该怎么办呢?数据存储和程序存储器的指令不是不同吗?还有我们编写KEILC程序时,指令是存在单片机哪里的?是外部程序存储器还是内部程序存存储器里?(可能存在外部数据存储器么)
这些话,是否正确,要看硬件电路。
如果把 PSEN 和 RD 相与,外部拓展数据存储器,也可以作为程序存储器。
前一句:外部拓展EEPROM程序存储器进行适当的连接可以作为数据存储器使用,
这里已经说了,需要适当的连接。
就是说,电路进行了改动,什么事情,都是可能发生的。
不要再提出疑问。
----
3、“能够用于寄存器寻址的寄存器有:Rn、Ri、DPTR、A、B、CY",
DPTR为毛也行啊,有MOV A,DPTR这种指令吗?徐汉斌单片机教材上就DPTR有关的指令只有4个,MOVX A,@DPTR;MOVX @DPTR,A;MOV DPTR,#addr16;MOVC A,@DPTR+A
你复习考试,要选定一本教材,不同的作者,说法不一。
----
4、“MSC 51单片机定时\计数器对外部脉冲进行计数时,要求输入的计数脉冲的高电平或低电平的持续时间不少于一个机器周期”,这句话哪里有错,实在没看出来
有错吗?
----
5、两数相减用补码运算时,是不是CY等于0表示第一个数小于第二个数,CY等于1表示第一个数大于第二个数
单片机的计算,是按照无符号数进行的,Cy,可以反应出无符号数的大小。
想像成补码,并不这么简单,补码是有正负的。
----
6、单片机怎样区别BCD码与16进制数?比如说计算BCD码的补码时,其模9AH与16进制相同,单片机怎么区分这是BCD码的100?
单片机不区别这个,需要编程人,编写程序来解决 BCD 码的问题。
----
这样可以么?
展开全部
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar code wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar duan[8];
uchar h,m,s;
void delay(uint t)
{
while(t--);
}
main()
{
uchar i;
TMOD|=0x01;
EA=1;
ET0=1;
TR0=1;
while(1) {
duan[0]=table[h/10];
duan[1]=table[h%10];
duan[2]=0x40;
duan[3]=table[m/10];
duan[4]=table[m%10];
duan[5]=0x40;
duan[6]=table[s/10];
duan[7]=table[s%10];
for(i = 0; i < 8; i++){
P1 = wei[i];
P0 = duan[i];
delay(100);
P0 = 0x00;
}
}
}
void Te_0() interrupt 1
{
static uint t;
TH0=(65536-2000)/256; //2ms
TL0=(65536-2000)%256;
t++;
if(t==500){ t=0;s++;
if(s==60) { s=0;m++;
if(m==60) { m=0;h++;
if(h==24) h=0;
}
}
}
}
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar code wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar duan[8];
uchar h,m,s;
void delay(uint t)
{
while(t--);
}
main()
{
uchar i;
TMOD|=0x01;
EA=1;
ET0=1;
TR0=1;
while(1) {
duan[0]=table[h/10];
duan[1]=table[h%10];
duan[2]=0x40;
duan[3]=table[m/10];
duan[4]=table[m%10];
duan[5]=0x40;
duan[6]=table[s/10];
duan[7]=table[s%10];
for(i = 0; i < 8; i++){
P1 = wei[i];
P0 = duan[i];
delay(100);
P0 = 0x00;
}
}
}
void Te_0() interrupt 1
{
static uint t;
TH0=(65536-2000)/256; //2ms
TL0=(65536-2000)%256;
t++;
if(t==500){ t=0;s++;
if(s==60) { s=0;m++;
if(m==60) { m=0;h++;
if(h==24) h=0;
}
}
}
}
更多追问追答
追问
在那里加延时是可以解决问题,但是那个秒好像就变化很慢了。。不是真正的一秒了???
追答
晶振频率,如果是 12MHz,不会很慢的。
晶振频率,如果是 11.0592MHz,会慢一点。
晶振频率,如果是 6MHz,会慢很多。
……
void Te_0() interrupt 1
{
static uint t;
TH0=(65536-2000)/256; //2ms--初始值,要根据晶振,认真选定
TL0=(65536-2000)%256;
t++;
if(t==500){ t=0;s++;
……
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2014-08-16 · 知道合伙人软件行家
babytaomail
知道合伙人软件行家
向TA提问 私信TA
知道合伙人软件行家
采纳数:429
获赞数:1130
某公司嵌入式开发工程师; 熟悉VC++/C/MFC,Linux驱动,STM32,FPGA,Allegro/Pads及硬件电路设计
向TA提问 私信TA
关注
展开全部
数字都显示出来了吗?是暗而已还是完全没有显示?有没有闪烁?
更多追问追答
追问
都显示了,就是比较暗,没有闪烁。
追答
有可能是数码管驱动电流不足。你电路自己做的吗,贴出来我看看。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询