历史上的今天
返回首页

历史上的今天

今天是:2025年06月23日(星期一)

正在发生

2020年06月23日 | 利用89c51单片机编写可调万年历

2020-06-23 来源:eefocus

最近需要编写我学单片机一个星期以来最大的一个项目,目前感觉相当有挑战性,题目如下:


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++;

}

推荐阅读

史海拾趣

ECLIPSE公司的发展小趣事

随着Eclipse项目的不断发展,越来越多的知名公司加入到这一开源社区中,如Oracle、Red Hat等。这些公司不仅为Eclipse贡献了代码,还提供了资金支持。Eclipse的功能日益完善,逐渐成为了Java开发领域的佼佼者。同时,Eclipse也支持其他编程语言,如C/C++、Python等,进一步扩大了其用户群体。

Econais公司的发展小趣事

为了加速产品的市场推广和应用,Econais积极寻求与行业内其他优秀企业的合作。XXXX年,Econais与Xively公司达成战略合作,共同为工业、商业和住宅市场提供一站式的物联网解决方案。通过这次合作,Econais的WiSmart Wi-Fi用户能够无缝连接到Xively云,为各种物联网应用提供强有力的支持。

Fortiming Corporation公司的发展小趣事

背景:在电子行业,成本控制和供应链管理是企业竞争力的重要体现。

发展:Fortiming不断优化供应链管理流程,与上游供应商建立长期稳定的合作关系,确保原材料的稳定供应和质量可靠。同时,公司还通过技术创新和工艺改进,降低生产成本,提高产品竞争力。这些措施使得Fortiming在激烈的市场竞争中保持了良好的盈利能力。

Firadec公司的发展小趣事

背景:假设Firadec公司(此处为虚构名称)成立于20世纪90年代初,正值半导体技术快速发展的时期。公司创始人是一位在半导体领域有深厚造诣的科学家,他带领团队研发出了一种新型低功耗、高性能的集成电路技术。

发展:这项技术迅速获得了市场的认可,Firadec公司凭借这一创新产品迅速在电子行业崭露头角。公司不断加大研发投入,持续优化产品性能,逐渐在智能手机、平板电脑等消费电子领域占据了一席之地。

影响:随着技术的不断成熟和应用领域的拓展,Firadec公司的市场份额逐年提升,成为了电子行业中的佼佼者。其技术创新不仅推动了公司自身的发展,也为整个电子行业的进步做出了重要贡献。

国产公司的发展小趣事
在放大电路中引入适当的负反馈,可以稳定电路的工作点,提高放大器的线性度,从而减少失真。
DOMINANT公司的发展小趣事

在LED产业蓬勃发展的背景下,统明亮(DOMINANT)公司在2000年应运而生。它的诞生源于欧司朗(OSRAM)在马六甲工厂的分拆,加上马来西亚财团的加持,这家新公司迅速崭露头角。统明亮公司从成立之初就专注于LED技术的研发和生产,凭借其卓越的技术实力和创新能力,逐渐在电子行业中树立了良好的口碑。经过数年的不懈努力,统明亮在全球贴片式LED领域取得了领先地位,特别是在车用LED封装领域,其产品质量和技术水平均处于行业前列。

问答坊 | AI 解惑

比赛倒计时!让我们一起来!!!

本帖最后由 paulhyde 于 2014-9-15 09:19 编辑 同学们,加油阿!!! 让我们在这里彼此鼓励!!! 比赛越来越近了,大家进来彼此鼓励一下也好啊!  …

查看全部问答>

单片机C语言编程与实例

单片机C语言编程与实例,分享给大家,需要的拿去用。…

查看全部问答>

WINCE5.0 的keypad驱动无法正常加载

我用samsung默认的bsp包,发现进入不了Matrix_Entry这个函数,有谁遇到过这个问题吗? 怎么解决呢,我看了一下reg文件和bib文件,应该都没有问题啊 [HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP\\KEYBD]     \"DriverName\"=\"kbdmouse. ...…

查看全部问答>

谁能说说笔记本上的Fn+Fx的实现么

我只知道Fn+Fx会生成一个Scancode,但是如果ScanCode在不同键盘下是同定义的,如何才能知道按下Fn+Fx是发送了哪个ScanCode? 环境:XP Sp2/Vista Sp1 English ,Visual Studio 2008 机器:Thinkpad 备注:查过很多资料,用Hook 的方式是抓不到Message(比 ...…

查看全部问答>

这样在AXD中查询到特殊功能寄存器的值呢,难道要在程序里通过变量传输

这样在AXD中查询到特殊功能寄存器的值呢,难道要在程序里通过变量传输…

查看全部问答>

版主,现在遇到了个棘手的问题,关于停止和唤醒的。

我现在要在一个中断线上同时实现中断和事件有没有可能呢? 为什么要这样呢,原因是我想让外部中断线EXTI5的中断来让MCU进入停止模式 也要让外部中断线EXTI5的中断来让MCU从停止模式唤醒,怎么实现呢? 于是我想,事件不是可以不执行外部中 ...…

查看全部问答>

输入输出端出现相位差的原因

运放输入输出端出现相位差的原因是什么?有什么方法可以用来消除或是减小相位差?…

查看全部问答>

怎么降低L7805工作是温度?

在L7805的5V输出端所接电路已经限定的情况下,不加散热片,怎么来尽量降低L7805的发热?改变输入端限流电阻是否可以呢?…

查看全部问答>