PIC单片机电子时钟设计.docx
- 文档编号:30659753
- 上传时间:2023-08-19
- 格式:DOCX
- 页数:43
- 大小:242.40KB
PIC单片机电子时钟设计.docx
《PIC单片机电子时钟设计.docx》由会员分享,可在线阅读,更多相关《PIC单片机电子时钟设计.docx(43页珍藏版)》请在冰豆网上搜索。
PIC单片机电子时钟设计
PIC单片机电子时钟设计
摘要
单片机是一种集成电路芯片,采用超大规模技术把具有数据处理能力(如算术运算,逻辑运算、数据传送、中断处理)的微处理器(CPU),随机存取数据存储器(RAM),只读程序存储器(ROM),输入输出电路(I/O口),可能还包括定时计数器,串行通信口(SCI),显示驱动电路(LCD或LED驱动电路),脉宽调制电路(PWM),模拟多路转换器及A/D转换器等电路集成到一块单块芯片上,构成一个最小然而完善的计算机系统。
这些电路能在软件的控制下准确、迅速、高效地完成程序设计者事先规定的任务
液晶显示器(LCD)具有功耗低、体积小、重量轻、超薄等许多其他显示器无法比拟的优点,近年来被广泛用于单片机控制的智能仪器、仪表和低功耗电子产品中。
LCD可分为段式LCD、字符式LCD和点阵式LCD。
其中,段式LCD和字符式LCD只能用于字符和数字的简单显示,不能满足图形曲线和汉字显示的要求;而点阵式LCD不仅可以显示字符、数字,还可以显示各种图形、曲线以及汉字、动画,并且可以实现屏幕滚动、反转、闪烁等功能,用途十分广泛。
电子时钟主要由单片机芯片(AT89C52)、实时钟芯片(DS1302)、LCD显示器、键盘等组成。
设计思路
硬件设计:
结构框图
主要模块、单片机AT89C52参数介绍:
表1-189c52的主要性能参数
主要性能参数:
•与MCS-51产品指令和引脚完全兼容
•8k字节可重擦写Flash闪速存储器
•1000次擦写周期
•全静态操作:
0Hz—24MHz
•三级加密程序存储器
•256×8字节内部RAM
•32个可编程I/O口线
•3个16位定时/计数器
•8个中断源
•可编程串行UART通道
•低功耗空闲和掉电模式
表1-2AT89C52的极限参数
工作温度
-55℃to+125℃
储藏温度
-65℃to+150℃
任一引脚对地电压
-1.0Vto+7.0V
最高工作电压
6.6V
实时钟芯片DS1302主要性能简介:
a.实时钟能够计算时间的时、分、秒,年、月、星期、日的功能,也具有调整闰年的能力。
b.31x8位寄存存储RAM,串行I/O口方式,是的管脚数量最少
c.八脚DIP封装或可选八脚SOIC封装
d,工作电压2.0v,电流I<=300mA
e.读写实时钟后RAM数据时、有两种方式单字节传送或多字节传送
f.与VTL兼容(Vcc=5.0v)
LCD显示器说明:
液晶显示器LCD(LiquidCrystalDisplay);液晶显示器简称是利用液晶经过处理后能够改变光线传输方向的特性,达到显示字符或者图形的目的。
其特点是体积小、重量轻、功耗极低、显示内容丰富等特点,在单片机应用系统中有着日益广泛的应用。
1602芯片:
主要用于显示时间和定时时间。
1602芯片由点阵字符液晶显示器件和专用的行、列驱动器、控制及必要的链接件、结构件组装而成,可以显示数字和西文字符,但不能显示图形,已经可以满足本次设计的需要。
1602型LCD显示模块具有体积小,功耗低,显示内容丰富等特点[3]。
1602型LCD可以显示2行16个字符,有8位数据总线D0~D7和RS,R/W,EN三个控制端口,工作电压为5V,并且具有字符对比度调节和背光功能。
1.外型尺寸:
80X36X13(LXWXH)
2.接口信号说明
表1-31602型LCD的接口信号说明
编号
符号
引脚说明
编号
符号
引脚说明
1
VSS
电源地
9
D2
DataI/O
2
VDD
电源正极
10
D3
DataI/O
3
VL
液晶显示偏压信号
11
D4
DataI/O
4
RS
数据/命令选择端(H/L)
12
D5
DataI/O
5
R/W
读写选择端(H/L)
13
D6
DataI/O
6
E
使能信号
14
D7
DataI/O
7
D0
DataI/O
15
BLA
背光源正极
8
D1
DataI/O
16
BLK
背光源负极
3.主要技术参数
表1-41602型LCD的主要技术参数
显示容量
16X2个字符
芯片工作电压
4.5~5.5V
工作电流
2.0mA(5.0V)
模块最佳工作电压
5.0V
字符尺寸
2.95X4.35(WXH)mm
4.基本操作程序
读状态:
输入:
RS=L,RW=H,E=H输出:
D0~D7=状态字
读数据:
输入:
RS=H,RW=H,E=H输出:
无
写指令:
输入:
RS=L,RW=L,D0~D7=指令码,E=高脉冲输出:
D0~D7=数据
写数据:
输入:
RS=H,RW=L,D0~D7=数据,E=高脉冲输出:
无
5.RAM地址映射图
控制器内部带有80字节的RAM缓冲区,对应关系1-5表所示
表1-5对应关系
LCD
16字X2行
00
01
02
03
04
05
06
07
08
09
0A
0B
0C
0D
0E
0F
10
。
。
27
40
41
42
43
44
45
46
47
48
49
4A
4B
4C
4D
4E
4F
50
。
。
67
6.状态字说明
表1-6状态字说明
STA7
STA6
STA5
STA4
STA3
STA2
STA1
STA0
D7
D6
D5
D4
D3
D2
D1
D0
STA0~STA6
当前地址指针的数值
STA7
读写操作使能
1:
禁止;0:
允许
注意每次对控制器进行读写操作之前,都必须进行读写检测,确保STA7为0。
建模设计模块
按键按照结构原理可分为两类,一类是触点式开关按键,另一类是无触点式开关按键,这里采用触点式开关按键,因为价格便宜
按键的软件结构:
按键中有一个复位键及定时键、调时键加一键和减一键,一个按键接在复位电路上,另外四个按键接在P0——P4口,低电平表示有按钮按下;按钮没有接防抖电路,需要设计软件防抖。
1、定时。
按下定时键后可以开始定时,过程如下:
定时---〉小时加/减---〉按定时---分钟加/减---按定时。
2、调时。
按下调时键后可以调时,过程如下:
调时---年加/减---调时--月加/减---调时---日加/减---调时---时加/减---调时---分加/减---调时---秒加/减---调时。
声音提示模块
蜂鸣器:
89C52的P2.0口接了一个蜂鸣器,定时时间到,P1.0输出一定频率脉冲时,蜂鸣器将发出响声;一分钟后停止。
直流稳压电源部分
直流稳压电源是给电子设备提供稳定直流电压的电子电路。
这次电路需要的是+5V直流电源。
硬件电路测试
电路ERC测试:
如下图(a)所示,选择ERC做电路测试。
如果通过测试,则出现(b)所示界面。
ERC测试
(b)
电路原理图(硬件电路网格化图)
软件程序设计模块
程序分为主程序和子程序,主程序:
设计中采用定时器T0中断完成,其余状态循环调用显示子程序,当P3.7端口或者P1.7端口开关按下时,转入调整时间或者调整日期功能程序。
子程序:
数码管显示的数据存放在内存单元70H-75H中,其中70H~71H存放秒数据,72H~73H存放分数据,74H~75H存放时数据,每一地址单元内均为十进制BCD码。
由于采用软件动态扫描实现数据显示功能,显示用十进制BCD码数据的对应段码存放在ROM表中。
显示时,先取出70H~75H某一地址中的数据,然后查的对应的显示段码从P1口输出。
P3口将对应的数码管选中,就是显示该地址单元的数据值。
中断、调时
(1)定时器T0中断服务程序
定时器T0用于时间计时。
定时溢出中断周期设为50ms,中断累计20次(即1s)时对秒计数单元进行加1操作。
时间计数单元地址分别在70H~71H(s)、76H~77H(min)、78H~79H(h),7AH单元存放“熄灭符”数据(#0AH)。
在计数单元中采用十进制BCD码计数,满60进位。
T0中断服务程序流程图3所示。
(2)T1中断服务程序
T1中断服务程序应用于指示调整单元数字的亮闪。
在时间调整状态下,每过0.3秒,将对应单元的显示数据换成熄灭符数据(#0AH)。
这样,在调整时间时,对应调整单元的显示数据就会间隔闪亮。
(3)调时功能程序
调时功能程序的设计方法是:
按下按键,若按下时间小于1秒,进入省电状态(数码管不亮,时钟不停),否则进入调分状态,等待操作,此时计时器停止走动。
当再次按下按钮时,若按下的时间小于0.5秒,则时间加1分钟;若按下时间大于0.5秒,则进入小时调整状态。
在小时调整状态下,当按键按下的时间大于0.5秒时退出调整状态,时钟继续走动。
程序语言编译:
#include
#include
#defineLCM_RWP2_1//定义引脚
#defineLCM_RSP2_0
#defineLCM_EP2_2
#defineLCM_DataP0
#defineBusy0x80//用于检测LCM状态字中的Busy标识
#defineucharunsignedchar
sbitT_CLK=P2^5;
sbitT_IO=P2^7;
=============================================================
#include
#include
#defineLCM_RWP2_1//定义引脚
#defineLCM_RSP2_0
#defineLCM_EP2_2
#defineLCM_DataP0
#defineBusy0x80//用于检测LCM状态字中的Busy标识
#defineucharunsignedchar
sbitT_CLK=P2^5;
sbitT_IO=P2^7;
sbitT_RST=P2^6;
sbitACC0=ACC^0;
sbitACC7=ACC^7;
sbitLCD=P3^7;//背光灯输出
sbitsystem=P1^0;//模式
sbitTimerUp=P1^1;//时间加
sbitTimerDown=P1^2;//时间减
sbitSpeaker=P2^3;//蜂鸣器
voidSet(uchar,uchar);//根据选择调整相应项目
voidRTInputByte(uchar);//输入1Byte*/
ucharRTOutputByte(void);//输出1Byte*/
voidW1302(uchar,uchar);//向DS1302写入一个字节
ucharR1302(uchar);//从DS1302读出一个字节
voidSet1302(uchar*);//设置时间
voidKeySound();//按键音
voidClockSound();//闹铃
ucharinittime[7]={0x00,0x10,0x140x05,0x06,0x05,0x2011};//初始化后设置为:
2011年5月6日星期514点10分0秒
voidOut_LCM(void);//显示屏幕
voidmodel0(void);//显示输出
voidmodel1(void);
voidmodel2(void);
voidmodel3(void);
voidmodel4(void);
voidmodel5(void);
voidmodel6(void);
voidid_case1_key();//项目调整
voidModset();//模式键处理
voidWriteDataLCM(ucharWDLCM);
voidWriteCommandLCM(ucharWCLCM,BuysC);
ucharReadStatusLCM(void);
voidLCMInit(void);
voidOutputInformation(ucharX,ucharY,ucharDData);
voidDisplayListChar(ucharX,ucharY,ucharcode*DData);
voidDelay5Ms(void);
voidDelay400Ms(void);
voidsystemsetup(void);//进入系统设置
ucharcodesystemp[]={"System.setup"};//字符串输出(系统设定)
ucharcodeTIMER[]={"Time"};//字符串输出(时间)
ucharcodeDATE[]={"Date"};//字符串输出(日期)
ucharcodealarmclock[]={"Clock"};//字符串输出(闹铃)
ucharcodelamp[]={"Lamp"};//字符串输出(背光灯)
ucharcodereset[]={"Reset"};//字符串输出(时间归零)
ucharcodeexit[]={"Exit"};//字符串输出(退出)
ucharcodeset[]={"Set"};//字符串输出(设置)
ucharcodesec[]={"sec"};//字符串输出(秒)
ucharcodeClockSet[]={"ClockSet"};//字符串输出(闹铃设置)
ucharcodeClockOn[]={"ON"};//字符串输出(ON)
ucharcodeClockOff[]={"OFF"};//字符串输出(OFF)
voidtimesetup(void);//时间设置
voiddatesetup(void);//日期设置
voidalarmclockset(void);//闹铃设置
voidlampsetup(void);//背光灯设置
voidtimereset(void);//时间清零
voidmain(void)
{
Speaker=1;//关闭蜂鸣器
LED=0;//打开LED,低电平有效,外接9012驱动
Delay400Ms();//启动等待,等LCM讲入工作状态
LCMInit();//LCM初始化
TMOD=0x01;//16位定时
TH0=0x3c;//50ms
TL0=0xb0;
EA=1;
TR0=1;
ET0=1;
while
(1)
{
if(TimerDown==0)//左移键按下后把背光灯打开
{Delay5Ms();
if(TimerDown==0)
{KeySound();//蜂鸣声
LED=0;//打开背光灯
LedTime=R1302(0xc1)/16*10+R1302(0xc1)%16;}//取出背光灯时间并转换为十进制数
}
b=1;//模式键是否动作标志。
为1时不动作,为0时动作。
Modset();//调用模式键处理程序判断按键是否按下。
if(b==0)
{
KeySound();//蜂鸣声
LED=0;//打开背光灯
systemsetup();//进入系统设置模式
LedTime=R1302(0xc1)/16*10+R1302(0xc1)%16;//取出背光灯时间并转换为十进制数
}
if((LED==0)&&LedTime==0)//延时间是否到
LED=1;//关闭背光灯
if(R1302(0xc3)==1)//闹铃是否打开,0xc3为读闹铃寄存器地址。
{if((R1302(0x85)==R1302(0xc5))&&(R1302(0x83)==R1302(0xc7)))//判断闹铃时间是否到,
ClockSound();//发出闹铃蜂鸣声,无按键动作蜂鸣一分钟。
}
model0();//输出显示屏幕
}
}
voidKeySound()//按键音
{
Speaker=0;//开蜂鸣声
Delay5Ms();
Speaker=1;//关蜂鸣声
}
voidClockSound()//闹铃蜂鸣声
{
if(a==0)
{
Speaker=0;//开蜂鸣声
Delay5Ms();
Delay5Ms();
Delay5Ms();
Speaker=1;//关蜂鸣声
}
}
voidModset()//模式键处理
{if(system==0)
{
Delay5Ms();
if(system==0)
{while(system==0);
KeySound();//蜂鸣声
a=0;msec=0;b=0;//a、msec为闪烁标志,按键有动作时清零,不闪烁。
}//b为模式键确认动作。
其它程判断b是否为零时来确定模式键是否动作。
}
}
voidsystemsetup(void)//系统设置
{
model=1;
while(model!
=0)
{
Out_LCM();
if(TimerUp==0)//设置项目左移
{Delay5Ms();
if(TimerUp==0)
{a=0;msec=0;KeySound();//蜂鸣声
if(model--==1)//6种系统设置项目
model=6;
}
while(TimerUp==0);
}
if(TimerDown==0)//设置项目右移
{
Delay5Ms();
if(TimerDown==0)
{a=0;msec=0;KeySound();//蜂鸣声
if(model++==6)
model=1;
}
while(TimerDown==0);
}
b=1;//模式键是否动作标志。
为1时不动作,为0时动作。
Modset();//调用模式键处理程序判断按键是否按下。
if(b==0)
{KeySound();//蜂鸣声
switch(model)//进入项目设置
{
case1:
timesetup();break;//时间设置
case2:
datesetup();break;//日期设置
case3:
alarmclockset();break;//闹铃设置
case4:
lampsetup();break;//背光灯设置
case5:
timereset();break;//时间清零
case6:
model=0;break;//退出系统设置
}
}
}
}
voidtimesetup()//时间调整
{
id=6;
while(model==1)//model为1时进入时间调整
{
b=1;
Modset();
if(b==0)
{KeySound();//蜂鸣声
if(id++==9)//6..9为时分秒调。
.
id=6;
}
id_case1_key();//调用按键处理
Out_LCM();//显示输出
}
}
voiddatesetup()//对日期进行调整
{
id=1;
while(model==2)//model为2时进入日期调整
{b=1;
Modset();//模式键是否动作
if(b==0)
{KeySound();//蜂鸣声
if(id++==5)//1..5为年月日星期exit
id=1;
}
id_case1_key();//日期调整
Out_LCM();//显示输出
}
}
voidalarmclockset(void)//闹铃调整
{id=12;
while(model==3)//进入闹铃设置
{b=1;
Modset();//模式键是否动作
if(b==0)
{KeySound();//蜂鸣声
if(R1302(0xc3)%16==0)
{id=0;model++;}//0xc2为闹铃开关寄存器。
当为关时按下模式键时将退出闹铃设置,当开时进入闹铃时间设置
elseif(id++==15)//12..15为闹铃开关和时间设置exit
id=12;
}
id_case1_key();//调整
Out_LCM();//显示输出
}
}
voidlampsetup(void)//背光灯时间设置
{id=10;//背光灯存储空间DS1302(0xc0)
while(model==4)//model为3时进入背光灯调整
{b=1;
Modset();//模式键是否动作
if(b==0)
{KeySound();//蜂鸣声
if(id++==11)//10为背光灯exit
id=10;
}
id_case1_key();
Out_LCM();//显示输出
}
}
voidtimereset()//时间清零
{
Set1302(inittime);//清时间
W1302(0x90,0xa5);//打开充电二级管一个二级管串联一个2K电阻
model++;
}
//对相应的项目进行加、减调整。
voidid_case1_key()//按键处理
{
if(TimerUp==0)//增加
{
Delay5Ms();
if(TimerUp==0)
{a=0;msec=0;KeySound();//蜂鸣声
if((id==9)||(id==5)||(id==11)||(id==15))//当ID为9、5时按下加、减键将退出调整
{model++;//退出时间、日期设置
id=0;
}
else
Set(id,1);
}
while(TimerUp==0);
}
if(TimerDown==0)//减少
{
Delay5Ms();
if(TimerDown==0)
{a=0;msec=0;KeySound();//蜂鸣声
if((id==9)||(id==5)||(id==11)||(id==15))//当ID为9、5时按下加、减键将退出调整
{model++;//退出时间、日期设置
id=0;
}
else
Set(id,0);//调用DS1302写入函数
}
while(TimerDown==0);
}
}
voidtimer_1(void)interrupt1//中断入口,闪烁
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PIC 单片机 电子 时钟 设计