最近需要编写我学单片机一个星期以来最大的一个项目,目前感觉相当有挑战性,题目如下:
1) 项目一(远程时钟控制系统)
项目背景:时间对于每个人都很重要,特别是对于高速发展的今天。每个城市都有中央LED显示,上面一般包含有时间,天气相应的信息。说近一点,比如我们学校体育馆的LED屏。对于这些显示系统,我不可能每次调整信息都爬到那么高的位置去调节。为此,我们需要设计一个远程时钟控制系统。
项目要求:
1, 能够在开发板上的液晶1602上设计出电子钟万年历。
2, 设计串口通信协议。
3, 通过串口协议,能够通过串口将时钟信息发送到PC机上。
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 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++;
}