STC89LE51定时器异常

2019-03-24 18:18发布

用DS1302做东西,先在开发板上调试。所以1302的时间直接在代码里面写死。反复读时间然后扫描显示数码管。数码管是2个四位的,共八位。用其中的6位。
首先,开发板MCU是STC89LE52RC,整个开发板功能完全正常没有问题。
代码如下,可以正常编译,下载。功能完全正常,所有预期目标都有实现。但是有如下问题。
可以看到,代码里完全没有用到定时器和中断。但是,如果在代码中将 EA=1;ET0=1; TR0=1; 这三句中的任何一句、两句或者三句都注释掉的话,数码管的显示就不正常了,具体表现为,表示时、分的四位都正常,表示秒的十位也正常,但是个位显示莫名的不在 led_ca_table 里面的符号。
如果加入串口调试信息,可以看到hour,min,sec三个变量的值依然是对的。dis_index对应的led_an_table的值也是正确的。但是display[5]的值异常。但是仅仅是显示异常。每秒钟sec_led对应的LED灯亮灭,10秒钟,60秒钟数码管的进位等等行为正常。
也试过数码管扫描不用延时用T0的中断,现象类似。同样是秒个位显示异常。
各位帮忙看看这到底是什么情况呃osz




#include <STCSTC89C5xRC.H>
sbit CE = P4^0;
sbit IO = P4^1;
sbit SCLK = P4^2;
sbit sec_led = P1^7;
void reset();
unsigned char read_byte();
unsigned char sec,min,hour,date,month,day,year,pre_sec,dis_index,i,j;
unsigned char code led_ca_table[]={0xC0,0xCF,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
unsigned char code led_an_table[]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB};
unsigned char display[5];
void write_byte(unsigned char W_Byte);
void release();
void initial();

void main()
{
        P2=0xFF;
        P1=0x80;
        EA=1;
        dis_index=0;
        pre_sec=99;
        initial();
        reset();
        write_byte(0x8E);
        write_byte(0);
        reset();
        write_byte(0xBE);           //burst write
        write_byte(0);                   //sec
        write_byte(0x01);           //minute
        write_byte(0x01);           //hour 24mode
        write_byte(0x01);           //date
        write_byte(0x05);           //month
        write_byte(0x04);           //day
        write_byte(0x14);           //year
        write_byte(0x80);           //control write protect
        release();
        ET0=1;
        TR0=1;
        while(1)
        {
                reset();
                write_byte(0xBF);  //butst read
                sec=read_byte();
                min=read_byte();
                hour=read_byte();
                date=read_byte();
                month=read_byte();
                day=read_byte();
                year=read_byte();
                release();
                if (sec!=pre_sec)
                {
                        sec_led=~sec_led;
                        pre_sec=sec;
                        display[0]=led_ca_table[hour/0x10];
                        display[1]=led_ca_table[hour%0x10];
                        display[2]=led_ca_table[min/0x10];
                        display[3]=led_ca_table[min%0x10];
                        display[4]=led_ca_table[sec/0x10];
                        display[5]=led_ca_table[sec%0x10];
                }
                for (dis_index=0;dis_index<6;dis_index++)
                {
                        P0=display[dis_index];
                        P2=led_an_table[dis_index];
                        for (i=0;i<5;i++)
                                for (j=0;j<110;j++);
                }                         
        }
}

void initial()
{
        reset();
        write_byte(0x8E);
        write_byte(0);        /* disable write protect */
        reset();
        write_byte(0x90);          /* trickle charger register */
        write_byte(0xA6);          /* enable, 1 diodes, 4K resistor */
        reset();
        write_byte(0x8E);
        write_byte(0x80);     /* enable write protect */
        release();
}

unsigned char read_byte()        /* ------- read one byte from DS1302 -------- */
{
unsigned char i,R_Byte,temp;

        R_Byte = 0x00;
        IO = 1;
        for(i = 0; i < 8; i++)
        {
                SCLK = 1;
                SCLK = 0;
                temp = (unsigned char)IO;
                temp <<= 7;
                R_Byte >>= 1;
                R_Byte |= temp;
        }
        return R_Byte;
}

void reset()        /* ----- reset and enable the 3-wire interface ------ */
{
   SCLK = 0;
   CE = 0;
   CE = 1;
}

void release()       
{
   SCLK = 0;
   CE = 0;
   IO = 0;
}

void write_byte(unsigned char W_Byte)        /* ------ write one byte to DS1302 ------- */
{
unsigned char i;

        for(i = 0; i < 8; i++)
        {
                IO = 0;
                if(W_Byte & 0x01)
                        IO = 1;       
                SCLK = 0;
                SCLK = 1;
                W_Byte >>= 1;
    }
}

此帖出自小平头技术问答
0条回答

一周热门 更多>