河北工程单片机数字钟课程设计报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

. .. . .
科信学院
单片机系统设计工程(三级工程)
设计说明书
〔2012/2013学年第二学期〕
题目:数字钟
专业班级:通信工程10级2班
学生XX :
学号:
指导教师
设计数: 2
设计成绩:
2013年6月21日
目录摘要2
一、课程设计目的2
二、设计要求2
三、单片机数字钟的根本原理2
四、总体案设计错误!未定义书签。

4.1 电路的总体原理框图2
4.2 实现时钟计时的根本法3
4.3总体案介绍4
五、数字钟的硬件设计4
5.1硬件电路的设计原那么4
5.2 最小系统5
5.2.1 芯片分析4
5.2.2 晶振电路6
5.3 LCD1602显示模块设计7
5.4时钟显示校正电路8
六、系统软件设计9
6.1软件设计分析9
6.2 源程序清单10
七、proteus仿真图及实物显示效果27
八、设计总结28
九、参考文献28
摘要:该电子时钟由89C51,BUTTON,液晶屏等构成,采用晶振电路作为驱动电路,由延时程序和循环程序产生的一秒定时,到达时分秒的计时,六十秒为一分钟,六十分钟为一小时,满二十四小时为一天。

关键词:单片机;电子时钟;键盘控制
一、课程设计目的
通过?单片机原理与应用?课程设计,使学生掌握单片机及其扩展系统设计的法和设计原那么及相应的硬件调试的法。

进一步加深单片机及其扩展系统设计和应用的理解。

二、设计要求
1、准确计时,以数字形式显示时、分、秒的时间。

2、年以12个月计时形成,月以28〔或29或30或31〕日计时形成,日以24小时计时形式,分秒计时为60进位。

3、校正时间功能,即能随意设定走时时间。

4、闹钟功能,一旦走时到该时间,能以声形式告警提示。

5、设计5V直流电源,系统时钟电路、复位电路。

6、带有秒表功能,按键控制启动、暂停、清零。

三、单片机数字钟的根本原理
它是利用单片机的部的定时/计数器工作与定时式,对机器期计数形成基准时间〔如10ms〕然后用另外一个计数器或软件计数的形式对基准时间进展计数形成秒〔如对10ms计数100次〕,“秒〞计数60次“分〞,“分〞计数60次形成“时〞,“时〞计数24次形成“日〞,“日〞计数为28〔或29或30或31〕次形成“月〞,“月〞计数12次形成“年〞,年计数999次就清零,然后通过译码器,数码管把他们的容在相应的位置显示出来。

在具体的设计时定时器采用中断式工作,对时钟的形成在终中断序中实现,在主程序只是对定时/计数器的定义初始化,调用显示程序和控制程序的初始化。

另外为了使用的便,也设计了按键,可以通过按键对时分秒进展调整,这样程序就加了按键程序。

四、总体案设计
4.1 电路的总体原理框图
本次设计时钟电路,使用了ATC89C51单片机芯片控制电路,单片机控制电路简单且省去了很多复杂的线路,使得电路简明易懂,使用键盘键上的按键来调整时钟的年、月、日、时、分、秒,用一扬声器来进展定时提醒,同时使用汇编语言程序来控制整个时钟显示,使得编程变得更容易,这样通过四个模块:键盘、芯片、扬声器、LCD 液晶屏显示即可满足设计要求。

总设计原理框图如下列图所示:
图1原理框图
4.2 实现时钟计时的根本法
利用STC 系列单片机的可编程定时/计数器、中断系统来实现时钟计数。

(1) 计数初值计算:
把定时器设为工作式1,定时时间为50ms ,那么计数溢出20次即得时钟计时最小单位秒,而100次计数可用软件法实现。

假设使用T/C0,式1,50ms 定时,fosc=12MHz 。

那么初值X 满足〔216-X 〕×1/12MHz ×12μs =50000μs X=15536→10000→3CB0H
(2) 采用中断式进展溢出次数累计,计满20次为秒计时〔1秒〕;
(3) 从秒到分、从分到时、从时到日、从日到月、从月到年的计时是通过累加和数值比拟实现。

4.3总体案介绍 4.3.1 计时案
利用STC89C51单片机部的定时/计数器进展中断时,配合软件延时实现年、月、日、时、分、秒的计时。

该案节省硬件本钱,且能使读者在定时/计数器的
使用、中断及程序设计面得到锻炼与提高,对单片机的指令系统能有更深入的了解,从而对学好单片机技术这门课程起到一定的作用。

4.3.2 控制案
STC89C51的P0口和P1口外接由八个LED数码管(LED8~LED1)构成的显示器,用P0口作LED的段码输出口,P1口作八个LED数码管的位控输出线,P3口外接四个按键A、B、C构成键盘电路。

STC89C51 是一种低功耗,高性能的CMOS 8位微型计算机。

它带有8K Flash 可编程和擦除的只读存储器〔EPROM〕,该器件采用ATMEL的高密度非易失性存储器技术制造,与工业上标准的80C51和80C52的指令系统及引脚兼容,片Flash 集成在一个芯片上,可用与解决复杂的问题,且本钱较低。

简易电子钟的功能不复杂,采用其现有的I/O便可完成,所以本设计中采用此的设计案。

五、数字钟的硬件设计
5.1硬件电路的设计原那么
在性价比满足应用系统要求的情况下,选择更可靠,更熟悉的单片机缩短研制期。

尽可能选择自己较为熟悉的应用电路,以提高系统的可靠性。

单片机部的资源与外部的扩展资源应在满足系统设计的根底上留有余地,为进一步的升级和扩展提供便。

应充分的结合软件案考虑硬件的构造,通常硬件功能较完善,其相应的软件程序就简单,但硬件的本钱较高,而功能较低,其相应的软件就复杂,其实际常用软件代替硬件来降低本钱。

整个系统相关的器件尽可能的做到性能相匹配。

充分的考虑系统的抗干扰性,如具有抗干扰的单片机并充分的帅选芯片与器件,在电路中采取隔离或屏蔽的措施等。

5.2 最小系统
5.2.1 芯片分析
STC89C51单片机引脚图如下:
图2 STC89C51引脚图
MCS-51单片机是标准的40引脚双列直插式集成电路芯片,其各引脚功能如下:
VCC:+5V电源。

VSS:接地。

RST:复位信号。

当输入的复位信号延续两个机器期以上的高电平时即为有效,用完成单片机的复位初始化操作。

XTAL1和XTAL2:外接晶体引线端。

当使用芯片部时钟时,此二引线端用于外接英晶体和微调电容;当使用外部时钟时,用于接外部时钟脉冲信号。

P0口:P0口为一个8位漏极开路双向I/O口,当作输出口使用时,必须接上拉电阻才能有高电平输出;当作输入口使用时,必须先向电路中的锁存器写入“1〞,使FET截止,以防止锁存器为“0〞状态时对引脚读入的干扰。

P1口:P1口是一个部提供上拉电阻的8位双向I/O口,它不再需要多路转接电路MUX;因此它作为输出口使用时,无需再外接上拉电阻,当作为输入口使用时,同样也需先向其锁存器写“1〞,使输出驱动电路的FET截止。

P2口:P2口电路比P1口电路多了一个多路转接电路MUX,这又正好与P0口一样。

P2口可以作为通用的I/O口使用,这时多路转接电路开关倒向锁丰存器Q端。

P3口:P3口特点在于,为适应引脚信号第二功能的需要,增加了第二功能控制逻辑。

当作为I/O口使用时,第二功能信号引线应保持高电平,与非门开通,以维持从锁存器到输出端数据输出通路的畅通。

当输出第二功能信号时,该位应应置“1〞,使与非门对第二功能信号的输出是畅通的,从而实现第二功能信号的输出,具体第二功能如表1所示。

表1 P3端口引脚兼用功能表
5.2.2 晶振电路
下列图所示为时钟电路原理图,在AT89S51芯片部有一个高增益反相放大器,其输入端为芯片引脚XTAL1,输出端为引脚XTAL2。

而在芯片部,XTAL1和XTAL2之间跨接晶体振荡器和微调电容,从而构成一个稳定的自激振荡器。

时钟电路产生的振荡脉冲经过触发器进展二分频之后,才成为单片机的时钟脉冲信号。

图3 晶振电路
5.3 LCD1602显示模块设计
5.3.1 LCD1602主要技术参数
显示容量:16×2 个字符
芯片工作电压:4.5—5.5V
工作电流:2.0mA(5.0V)
模块最正确工作电压:5.0V
字符尺寸:2.95×4.35(W×H)mm
图4 LCD1602引脚图
5.3.2 引脚功能说明
1602LCD 采用标准的14脚〔无背光〕或16脚〔带背光〕接口,各引脚接口说明如下表2所示:
5.3.3 LCD存放器的选择
表2引脚功能说明
5.4时钟显示校正电路
本设计利用按键开关来校正时钟显示的数字。

当按钮按下时,将在相应的端口输入一个低电平,通过相应的程序来改变时钟显示。

其中菜单按键开关用来选择要修改的数字;下调按键用来增加所选数字的数值;上调按键用来减小所选数字的数值;退出按键是退出校正电路。

图5 时钟校正电路图
六、系统软件设计
6.1软件设计分析
在编程上,首先进展了初始化,定义程序的的入口地址以及中断的入口地址,在主程序开场定义了一组固定单元用来储存计数的时.分.秒,在显示初值之后,进入主循环。

在主程序中,对不同的按键进展扫描,实现秒表,时间调整,复位清零等功能,系统总流程图如下列图:
图6 系统总流程图
6.2 源程序清单
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
uchar code table[]="2013:06:19 000";
uchar code table1[]=" 22:22:10 21:48";
uchar code table2[]="0123456789";
sbit lcd_rs =P2^5;//定义LCD端口
sbit lcd_rw=P2^6;
sbit lcd_en=P2^7;
sbit S1=P3^4;//菜单键
sbit S2=P3^5;//加键
sbit S3=P3^6;//减键
sbit S4=P3^7;//退出菜单键
sbit ss=P3^3;//秒表键,第一次启动,第二次暂停,第三次清零
sbit FMQ=P2^0;
void yue31();//31天的月份函数
void yue30();//30天的月份函数
void yue29();//29天的月份函数
void yue28();//28天的月份函数
void Timing(); //闹钟设置
void miaobiao();//秒表函数
uchar count, k1num;//声明秒的变量
char shi,fen,miao;//声明时分秒
uint nian, yue,ri,ji=0,mm=0;//声明年月日,秒表计数,和秒表按键次数uchar f,s;//定时器/
void delay(uchar z)//延时函数
{
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_(uchar )//lcd写指令
{
lcd_rs=0;
lcd_rw=0;
lcd_en=0;
P0=;
delay(5);
lcd_en=1;
delay(5);
lcd_en=0;
}
void write_data(uchar date)//lcd写数据
{
lcd_rs=1;
lcd_rw=0;
lcd_en=0;
P0=date;
delay(5);
lcd_en=1;
delay(5);
lcd_en=0;
}
void miaobiao(char kk)//秒表函数
{
uchar biao_bai,biao_shi,biao_ge;
biao_bai=kk/100;
biao_shi=kk%100/10;
biao_ge=kk%100%10;
write_(0x80+13);
write_data(table2[biao_bai]);
write_(0x80+14);
write_data(table2[biao_shi]);
write_(0x80+15);
write_data(table2[biao_ge]);
write_(0x0c);
}
void write_fsm(uchar add,uchar date)//计算时分秒位{
uchar shi,ge;
shi=date/10;
ge=date%10;
write_(0x80+0x40+add);
write_data(0x30+shi);
write_data(0x30+ge);
}
void write_nyr(uchar add,uchar date)//计算月日位
{
uint shi,ge;
shi=date/10;
ge=date%10;
write_(0x80+0x00+add);
write_data(0x30+shi);
write_data(0x30+ge);
}
void write_nian(uchar add,uchar date)//计算年位,年是百位{
uint bai,shi,ge;
bai=date/100%10;
shi=date/10;
ge=date%10;
write_(0x80+0x00+add);
write_data(0x30+bai);
write_data(0x30+shi);
write_data(0x30+ge);
}
void jiaxian()//设置键盘加显
{
if(k1num!=0)
{
if(S2==0)
{
delay(10);
if(S2==0)
{
while(!S2);//松手检测
if(k1num==1)
{
miao++;
if(miao==60)
miao=0;
write_fsm(8,miao);
//write_(0x0e);
write_(0x80+0x40+8); }
if(k1num==2)
{
fen++;
if(fen==60)
fen=0;
write_fsm(5,fen);
write_(0x80+0x40+5); }
if(k1num==3)
{
shi++;
if(shi==24)
shi=0;
write_fsm(2,shi);
write_(0x80+0x40+2);
}
if(k1num==4)
{
ri++;
if(ri==31)
ri=1;
write_(0x80+0x00+8); }
if(k1num==5)
{
yue++;
if(yue>12)
yue=1;
write_nyr(5,yue);
write_(0x80+0x00+5); }
if(k1num==6)
{
nian++;
if(nian==90)
nian=0;
write_nian(1,nian);
write_(0x80+0x00+1); }
if(k1num==7)
{
s++;
if(s==24)s=0;
write_fsm(11,s);
write_(0x80+0x40+11); }
if(k1num==8)
{
f++;
if(f==59)
f=0;
write_(0x80+0x40+14);
}
}
}
}
}
void jianxian()//设置键盘减显
{
if(k1num!=0)
{
if(S3==0)//K3设置
delay(10);
if(S3==0)
{
while(!S3);
if(k1num==1)
{
miao--;
if(miao==-1)
miao=59;
write_fsm(8,miao);
write_(0x80+0x40+8);
}
if(k1num==2)
{
delay(5);
fen--;
if(fen==-1)
fen=59;
write_fsm(5,fen);
write_(0x80+0x40+5);
}
if(k1num==3)
{
shi--;
if(shi==-1)
shi=23;
write_fsm(2,shi);
write_(0x80+0x40+2); }
if(k1num==4)
{
ri--;
if(ri<1)
ri=31;
write_nyr(8,ri);
write_(0x80+0x00+8); }
if(k1num==5)
{
yue--;
if(yue<1)
yue=12;
write_nyr(5,yue);
write_(0x80+0x00+5); }
if(k1num==6)
{
nian--;
if(nian==0)
nian=90;
write_nian(1,nian);
write_(0x80+0x00+1);
}
if(k1num==7)
{
s--;
if(s==0)
s=23;
write_fsm(11,s);
write_(0x80+0x40+11);
}
if(k1num==8)
{
f--;
if(f==-1)
f=59;
write_fsm(14,f);
write_(0x80+0x40+14);
}
}
}
}
void keyk4()//S4是退出菜单键
{
if(S4==0)
{
delay(5);
if(S4==0)
TR0=1;
{
while(!S4);
k1num=0;
write_(0x0c);//开显示,不显示光标,光标不闪烁
}
}
}
void keyk1()//菜单光标设置
{
if(S1==0)
{
delay(10);
if(S1==0)
{
while(!S1);
k1num++;
TR0=0; //关定时中断
if(k1num==1)
{
write_(0x80+0x40+8);
write_(0x0f);//开显示,显示光标,光标闪烁
}
if(k1num==2)
{
write_(0x80+0x40+5);
write_(0x0f);
}
if(k1num==3)
{
write_(0x80+0x40+2);
write_(0x0f);
}
if(k1num==4)
{
write_(0x80+0x00+8);
write_(0x0f);
}
if(k1num==5)
{
write_(0x80+0x00+5);
write_(0x0f);
}
if(k1num==6)
{
write_(0x80+0x00+1);
write_(0x0f);
}
if(k1num==7)
{
write_(0x80+0x40+11);
write_(0x0f);
}
if(k1num==8)
{
write_(0x80+0x40+14);
write_(0x0f);
}
}
}
jiaxian();
jianxian();
keyk4();
}
void init()//启动LCD初始化数据
{
uchar num;
lcd_rs=0;
lcd_en=0;
shi=0;
fen=0;
miao=0;
nian=0000;
yue=7;
ri=1;
s=21;
f=48;
write_(0x38);//不监察忙信号
write_(0x0f);//显示开光标设置
write_(0x06);//显示光标移动设置
write_(0x01);//显示清屏
write_(0x80);//数据指针
write_(0x80+0x00);
for(num=0;num<16;num++)//延时15ms
{
write_data(table[num]);//年月日的数据延时
delay(5);
}
write_(0x80+0x40);
for(num=0;num<16;num++)
{
write_data(table1[num]);//时的延时
delay(5);
}
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void display()
{
if(count==20)//是秒是的时间
{
count=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
ri++;
}
if(yue==2)
{
if((nian%4==0&&nian%100!=0)|(nian%400==0))//计算闰年
{
yue29();
}
else
{
yue28();
}
}
else if((yue==4)|(yue==6)|(yue==9)|(yue==11))//计算大小月{
yue30();
}
else
{
yue31();
}
if(yue>12)
{
yue=1;
nian++;
}
{
if(nian>999)
nian=0;
write_nian(1,nian);
}
{
write_nyr(5,yue);
}
{
write_nyr(8,ri);
}
write_fsm(2,shi);
}
write_fsm(5,fen);
}
write_fsm(8,miao);
{
write_fsm(11,s);
}
{
write_fsm(14,f);
}
}
}
void yue31()//31天的月份{
if(ri>31)
{
ri=1;
yue++;
}
}
void yue30()//30天的月份{
if(ri>30)
{
ri=1;
yue++;
}
}
void yue29()//29天的月份{
if(ri>29)
{
ri=1;
yue++;
}
}
void yue28()//28天的月份
{
if(ri>28)
{
ri=1;
yue++;
}
}
void main()//主函数
{
P0=0;
init();
while(1)
{
keyk1();
display();
Timing();
if(ss==0)
{
delay(2);
if(ss==0)
{
mm++; //mm记录按键ss的按下次数
delay(5);
while(!ss);
}
}
if(mm==1)//如果ss第一次按下,开场启动秒表
{
ji++;
if(ji==100)
{
ji=0;
}
miaobiao(ji);
delay(50);
}
if(mm==3)
{
mm=0;
ji=0;
}
miaobiao(ji);
}
}
void time0() interrupt 1//定时器0设置为模式1,50毫秒的定时{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;//时钟
}
void Timing()//定时闹钟设置。

{
if(shi==s&&fen==f)
FMQ=0;
else
FMQ=1;
}
七、proteus仿真图及实物显示效果
图7 Proteus仿真图
图8实物图
八、设计总结
做了两的课程设计,有很多的心得体会,有关于单片机的,也有关于模电数电等根底科目的。

因为单片机已经很久没复习,刚拿到题目,不知道从哪入手,后来通过对书本的回忆,加深了对单片机的记忆。

有些知识会迁移和联系模电数电。

课堂教学考虑到大多数同学的需求,主要强调“根本〞——根本知识、根本理论、根本法、根本技能。

而这次设计正是为我们提供了一个深入学习、探索的时机,成为课堂教学的有益补充。

我们正面临就业问题,这次课设给了我们一个时机去试验。

单片机理论的学习是为课程的设计作准备的,但有时学习的理论也解决不了实践中的问题。

实践中获得的知识能让我对单片机的知识有更好的认识和理解。

虽然这次的课程设计我参考了一些文献资料,没有做到创新,但在对程序的读写过程中我明白了多。

这次课程设计的最大收获是只有把理论用到实践中我们才能真正掌握好所学知识。

九、参考文献
[1] 自美.电子线路设计·实验·测试[M].:华中理工大学,1992.
[2] 立民.单片机应用系统设计[M].:航空航天大学,1993.
[3] 楼然笛.单片机开发[M].:人民邮电,1994.[4] 付家才.单片机控制工程实践技术[M].:化学工业2004.3.[5] 光才.单片机课程设计实例指导[M].:航空航天大学2004.
[6] 定华.单片机原理及接口技术实验[M].:北交通大学2002.11.
[7] 湘涛.江世明.单片机原理与应用[M]. :电子工业,2006.。

相关文档
最新文档