利用89c51单片机编写可调万年历
来源:互联网 发布:金山强力卸载软件 编辑:程序博客网 时间:2024/04/30 15:45
最近需要编写我学单片机一个星期以来最大的一个项目,目前感觉相当有挑战性,题目如下:
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 <reg52.h>#define uint unsigned int#define uchar unsigned charchar 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++;}
- 利用89c51单片机编写可调万年历
- jin1956121用c51编写的万年历 LCD1602液晶显示.定时闹钟
- 用C51编写单片机延时函数(转贴)
- 用C51编写单片机延时函数(转贴)
- 用visual_studio编写c51单片机程序
- 51单片机可调时钟
- C51单片机
- C51-------时钟程序(C语言编写的单片机时钟)
- [89C51单片机]LCD1602静态显示
- 89C51单片机内部结构深度解析
- 利用89C51做音乐盒
- 51单片机 万年历
- 51单片机万年历
- 单片机C51编程规范
- 单片机C51编程规范
- 单片机C51学习心得_01
- 单片机C51学习心得_02
- c51单片机寻址结构
- 移动应用推广八法
- MongoDB学习整理之索引
- C++中RTTI 与 typeid 运算符
- 抽象类与接口 php
- 自定义checkbox in iOS
- 利用89c51单片机编写可调万年历
- IIS的安装于配置
- 工厂模式
- C#格式化日期时间
- 惠普大中华区总裁孙振耀退休十五天后九大感言
- 由读《深入理解计算机系统》一书引发对程序本质的探讨以及自己的一些理解
- 在project中引用EntityFramework
- 如何在 Mac 上创建一个 cocos2d 的项目
- UIWebView設定ScalesPageToFit