51单片机的使用十分简单,用它可以来做很多设计,而且51单片机结实耐造,我觉得用51来完成我的这个设计就可以满足相关的需求了。毕竟是仿真设计,这个是初代,经过一部分修改和提升,就可以在硬件上实现了(实物已经做出来了,效果还行)。
接下来我就简单介绍以下我的时钟。
,
前言
其实51单片机挺好用的,操作简单,结实可靠,51可以满足本科阶段的相当部分的设计要求,而且还不需要什么高深的编码能力,只要简单学过c语言就可以掌握。这个时钟日历的设计十分的简单,不需要太多的知识,接下来我就简单介绍一下。
一、51单片机的性能和分析
stc89c52是STC公司设计和生产的一款8位的控制器,功能;8k字节的Flash,512字节的RAM,32位I/O口线,看门狗定时器,内置4KBEEPROW,3个16位定时器,另外还有4个外部中断。还有一款单片机是stc89c51,有两个定时器,3个外部中断,其他与52没有多大的差异。不过51系列的单片机在编程时代码容量不大,没有具体的参数,不过我去年打算做一个游戏机,不过代码太长,最终编译失败,然后我就用32做了一个,在以后的文章中会给大家分享的。
尽管我很喜欢51系列的单片机,不过它确实有些落后了,想想还是有点英雄落幕的感觉,现在在大学的一些比赛中,51还是可以承担一部分主控要求的,不过越来越少了,因为近些年来电子设计类比赛的题目越来越难了,或者说变得灵活了。从最开始的设计制作电压表、稳压电路、升降压装置、遥控类装置,到近些年的颜色识别、形状识别、球板平衡、立杆不倒,控制和自动化类的题目越来越灵活,每一届电赛在控制题上都有创新,要用到新的东西,大部分都用的不太熟悉,不过电源题在框架上没有太多的延申,基本都是工程上学过的东西,不过对于精度的要求越来越高,一定要对电路原理和设计有所了解,也要掌握PID控制的方法,这个在精密控制的应用上十分广泛。抱歉扯远了,回归正题,51确实落后了,不过,我们可以通过学习51来锻炼我们的编码能力,现阶段的编程c语言就足够了,在以后学习32的过程中,编码能力显得十分重要。
二、设计部分
1.设计思路
上图就是电子时钟日历的仿真设计,这个是刚开机的状态,可以通过右下脚的按钮来校准时间和日期。接下来我们就来介绍并操作一下。
我们可以看到上图屏幕中的第二行,从左到右分别表示年、月、日、时、分、秒。
接下来我们按右下脚的第一个按钮(选择),显示屏的第一行就会出现一个‘*”号,这个星号在那个数字上面,就表示这个数字可以调整了。
现在星号在月份的上面,就表示月份可以调整,这时我们可以通过按第二个按钮和第三个按钮来调整月份的大小,“加”键表示按下去后,月份数字加一,“减”键相反,比如我们把调整为12月,我们可以通过长按“加“键,或长按减键。效果如下图所示。
接下来,我们可以可以继续调整日期的数字,这里我设置了每个月,大月,小月的天数,也就是说,你的日期输调整的最大值,即不会大于现实中日期的天数。比如说,2022年的二月,有28 天,所以当日期数字加到28 时,再加的话就会变成1.
最下面的那两个键,基本没有什么作用,我就不一一介绍了。这个日历的时间还算精准,一个小时会差一秒,有时快一秒,有时慢一秒,所以一天下来的话,会差10-25秒,这个是我测出来的,因为51的定时器是16位的,所以调整的范围有限,对了,这个调时和数字可以长按加减键,效果其实都是一样的,所以我们仅用三个键就可以完成对时钟日历的校准。本人技术有限,写的不太完整请谅解。
实物展示;这个要电池才行,我电池去做别的项目了。
2.代码
部分代码:
下面的代码是显示相关数字的函数
void lcdprint(unsigned int nia,unsigned int yue,unsigned int day,unsigned int h,unsigned int min,unsigned int sec)
{
int n2=nia/10;
int n1=nia%10;
int y2=yue/10;
int y1=yue%10;
int d2=day/10;
int d1=day%10;
int h2=h/10;
int h1=h%10;
int m2=min/10;
int m1=min%10;
int s2=sec/10;
int s1=sec%10;
lcdstation(0,1);年份数字
wc51ddr(n2+0x30);
lcdstation(1,1);
wc51ddr(n1+0x30);
lcdstation(3,1);
wc51ddr(y2+0x30);月份数字
lcdstation(4,1);
wc51ddr(y1+0x30);
lcdstation(6,1);
wc51ddr(d2+0x30);日期数字
lcdstation(7,1);
wc51ddr(d1+0x30);
lcdstation(9,1);
wc51ddr(h2+0x30);小时数
lcdstation(10,1);
wc51ddr(h1+0x30);
lcdstation(12,1);
wc51ddr(m2+0x30);分
lcdstation(13,1);
wc51ddr(m1+0x30);
lcdstation(14,1);
wc51ddr(s2+0x30);秒
lcdstation(15,1);
wc51ddr(s1+0x30);
}
void timer1_int (void) interrupt 3
{
TH1=(65536-9960)/256;
TL1=(65536-9960)%256;
ms++;
if(ms==80){
ms=0;
sec++;
if(sec==60){
sec=0;
min++;
if(min==60){
min=0;
h++;
if(h==24){
h=0;
day++;
if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12){
if(day>31){
day=1,yue++;
if(yue>12){
yue=1;
nia++;
if(nia==100){nia=0;}
}
}
}
这个是中断中应该设置的函数(部分)。
总结
这个日历时钟是不是有一定的作用,我觉得不算难,可以尝试动手做一下,可以给我留言。
要完整资料的可以加我QQ,2649191761