完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
本帖最后由 qq312448494 于 2013-4-22 16:15 编辑
这是一个2602LCD显示的时钟,目前只有显示时间的部分可用。我的想法是用计算机通过串口通信发送六位数字到单片机,达到调整时间的目的。目前这个功能基本实现。但是还有点小问题。就是有时候连续发送几次之后,显示的就不对了。而且在秒钟后面还会多显示出几位数字。不知道问题在哪里。麻烦大家看看,嘿嘿。感激不尽。 已经找到原因,问题出在串口通信优先级低于定时器中断优先级。所以在接收信息的时候如果刚好遇到定时器中断,那么接收过程就会被打乱。添加一句PS=1;将串口中断优先级调到最高就可以了。 #include #define uchar unsigned char #define uint unsigned int ***it dula=P2^7; ***it wela=P2^6; ***it rs=P3^5; ***it lcden=P3^4; ***it wr=P3^6; ***it rd=P3^7; ***it s1=P3^0; ***it s2=P3^1; ***it 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;//接收完成 } } |
|
相关推荐
3个回答
|
|
额。。。木有一个人回的。。
|
|
|
|
程序的问题我是帮不到你、、、、、、、、、、
|
|
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
《DNESP32S3使用指南-IDF版_V1.6》第三十五章 摄像头实验
846 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》第三十章 DHT11数字温湿度传感器
820 浏览 0 评论
910 浏览 0 评论
【敏矽微ME32G070开发板免费体验】之原厂2812测试例程解析
1693 浏览 0 评论
1307 浏览 2 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12066 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-30 10:47 , Processed in 1.251857 second(s), Total 75, Slave 57 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号