实验十一 简易电子钟设计_第1页
实验十一 简易电子钟设计_第2页
实验十一 简易电子钟设计_第3页
实验十一 简易电子钟设计_第4页
实验十一 简易电子钟设计_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、电子科技大学中山学院学生实验报告院别:电子信息学院 课程名称:微处理器实验 班级:12电信A 姓名: 学号: 实验名称:简易电子钟设计 实验时间:2014 年12月8日成绩: 教师签名: 批改时间:1、 实验原理与目的1、熟悉电子钟的基本工作原理。2、掌握简易电子钟的硬件结构及程序设计方法。电子钟是人们日常生活中不可或缺的计时工具。与数字集成电路纯硬件实现相比,采用单片机实现的电子钟,在功能、体积、功耗、成本等方面更有优势。单片机实现电子钟主要有两种方案。一种是利用单片机内部的定时/计数器产生标准秒信号,并根据时间系统的进位原则进行加1调整。另一种方法是为单片机配置一片可独立走时的实时钟(RT

2、C)芯片,单片机通过串行信号线与该芯片进行通信,读取或设置其当前时间。第一种方案结构简单、成本低,精度可满足多数场合的需要,因此,本设计采用第一种方案。图3.11.1 简易电子钟电路ZSC-1实验箱配置了简易电子钟所需的LCD1602液晶显示器、蜂鸣器、按键等外设,具体电路如图3.11.1所示。LCD1602用于电子钟的时间显示,其8位数据线连接单片机的P0口,使能端E和数据/命令寄存器选择端RS分别连接到单片机的P4.5、P4.6,读/写选择端RW固定接地,背光由单片机的P1.5控制,对比度通过VEE端所连10K电位器进行调节。按键KX0KX3分别连接到单片机的P3.2、P3.4、P3.5、

3、P3.7,可用于选择电子钟的模式、设置当前时间及闹铃等。蜂鸣器由单片机的P1.0控制,可在闹铃、整点或按键操作时发出提示声。关于LCD1602液晶显示器的结构及控制方法,可参阅理论课教材第7.4节。二、实验设备1、PC机一台(已安装Keil uVision、STC_ISP等软件);2、ZSC-1单片机实验箱一台。三、实验内容与分析1、设计程序,实现电子钟的走时功能,初始时间为12:00:00。 在Keil中编写源程序。C语言参考程序如下(请将下划线部分补充完整):/*头文件声明*#include <reg51.h> #include <string.h>/*特殊功能寄存

4、器声明*sfr P4SW = 0xBB; sfr P4 = 0xC0; /*数据类型定义*typedef unsigned char uint8;typedef unsigned int uint16;typedef struct char Hour; char Minute; char Second; tsRTClock;/*口线声明*#define LCD1602_DATA P0sbit LCD1602_RS=P46; sbit LCD1602_EN=P45; sbit LCD1602_BL=P15;/*全局变量声明* tsRTClock RTClock;uint8 Timer50ms=0

5、;/*函数原型声明*void SystemInit();void LCD1602BLCtrl(uint8 OnOff);void LCD1602CmdWrite(uint8 cmdByte);void LCD1602DataWrite(uint8 DataByte);void LCD1602Init();void LCD1602ClrScr();void LCD1602DispChar(uint8 Row, uint8 Col, char Char);void LCD1602DispStr(uint8 Row, uint8 Col, char *Str);void RTClockInit();

6、void RTClockAdj();void RTClockDisp();void Delay(uint16 ms);/*中断服务函数*void T0ISR(void) interrupt 1 T0定时中断对应优先级1 TH0=(65536-45*1024)>>8; /设置50ms定时初值(对应晶振11.0592MHz) TL0=(65536-45*1024)&0xFF; if(+Timer50ms< 20 ) return; 20*50ms=1s Timer50ms=0; /已满1s,Timer50ms清0 RTClockAdj(); /时间调整 满1s进入时间调整

7、函数/*主函数*void main() SystemInit(); /系统初始化 RTClockInit(); /时钟初始化 LCD1602ClrScr(); LCD1602DispStr(0, 0, "My name is OuDi!"); /首行显示提示信息LCD1602DispStr(1, 0, "Time: "); /第二行显示提示信息 while(1) Delay(500); RTClockDisp(); /显示当前时间 /*系统初始化函数*void SystemInit() P4SW |= 0x70; /将P44-P46设为I/O口 TMOD

8、=0x01; /T0用作定时器(方式1) TH0=(65536-45*1024)>>8; /设置50ms定时初值(对应晶振11.0592MHz) TL0=(65536-45*1024)&0xFF; TR0=1; /启动T0 ET0=1; /允许T0中断 EA=1; LCD1602BLCtrl(0); /背光点亮 LCD1602Init(); /LCD1602初始化/*LCD1602背光控制函数*void LCD1602BLCtrl(uint8 OnOff) /0:背光点亮,1:背光熄灭 LCD1602_BL=OnOff ; /此处若填0,背光灯就会常亮,不妥 /*LCD16

9、02写命令函数*void LCD1602CmdWrite(uint8 cmdByte) uint16 i; for(i=100;i;i-); /适当延时(取代忙状态检测) LCD1602_RS= 0 ; LCD1602_EN=1; LCD1602_DATA=cmdByte; /发送命令字节 LCD1602_EN=0;/*LCD1602写数据函数*void LCD1602DataWrite(uint8 DataByte) uint16 i; for(i=100;i;i-); /适当延时(取代忙状态检测) LCD1602_RS= 1; LCD1602_EN=1; LCD1602_DATA=Data

10、Byte; /发送数据字节 LCD1602_EN=0;/*LCD1602初始化函数*void LCD1602Init() LCD1602_EN=0; LCD1602CmdWrite( 0x38 ); /8位总线方式,两行显示,5*7点阵 LCD1602CmdWrite(0x0C); /LCD显示开,无光标 LCD1602CmdWrite(0x06); /写入一个数据字节后地址计数器自动加1/*LCD1602清屏函数*void LCD1602ClrScr() LCD1602CmdWrite(0x01); /发送清屏命令 Delay(8);/*LCD1602字符显示函数*void LCD1602D

11、ispChar(uint8 Row, uint8 Col, char Char) if(Row) 此处Row表示,若Row=1(第二行)执行下面程序, Col |= 0x40; /显示第二行时DDRAM地址从40H开始 Col |= 0x80; /拼为DDRAM地址设置命令 LCD1602CmdWrite(Col); /发送DDRAM地址 LCD1602DataWrite(Char); /发送ASCII码/*LCD1602字符串显示函数*void LCD1602DispStr(uint8 Row, uint8 Col, char *Str) if(Row) Col |= 0x40; /显示第二

12、行时DDRAM地址从40H开始 Col |= 0x80; /拼为DDRAM地址设置命令 LCD1602CmdWrite(Col); /发送DDRAM地址 while(*Str) /直到找到结束符。否则继续发送ASCII码 LCD1602DataWrite(*Str+); /连续发送每个字符的ASCII码/*电子钟初始化函数*void RTClockInit() RTClock.Hour=12; /默认从12:00:00开始走时 RTClock.Minute=0; RTClock.Second=0;/*电子钟时间调整函数*void RTClockAdj() if(+RTClock.Second&

13、lt; 60 ) return; RTClock.Second=0; if(+RTClock.Minute< 60 ) return; RTClock.Minute=0; if(+RTClock.Hour< 24 ) return; RTClock.Hour=0; /*电子钟显示更新函数*void RTClockDisp()若hour<10,即只保留各位,例9时,而不是09,人性化 if(RTClock.Hour>=10) LCD1602DispChar(1,6,0x30+RTClock.Hour/10); /显示Hour的十位 else LCD1602DispChar

14、(1,6,' '); /Hour的十位为0则隐去 LCD1602DispChar(1,7,0x30+RTClock.Hour%10); /显示Hour的个位 LCD1602DispChar(1,8,':'); 显示数字的ASCII码,上下同 LCD1602DispChar(1,9,0x30+RTClock.Minute/10); /显示Minute的十位 LCD1602DispChar(1,10,0x30+RTClock.Minute%10); /显示Minute的个位表示显示的位置位第2行第13位,上下同 LCD1602DispChar(1,11,':'); LCD1602DispChar(1,12,0x30+RTClock.Second/10);

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论