请大家看看这个程序

2019-07-16 05:50发布

本帖最后由 qq312448494 于 2013-4-22 16:15 编辑

这是一个2602LCD显示的时钟,目前只有显示时间的部分可用。我的想法是用计算机通过串口通信发送六位数字到单片机,达到调整时间的目的。目前这个功能基本实现。但是还有点小问题。就是有时候连续发送几次之后,显示的就不对了。而且在秒钟后面还会多显示出几位数字。不知道问题在哪里。麻烦大家看看,嘿嘿。感激不尽。
已经找到原因,问题出在串口通信优先级低于定时器中断优先级。所以在接收信息的时候如果刚好遇到定时器中断,那么接收过程就会被打乱。添加一句PS=1;将串口中断优先级调到最高就可以了。
#include<reg52.h>
#define        uchar        unsigned        char
#define        uint        unsigned        int
sbit        dula=P2^7;
sbit        wela=P2^6;
sbit        rs=P3^5;
sbit        lcden=P3^4;
sbit        wr=P3^6;
sbit        rd=P3^7;
sbit s1=P3^0;
sbit s2=P3^1;
sbit s3=P3^2;

uchar        count,num,receveflag,s;
uchar        recenum=0;
char        shi,fen,miao;
uchar        code        table[]=" 2010-04-11 WED";
uchar        code        table1[]="    00:00:00";
uchar  time[3];
uchar        uart[6];
void        delay(uint        z)
{
        uint        x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}

void        write_com(uchar        com)
{

        rs=0;
        P0=com;
        delay(1);
        lcden=1;
        delay(1);
        lcden=0;

}

void        write_date(uchar        date)
{

        rs=1;
        P0=date;
        delay(1);
        lcden=1;
        delay(1);
        lcden=0;

}

void        init()
{
        uchar        num;
        dula=0;
        wela=0;
        lcden=0;
        wr=0;
        write_com(0x38);
        write_com(0x0c);
        write_com(0x06);
        write_com(0x01);
        for(num=0;num<15;num++)
        {
                 write_date(table[num]);
                delay(1);
        }
        write_com(0x80+0x40);
        for(num=0;num<12;num++)
        {
                write_date(table1[num]);
                delay(1);
        }
        EA=1;
        ET0=1;
        TMOD=0x21;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        TH1=0xfd;
        TL1=0xfd;
        TR0=1;
        TR1=1;        
        ES=1;        
        SM0=0;
        SM1=1;
        REN=1;
       PS=1;
}
void write_sfm(uchar        add,uchar        sfm)
{
        
        write_com(0x80+0x40+add);
        write_date(0x30+sfm/10);
        write_com(0x80+0x40+add+1);
        write_date(0x30+sfm%10);
}


void timepros()
{        
        if(receveflag)
        {
                receveflag=0;
                shi=uart[0]*10+uart[1];
                write_sfm(4,shi);
                fen=uart[2]*10+uart[3];
                write_sfm(7,fen);
                miao=uart[4]*10+uart[5];               
                write_sfm(10,miao);
        }
}


void        main()
{
        init();
        while(1)
        {
                //keyscan();
                timepros();
        }
}

void        timer()        interrupt        1
{
         TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        count++;
        if(count==20)
        {
                count=0;
                miao++;
                if(miao==60)
                {
                        miao=0;
                        fen++;
                        if(fen==60)
                        {
                                fen=0;
                                shi++;
                                if(shi==24)
                                {
                                        shi=0;                                       
                                }
                        }
                        time[0]=shi;
                        write_sfm(4,time[0]);
                }
                time[1]=fen;
                write_sfm(7,time[1]);
        }
        time[2]=miao;
        write_sfm(10,time[2]);
}

void uartint() interrupt 4
{
        uchar abc;
        RI=0;
        P1=0xfe;
        abc=SBUF;
        uart[recenum]=abc-0x30;
        recenum++;
        if(recenum==6)
        {
                recenum=0;        
                receveflag=1;//接收完成
        }
}

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