可调电子钟课程设计

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

《单片机原理及应用》课程设计说明书
设计题目:基于单片机的可调电子钟的
设计
学院:工学院
专业:电气工程及其自动化(1)班设计者:高迎亚、金鑫
学号:********、********
指导老师:吴敏、周平
设计时间:2012年5月21日~2012年6月2日
摘要 (1)
1 引言 (1)
2总体设计方案 (1)
2.1 设计原理及相关说明 (1)
2.2 总体设计框图 (1)
3各芯片设计及对其的调用 (2)
3.1 STC12C5A60S2单片机主控模块 (2)
3.2 1602LCD液晶显示模块 (8)
3.3蜂鸣器 (10)
3.4 键盘接口 (11)
4.1硬件测试 (12)
4.2软件测试 (13)
4.3测试结果分析与结论 (13)
4.3.1 测试结果分析 (14)
4.3.2 测试结论 (14)
结论 (14)
致谢 (14)
参考文献 (15)
附录1 (16)
附录2 (16)
附录3 (17)
摘要:该设计是基于STC12C5A60S2单片机的日历时钟系统,采用1602lcd液晶屏实现显示。

显示小时、分钟、秒,并设有按键以方便加入自定义调节时间
关键词:STC12C5A60S2单片机、1602LCD
1 引言
本次课程设计是是为了实现一个可调时钟,可显示小时、分钟、秒利用四个键来调时间
2 总体设计方案
本电路是由STC89C52单片机为控制核心,具有在线编程功能,低功耗,能在3V超低压工作;利用k1、k2、k3、k4四个按键分别置于P1口的4、5、6、7端口可以对时间进行控制修改。

利用P0端口使之显示于LCD12864液晶显示屏上.详细请参阅第三节的芯片介绍。

1设计原理及相关说明
2.2总体设计框图
3 各芯片的设计及其调用
3.1 STC12C5A60S2单片机主控模块
单片机的主控模块如图2,它以单片机STC12C5A60S2为核心,STC12C5A60S2系列单片机是宏晶科技生产的单时钟/机器周期(1T)的单片机,是高速/低功耗/超强抗干扰的新一代8051系列单片机,指令代码完全兼容传统8051,但速度快8-12倍。

内部集成MAX810专用复位电路,2路PWM,8路高速10位A/D转换(250K/S,即25万次/秒),针对电机控制,强干扰场合。

其主要性能特点如下:增强型8051CPU,1T,单时钟/机器周期,指令代码完全兼容传统8051;工作电压:5.5V-3.5V;工作频率范围:0-35MHz,相当于普通8051的0-420MHz;用户
应用程序空间60K字节;片上集成1280字节RAM;通用I/O口(36个),复位后为:准双向口/弱上拉(普通8051传统I/O口);可设置成4种模式:准双向口/弱上拉,强推挽/强上拉,仅为输入/高阻,开漏,每个I/O口驱动能力均能达到20mA,但整个芯片最大不要超过120mA;ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无需专用仿真器,可通过串口(P3.0/P3.1)直接下载应用程序,数秒即可完成一片;有EEPROM功能;看门狗;内部集成MAX810专用复位电路(外部晶振12M以下时,复位脚可直接1K电阻到地);A/D转换,10位精度ADC,共8路,转换速度可达250K/S;具备双串口;工作温度范围:-40 - +85o C(工业级),0 – 75o C(商业级);40管脚封装
由图2可知,单片机的18和19管脚接时钟电路,19管脚接外部晶振和微调电容的一端,在片内它是振荡器倒相放大器的输入,18管脚接外部晶振和微调电容的另一端,在片内它是振荡器倒相放大器的输出,9引脚是复位输入端,接上电容、电阻及开关后构成上电复位电路。

图2 主控制器 STC12C5A60S2
3.2 1602液晶介绍
字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式LCD,目前常用16*1,16*2,20*2和40*2行等的模块。

下面以长沙太阳人电子有限公司的1602字符型液晶显示器为例,介绍其用法。

一般1602字符型液晶显示器实
物如图- 4:
图- 4 1602字符型液晶显示器实物图
2. 1602LCD的基本参数及引脚功能
1602LCD分为带背光和不带背光两种,基控制器大部分为HD44780,带背光的比不带背光的厚,是否带背光在应用中并无差别,两者尺寸差别如下图-5所
示:
图-5 1602LCD尺寸图
1602LCD主要技术参数:
显示容量:16×2个字符
芯片工作电压:4.5—5.5V
工作电流:2.0mA(5.0V)
模块最佳工作电压:5.0V
字符尺寸:2.95×4.35(W×H)mm
引脚功能说明
1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明
如表-3所示:
编号符号引脚说明编号符号引脚说明
1 VSS 电源地9 D
2 数据
2 VDD 电源正极10 D
3 数据
3 VL 液晶显示偏压11 D
4 数据
表-3:引脚接口说明表
第1脚:VSS为地电源。

第2脚:VDD接5V正电源。

第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。

第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。

第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。

当RS 和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电
平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。

第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。

第7~14脚:D0~D7为8位双向数据线。

第15脚:背光源正极。

第16脚:背光源负极。

3. 1602LCD的指令说明及时序
1602液晶模块内部的控制器共有11条控制指令,如表-4所示:
表-4:控制命令表
1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。

(说明:1为高电平、0为低电平)
指令1:清显示,指令码01H,光标复位到地址00H位置。

指令2:光标复位,光标返回到地址00H。

指令3:光标和显示模式设置I/D:光标移动方向,高电平右移,低电平左移屏幕上所有文字是否左移或者右移。

高电平表示有效,低电平则无效。

指令4:显示开关控制。

D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示C:控制光标的开与关,高电平表示有光标,低电平表示无光标B:
控制光标是否闪烁,高电平闪烁,低电平不闪烁。

指令5:光标或显示移位S/C:高电平时移动显示的文字,低电平时移动光标。

指令6:功能设置命令DL:高电平时为4位总线,低电平时为8位总线N:低电平时为单行显示,高电平时双行显示F: 低电平时显示5x7的点阵字符,高电
平时显示5x10的点阵字符。

指令7:字符发生器RAM地址设置。

指令8:DDRAM地址设置。

指令9:读忙信号和光标地址BF:为忙标志位,高电平表示忙,此时模块不能接
收命令或者数据,如果为低电平表示不忙。

指令10:写数据。

指令11:读数据。

与HD44780相兼容的芯片时序表如下:
读状态输入RS=L,R/W=H,E=H 输出D0—D7=状态

输出无
写指令输入RS=L,R/W=L,D0—D7=指令码,E=
高脉冲
读数据输入RS=H,R/W=H,E=H 输出D0—D7=数据写数据输入RS=H,R/W=L,D0—D7=数据,E=
输出无
高脉冲
表-5:基本操作时序表
读写操作时序如图- 6和图-7所示:
图-6 读操作时序
图-7 写操作时序
4 .1602LCD的RAM地址映射及标准字库表
液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效。

要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符,图-8是1602的内部显示地址。

图-8 1602LCD内部显示地址
例如第二行第一个字符的地址是40H,那么是否直接写入40H就可以将光标定位在第二行第一个字符的位置呢?这样不行,因为写入显示地址时要求最高位D7
恒定为高电平1所以实际写入的数据应该是01000000B(40H)+10000000B(80H)=11000000B(C0H)。

在对液晶模块的初始化中要先设置其显示模式,在液晶模块显示字符时光标是自动右移的,无需人工干预。

每次输入指令前都要判断液晶模块是否处于忙的状态。

1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如图10-58所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显
示出来,我们就能看到字母“A”
图-9字符代码与图形对应图
5. 1602LCD的一般初始化(复位)过程
延时15mS
写指令38H(不检测忙信号)
延时5mS
写指令38H(不检测忙信号)
延时5mS
写指令38H(不检测忙信号)
以后每次写指令、读/写数据操作均需要检测忙信号
写指令38H:显示模式设置
写指令08H:显示关闭
写指令01H:显示清屏
写指令06H:显示光标移动设置
写指令0CH:显示开及光标设置
3.5 蜂鸣器
图12 蜂鸣器模块
本设计采用的是无源蜂鸣器如下图:
图13 无源蜂鸣器
该蜂鸣器接入电路时,靠近+极标志的管脚接+5V电源,负极接8550集电极,8550发射极接地,基极接2K电阻。

3.6 键盘接口
键盘接口电路如图13,本次设计中,按键有4个,每个按键各占用一根I/O 线,各按键相互独立,彼此的工作状态互不影响,STC单片机自带上拉电阻因此无需外接上拉电阻,用查询法完成按键功能。

图14 键盘接口电路
4.1硬件测试
电子万年历的电路系统较大,对于焊接方面更是不可轻视,庞大的电路系统中只要出于一处的错误,则会对检测造成很大的不便,而且电路的交线较多,对于各种锋利的引脚要注意处理,否则会刺被带有包皮的导线,则会对电路造成短路现象。

在本成电子万年历的设计调试中遇到了很多的问题。

回想这些问题只要认真多思考都是可以避免的,以下为主要的问题:
(1)串口下载芯片232发烫,单片机晶振不起振
(2)1602在显示时间时出现黑格子,遮挡了时间
(3)对万年历修改时间或日期时,有时时间改变2次。

解决:根据仪器的测试,发现电路引脚有接错的现象,重新焊接后晶振,复位正常,程序能够下载。

1602出现黑格子是由于在其第三引脚没加电阻分压导致,加上5K电阻后正常。

按键延时较短致使按键次数多加。

4.2软件测试
电子成年历是多功能的数字型,可以看当前日期,时间。

电子成年历功能很多,所以对于它的程序也较为复杂,所以在编写程序和调试时出现了相对较多的问题。

最后经过多次的模块子程序的修改,一步一步的完成,最终解决了软件。

在软件的调试过程中主要遇到的问题如下:
1:1602显示的时间不完整,最后在液晶初始化程序中给加上该显示的数字即可。

2:在调整时间时光标闪烁不规律,原因的由于错用DS1302停振指令所致,最后加上一个变量进行控制即可。

4.3测试结果分析与结论
4.3.1 测试结果分析
(1).在测试中遇到单片机晶振不起振、232芯片发烫,首先使用试测仪对电路进行测试,观察是否存在漏焊,虚焊,或者元件损坏.
(2).1602液晶有黑色背景出现,首先使用试测仪对电路进行测试,观察电路是否存在短路现象。

查看烧写的程序是否正确无误,对程序进行认真修改
4.3.2 测试结论
经过多次的反复测试与分析,可以对电路的原理及功能更加熟悉,同时提高了设计能力与及对电路的分析能力.同时在软件的编程方面得到更到的提高,对编程能力得到加强.同时对所学的知识得到很大的提高与巩固.
作品总结
在整个设计过程中,发挥团队精神,分工合作,充分发挥人的主观能动性,自主学习,学到了许多没学到的知识。

较好的完成了作品。

达到了预期的目的。

完了最初的设想。

在电路焊接时虽然没什么大问题,但从中也知道了焊接在整个作品中的重要性,电路工程量大,不能心急,一个个慢慢来不能急于求成。

反而达到事半功倍的效果。

对电路的设计、布局要先有一个好的构思,才显得电路板美观、大方。

程序编写中,由于思路不清晰,开始时遇到了很多的问题,经过静下心来思考,理清了思路,反而得心应手。

在此次设计中,知道了做凡事要有一颗平常的心,不要想着走捷径,一步一脚印。

也练就了我们的耐心,做什么事都在有耐心。

此次电子制作中学到了很多很多东西,这是最重要的。

总之,参加这次电子制作我的能力得到了全方位的提高。

致谢词
感谢学院给我提供了一个展现自己的舞台,给我一次难得煅炼的机会,使得我的动手能力和专业技能都有了很大的提高。

在做作品的日子里得到了指导教师的悉心指导,在此向我的指导教师致以诚挚的谢意。

感谢提供相关技术帮助的老师和同学,你们的支持和鼓励使我对这次的作品完成有了信心和动力,也给了我很多无私的帮助和支持,我在此深表谢意。

参考文献:单片机实验设计100例
附录1 系统电路原理图
附录2实物图
附录3任务书
三、设计内容
(二)基于单片机的可调电子时钟的设计
1、功能描述
以AT89S52单片机为核心的时钟,在LCD显示器或数码管上显示当前的时间:
显示格式为“时时.分分.秒秒”。

(可选用ds1302)
用4个功能键操作来设置当前时间。

功能键K1~K4功能如下。

K1—进入设置现在的时间。

K2—设置小时。

K3—设置分钟。

K4—确认完成设置。

系统采用24小时制,程序执行后工作指示灯LED闪动,表示程序开始执行,数码管显示“00.00.00”,然后开始计时。

2、设计要求:
按键输入电路的设计;单片机复位电路的设计;时钟电路的设计;
显示电路及驱动电路的设计;+5V电源原理及设计;
扫描模式的选择设计;系统主程序及子程序的设计;
元件及元件参数的选择
附录4系统程序清单
/******************************************************************************************* **
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit rs=P2^0; //定义液晶显示器控制端口sbit rw=P2^1;
sbit en=P2^2;
sbit K1=P1^0; //定义按键控制
sbit K2=P1^1;
sbit K3=P1^2;
sbit K4=P1^3;
uchar shi,fen,miao,ri,yue,nin;
uchar code table[]={" Jinxin&GYY"}; uchar code table1[]={" 00:00:57"}; uchar num,num1,count;
uint i,sh,ge,s,g;
void delay(uchar time) //延时
{
uint j;
for(;time>0;time--)
for(j=0;j<125;j++);
}
void write_com(uchar com) //写指令函数{
en=0;
rs=0;
delay(5);
P0=com;
delay(5);
en=1;
delay(5);
en=0;
}
void write_data(uchar dat) //写数据函数{
en=0;
rs=1;
delay(5);
P0=dat;
delay(5);
en=1;
delay(5);
en=0;
}
void init() //初始化
{
en=0;
rw=0;
write_com(0x38);//设置16X2显示,5X7点阵,8位数据接口write_com(0x0c);//设置开显示,不显示光标
write_com(0x06);//写一个字符后地址指针加1
write_com(0x01);//显示清零,数据指针清零
for(i=0;i<(sizeof(table)-1);i++) //第一行写
{
write_com(0x80+i);
write_data(table[i]);
}
for(i=0;i<(sizeof(table1)-1);i++) //第二行写
{
write_com(0x80+0x40+i);
write_data(table1[i]);
}
miao=56;
fen=59;
shi=23;
TMOD=0x01; //time0作为定时器工作在模式1下
TH0=(65536-50000)/256;
TL0=(65536-50000)%6;
EA=1; //开启总中断
ET0=1; //开启time0中断
TR0=1; //启动time0
}
void write_sfm(uchar add,uchar num) //时分秒函数
{
sh=num/10; //分离出十位
ge=num; //分离出个位
write_com(0x80+0x40+add); //第二行数据指针位置调整
write_data(0x30+sh); //更改显示数据的十位
write_data(0x30+ge); //更改显示数据的个位
}
void timer0() interrupt 1 //time0中断
{
TH0=(65536-50000)/256; //重装初始值
TL0=(65536-50000)%6;
count++;
if(count==20) //20次到则满一秒
{
count=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
}
write_sfm(4,shi);
}
write_sfm(7,fen);
}
write_sfm(10,miao);
}
}
void keyscan() //键盘扫描
{ if(K1==0) //按下K1
{
delay(5);
if(K1==0)
{
num1++;
while(!K1);//等待释放
if(num1==1)
{
TR0=0;
write_com(0x0e); //显示光标,不闪烁
write_com(0x80+0x40+0x0b); //数据指针移动到秒的个位处
write_com(0x0f);//显示光标,闪烁
}
if(num1==2)
{
write_com(0x80+0x40+0x08); //数据指针移到到分钟的个位处
}
if(num1==3)
{
write_com(0x80+0x40+0x05); //数据指针移到到小时的个位处
}
if(num1==4)
{
num1=0; //清零
write_com(0x0c); //重新显示
TR0=1; //重新启动计时
}
}
}
if(num1!=0) //按下K2则选择时/分/秒加1
{
if(K2==0)
{
delay(5);
if(K2==0)
{
while(!K2);
if(num1==1)
{
delay(20);
miao++;
if(miao==60)
miao=0;
write_sfm(10,miao);
write_com(0x80+0x40+0x0a);
}
if(num1==2)
{
fen++;
if(fen==60)
fen=0;
write_sfm(7,fen);
write_com(0x80+0x40+0x07);
}
if(num1==3)
{
shi++;
if(shi==24)
shi=0;
write_sfm(4,shi);
write_com(0x80+0x40+0x04);
}
}
}
}
if(num1!=0)
if(K3==0) //按下K3则选择时/分/秒减1
{
delay(5);
if(K3==0)
{
while(!K3);
if(num1==1)
{
delay(20);
miao--;
if(miao==-1)
miao=59;
write_sfm(10,miao);
write_com(0x80+0x40+0x0a);
}
if(num1==2)
{
fen--;
if(fen==-1)
fen=59;
write_sfm(7,fen);
write_com(0x80+0x40+0x07);
}
if(num1==3)
{
shi--;
if(shi==-1)
shi=23;
write_sfm(4,shi);
write_com(0x80+0x40+0x04);
}
}
}
if(num1!=0)
if(K4==0) //确定按键
{
delay(5);
if(K4==0)
{
while(!K4);
num1=0; //清零
write_com(0x0c); //重新显示
TR0=1; //重新启动计时}
}
}
void main()
{
init();
while(1)
{
keyscan();
}
}。

相关文档
最新文档