8051 单片机入门 定时器与中断 寄存器 数码管显示

2019-07-15 10:10发布

请问有朋友看过宋雪松老师的51单片机教程吗?STC8051单片机

下面的程序是一个从999999开始  秒倒计时  的程序,并且是用 定时器 T1 的中断来完成。一开始我自己选的定时器模式是模式1(TMOD=0x01),但这种情况下数码管变化非常快,肯定是小于1秒的。后来改为模式2(TMOD=0x10),即八位自动重装模式,就可以正常的每秒倒计时了。新手入门不是很懂,请问有朋友能解释一下是为什么吗?

#include<reg52.h>
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;

unsigned char code led[]={   0xC0,  //"0"    0xF9,  //"1"     0xA4,  //"2"     0xB0,  //"3"       0x99,  //"4"                                                        0x92,  //"5"    0x82,  //"6"     0xF8,  //"7"      0x80,  //"8"       0x90,  //"9"    };         unsigned char ledbuff[6]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
unsigned char flag = 0;
unsigned long int sec = 0;
unsigned int cnt = 0;
unsigned char  i = 0;

void main()
{
    ENLED = 0;
    ADDR3 = 1;

    TMOD = 0x10;   //为什么要用模式2呢???
    TH1 = 0xFC;
    TL1 = 0x67;
    TR1 = 1;

    EA = 1;
    ET1 = 1;
    while(1)
    {
        if(flag == 1)
        {
            flag = 0;
            sec++;
            ledbuff[0]=led[9-sec%10];
            ledbuff[1]=led[9-sec/10%10];
            ledbuff[2]=led[9-sec/100%10];
            ledbuff[3]=led[9-sec/1000%10];
            ledbuff[4]=led[9-sec/10000%10];
            ledbuff[5]=led[9-sec/100000%10];
        }
    }
}
void Iterruptedtimer() interrupt 3
{   
    TH1 = 0xFC;
    TL1 = 0x67;
    cnt++;
    if(cnt >= 1000)
    {
        cnt = 0;
        flag = 1;
   }
    P0 = 0xFF;
    switch(i)
    {
        case 0:ADDR2=0;ADDR1=0;ADDR0=0;i++;P0=ledbuff[0];break;
        case 1:ADDR2=0;ADDR1=0;ADDR0=1;i++;P0=ledbuff[1];break;
        case 2:ADDR2=0;ADDR1=1;ADDR0=0;i++;P0=ledbuff[2];break;
        case 3:ADDR2=0;ADDR1=1;ADDR0=1;i++;P0=ledbuff[3];break;
        case 4:ADDR2=1;ADDR1=0;ADDR0=0;i++;P0=ledbuff[4];break;
        case 5:ADDR2=1;ADDR1=0;ADDR0=1;i=0;P0=ledbuff[5];break;
        default:break;
    }
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。