最近需要编写我学单片机一个星期以来最大的一个项目,目前感觉相当有挑战性,题目如下:
1)项目一(远程时钟控制系统)
项目背景:时间对于每个人都很重要,特别是对于高速发展的今天。每个城市都有中央LED显示,上面一般包含有时间,天气相应的信息。说近一点,比如我们学校体育馆的LED屏。对于这些显示系统,我不可能每次调整信息都爬到那么高的位置去调节。为此,我们需要设计一个远程时钟控制系统。
项目要求:
1,能够在开发板上的液晶1602上设计出电子钟万年历。
2,设计串口通信协议。
3,通过串口协议,能够通过串口将时钟信息发送到PC机上。
4,通过串口协议,设置的时钟的年,月,日,时,分,秒。
5,通过串口协议,可以向液晶实时动态的发布广告信息,并且在广告与时钟自动切换。
6,通过串口协议,可以控制液晶上显示的效果,例如,左移右移以及移动的速度。
7,通过串口协议,设置实时闹钟。
项目说明:
这里对于串口通信协议进行一些说明。串口通信协议就是通过串口实现人机交互的一种功能。这里给大家介绍一种简单实用的协议。大家也可以自己重新设计协议。例如:
我们可以通过在串口输入命令:menu,激活一个控制菜单。菜单内容如下:
【a】change time //修改系统时间
【b】ads //发布广告
【c】Good look //修改特效
……..
【q】 quit //退出
然后输入:a,就可以进入你设计修改系统时间的菜单中,然后你在修改系统时钟菜单中进行系统时钟修改。
为了体现系统的健壮性,大家需要设计防错机制,例如当你输入menu的时候,你输入了menn,那么你的系统应该提示:input error!
除了修改系统时间,时钟可以停止,其他的时候,时钟都必须是运行的
现在只完成成型的万年历部分,如下
#include #define uint unsigned int #define uchar unsigned char char shi, fen, miao,yue,ri; uchar num; uint count,s1num,nian; sbit rs=P2^0; sbit rw=P2^1; sbit en=P2^2; sbit s1=P3^2; sbit s2=P3^3; sbit s3=P3^4; uchar code table[]=" 2012-11-30"; uchar code table1[]=" 23:59:55"; void delay(uint z) //延时函数 { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void write_com(aa) //写命令 { rs=0; rw=0; P0=aa; delay(5); en=1; delay(5); en=0; } ////////////////////////////////////////////// void write_data( bb) //写数据 { rs=1; rw=0; P0=bb; delay(5); en=1; delay(5); en=0; } void write_sfm(uchar add,uchar bb) //写时间 { uchar shi,ge; shi=bb/10; ge=bb%10; write_com(0x80+0x40+add); write_data(0x30+shi); write_data(0x30+ge); } void write_yr(uchar add1,uchar bb) //写日期 { uchar s,g; s=bb/10; g=bb%10; write_com(0x80+add1); write_data(0x30+s); write_data(0x30+g); } void write_n(uchar add2,uchar bb) //写年 { uchar qi,ba,sh,gg; qi=bb/1000; ba=bb%1000/100; sh=bb%100/10; gg=bb%10; write_com(0x80+add2); write_data(0x30+qi); write_data(0x30+ba); write_data(0x30+sh); write_data(0x30+gg); } ////////////////////////////////////////////////////////// void init() //初始化 { miao=55; fen=59; shi=23; nian=2012; yue=11; ri=30; en=0; write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01); write_com(0x80); for(num=0;num<12;num++) { write_data(table[num]); delay(5); } write_com(0x80+0x40); for(num=0;num<10;num++) { write_data(table1[num]); delay(5); } TMOD=0x01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1; ET0=1; TR0=1; } ///////////////////////////////////////////////////// /////////////////////////////////////// void keyscan() //调节日期时间 { if(s1==0) { delay(5); if(s1==0) { s1num++; while(!s1); if(s1num==1) { TR0=0; write_com(0x80+0x40+8); write_com(0x0f); } } if(s1num==2) { write_com(0x80+0x40+5); } if(s1num==3) { write_com(0x80+0x40+2); } if(s1num==4) { write_com(0x80+10); } if(s1num==5) { write_com(0x80+7); } if(s1num==6) { write_com(0x80+2); } if(s1num==7) { s1num=0; write_com(0x0c); TR0=1; } } if(s1num!=0) { if(s2==0) { delay(5); if(s2==0) { while(!s2); if(s1num==1) { miao++; if(miao==60) miao=0; write_sfm(8,miao); write_com(0x80+0x40+8); } if(s1num==2) { fen++; if(fen==60) fen=0; write_sfm(5,fen); write_com(0x80+0x40+5); } if(s1num==3) { shi++; if(shi==24) shi=0; write_sfm(2,shi); write_com(0x80+0x40+2); } if(s1num==4) { ri++; if(ri==31) ri=1; write_yr(10,ri); write_com(0x80+10); } if(s1num==5) { yue++; if(yue==13) yue=1; write_yr(7,yue); write_com(0x80+7); } if(s1num==6) { nian++; if(nian==9999) nian=1; write_n(2,ri); write_com(0x80+2); } } } if(s3==0) { delay(5); if(s3==0) { while(!s3); if(s1num==1) { miao--; if(miao==-1) miao=59; write_sfm(8,miao); write_com(0x80+0x40+8); } if(s1num==2) { fen--; if(fen==-1) fen=59; write_sfm(5,fen); write_com(0x80+0x40+5); } if(s1num==3) { shi--; if(shi==-1) shi=23; write_sfm(2,shi); write_com(0x80+0x40+2); } if(s1num==4) { ri--; if(ri==0) ri=30; write_yr(10,ri); write_com(0x80+10); } if(s1num==5) { yue--; if(yue==0) shi=12; write_yr(7,yue); write_com(0x80+7); } if(s1num==6) { nian--; if(nian==0) nian=1; write_n(2,nian); write_com(0x80+2); } } } } } ///////////////////////////////////////// void main() //主函数 { init(); while(1) { keyscan(); if(count==18) { count=0; miao++; if(miao==60) { miao=0; fen++; if(fen==60) { fen=0; shi++; if(shi==24) { shi=0; ri++; if(ri==31) { ri=1; yue++; if(yue==13) { yue=1; nian++; if(nian==9999) { nian=0; } write_n(2,nian); } write_yr(7,yue); } write_yr(10,ri); } write_sfm(2,shi); } write_sfm(5,fen); } write_sfm(8,miao); } } } ////////////////////////////////////////////////////// void timer0() interrupt 1 //定时器中断0 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; count++; }
上一篇:51单片机概述以及设计最小系统
下一篇:51单片机(九).51单片机简单项目—万年历和温度采集
推荐阅读最新更新时间:2024-11-14 09:31
设计资源 培训 开发板 精华推荐
- #第七届立创电赛#USB电压电流表
- LT3970HMS-5 5V 同步降压转换器的典型应用
- DC1005A,用于 LTC2207 ADC 驱动器和 9x9mm 高性能 ADC 的演示板
- LTC2946IMS 在 -48V 系统中使用低侧检测(1.5kHz I2C 接口)进行电源、电荷和能量监测的典型应用
- RT5796A 1.5A、1MHz、5.5V CMCOT同步降压转换器典型应用
- LTC2313-12、12 位、2.5Msps 串行采样 ADC 的典型应用
- LT8709 的典型应用 - 负输入同步多拓扑 DC/DC 控制器
- 【立创开发板】小耿的游戏机扩展板项目
- DK-DEV-5CGTD9NES,客户和内部用户用于实现基于 Cyclone V FPGA 的系统的入门板
- RY-1215S 15V、15mA输出DC/DC转换器典型应用电路