80c51单片机定时器中断问题,单个数码管间隔1秒一次显示0到9。(汇编语

kuaidi.ping-jia.net  作者:佚名   更新日期:2024-09-10
C51编程:如何让一位数码管循环显示数字0~9,时间间隔为1秒?

非精确的,用定时器就足够了,
有仿真图,
P0加上拉电阻,
74HC373做驱动,不过没加保护电阻,
仿真通过:
这是源码:
#include
unsigned char code1[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned int a;
void delay()
{
unsigned int i,j;
for(i=100;i>1;i--)
for(j=0;j<100;j++);
}
main()
{
while(1)
{
for(a=0;a<=9;a++)
{
P0=code1[a];
delay();
}
}
}

你这是实物电路板,还是仿真哪?
你用了定时器T0,而且写中断子程序,可是,T0却没有开中断哪。
加一行
ET0=1; //要加这一行
你的程序还有其它的问题,修改后的程序发在下面,并有仿真图。
#include
#include
unsigned char code LED7Code[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,//0-9字模
0x88,0x83,0xc6,0xa1,0x86,0x8e};//共阳极7段数码管A-F字模,原来的是错误的.
unsigned char num,temp;
void system_init()
{
EA=1; //开中断总开关
ET0=1;//加一行,开定时器T0中断
TMOD=0x01;//定时器0方式1
TH0=(65535-50000)/256;//定时50ms
TL0=(65535-50000)%256;
num=0;
temp=0;
TR0=1;//开定时器0
P0=LED7Code[num]; //不能是num++
}
void main()
{
system_init();//参数初始化
while(1)
{
if(temp==20) //定时1s,刷新数码管数字显示
{
temp=0; //标志位置零,计数程序修改后是这样的
num++; //原来的写法有问题
if(num>15)
num=0;
P0=LED7Code[num]; //显示字符,不能是num++
}
}
}

void Time() interrupt 1 using 1 //中断函数
{
TH0=(65535-50000)/256;//定时50ms
TL0=(65535-50000)%256;
temp++;
}

ORG 0000H
LJMP MAIN
ORG 000BH
LJMP T0ISR
ORG 0030H
MAIN:
MOV TMOD,#01H
MOV TH0,#HIGH(65536-50000)
MOV TL0,#LOW(65536-50000)
SETB TR0
SETB ET0
SETB EA
MOV R2,#20
MOV R3,#0
SJMP $
T0ISR:
CLR TR0
MOV TH0,#HIGH(65536-50000)
MOV TL0,#LOW(65536-50000)
SETB TR0
DJNZ R2,T0E
MOV R2,#20
MOV DPTR,#TABLE
MOV A,R3
MOVC A,@A+DPTR
MOV P0,A
INC R3
CJNE R3,#10,T0E
MOV R3,#0
T0E:
RETI
TABLE: ; 共阴极数码管显示代码表
DB 3FH,06H,5BH,4FH,66H ;01234
DB 6DH,7DH,07H,7FH,6fh ;56789
END

  • 80c51单片机定时器中断问题,单个数码管间隔1秒一次显示0到9。(汇编...
    答:ORG 0000H LJMP MAIN ORG 000BH LJMP T0ISR ORG 0030H MAIN:MOV TMOD,#01H MOV TH0,#HIGH(65536-50000)MOV TL0,#LOW(65536-50000)SETB TR0 SETB ET0 SETB EA MOV R2,#20 MOV R3,#0 SJMP T0ISR:CLR TR0 MOV TH0,#HIGH(65536-50000)MOV TL0,#LOW(65536-50000)SETB TR0 DJNZ R2...
  • 80c51单片机定时器中断问题,单个数码管间隔1秒一次显示0到9。(汇编...
    答:ORG 0000H LJMP MAIN ORG 000BH LJMP T0ISR ORG 0030H MAIN:MOV TMOD,#01H MOV TH0,#HIGH(65536-50000)MOV TL0,#LOW(65536-50000)SETB TR0 SETB ET0 SETB EA MOV R2,#20 MOV R3,#0 SJMP T0ISR:CLR TR0 MOV TH0,#HIGH(65536-50000)MOV TL0,#LOW(65536-50000)SETB TR0 DJNZ R2...
  • 80C51单片机有哪些中断源?对应的中断入口地址分别是什么?
    答:定时器1: 入口:001BH 串口中断:入口:0023H 1.1个串口中断,地址:0x98H;外部中断和定时计数器中断:设置地址:0x88H;定时计数器设置地址:TMOD:0x89H,TL0;8AH TL0;8BH TH0;8CH :TH1: 8DH。
  • 单片机中断是什么?
    答:80C51单片机的中断是一种使CPU中止当前正在执行的程序,转而执行中断服务程序,待中断服务程序执行完毕后,再自动返回原程序继续执行的过程。在80C51单片机中,中断是实现实时处理和多任务操作的重要手段。当单片机正在执行主程序时,如果外部或内部发生某一事件(如定时器溢出、外部信号输入等),单片机可以暂停...
  • 说明80C51单片机的中断过程.
    答:1.2内中断置位 80c51把所有中断标志都集中到TCON和SCON寄存器中。其中外中断是使用采样的方法把中断请求锁定在TCON寄存器的IE0(IE1)标志位上,而定时中断和串行中断的中断请求由于都发生在芯片的内部,定时中断可以直接去置位TCON的TF0(TF1),串行中断可以直接去置位SCON的RI和TI。内中断不存在采样问题。 2.中断查询 ...
  • 涉及80C51单片机中断控制的有哪几个特殊功能寄存器?
    答:【答案】:涉及80C51单片机中断控制的有中断请求、中断允许和中断优先级控制3个方面、4个特殊功能寄存器:①中断请求:定时和外中断控制寄存器TCON、串行控制寄存器SCON;②中断允许控制寄存器IE;③中断优先级控制寄存器IP。
  • 80C51单片机有哪些中断源?它们对应的中断入口地址分别是什么?_百度...
    答:外部中断0:入口:0003H 定时器0: 入口:000BH 外中断1: 入口:0013H 定时器1: 入口:001BH 串口中断:入口:0023H
  • 80c51单片机程序存储器0000H单元到002A是如何分配的?
    答:0000H是复位向量入口,一般保留3字节。0003H是中断向量0(外部中断0)入口。000BH是中断向量1(定时器中断0)入口。0013H是中断向量2(外部中断1)入口。001BH是中断向量3(定时器中断1)入口。0023H是中断向量4(串口中断)入口。
  • 单片机:80C51的中断系统及定时/计数器
    答:ljmp int_time ORG 0030H RESET: mov sp,#07h mov r0,#7fh clear0: mov @r0,a djnz r0,clear0 MOV TMOD,#01H;设定定时器0 MOV TL0,#0cH;设定定时初值65536-500 MOV TH0,#0FeH setb ea setb ET0 setb tr0 ajmp int_time:mov tl0,#0ch...
  • 80C51单片机中断
    答:因为你的主程序在SJMP $在这条指令上不断的执行,当然中断返回后只能返回到这里了,你可能没搞明白SJMP $这条指令是什么意思 SJMP $,这条指令的意思是 转移到标号,如果标号是$ ,就表示转移到原条指令上。