本帖最后由 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;//接收完成
}
}
一周热门 更多>