(完整版)电子时钟(LCD显示)

合集下载

单片机课程设计题目及答案

单片机课程设计题目及答案

题目1 智能电子钟(LCD 显示)题目2 电子时钟(LCD 显示)题目3 秒表题目4 定时闹钟题目5 音乐倒数计数器题目6 基于数字温度传感器的数字温度计题目7 基于热敏电阻的数字温度计题目8 十字路口交通灯控制题目9 波形发生器设计题目10 电容、电阻参数单片机测试系统的设计题目11 数字频率计题目12 8位竞赛抢答器的设计题目13 单词记忆测试器程序设计题目14 数字电压表设计题目15 可编程作息时间控制器设计题目16 节日彩灯控制器的设计题目17 双机之间的串行通信设计题目18 电子琴设计题目19 数字音乐盒的设计题目20 单片机控制步进电机题目21 单片机控制直流电动机题目1 智能电子钟(LCD 显示) 1. 设计要求 以AT89C51单片机为核心,制作一个LCD 显示的智能电子钟: (1) 计时:秒、分、时、天、周、月、年。

(2) 闰年自动判别。

(3) 五路定时输出,可任意关断(最大可到16路)。

(4) 时间、月、日交替显示。

(5) 自定任意时刻自动开/关屏。

(6) 计时精度:误差≤1秒/月(具有微调设置) (7) 键盘采用动态扫描方式查询。

所有的查询、设置功能均由功能键K1、K2完成。

2. 工作原理 本设计采用市场上流行的时钟芯片DS1302进行制作。

DS1302是DALLAS 公司推出的涓流充电时钟芯片,内含一个实时时钟/日历和31字节静态RAM ,可以通过串行接口与计算机进行通信,使得管脚数量减少。

实时时钟/日历电路能够计算2100年之前的秒、分、时、日、星期、月、年的,具有闰年调整的能力。

DS1302时钟芯片的主要功能特性:(1) 能计算2100年之前的年、月、日、星期、时、分、秒的信息;每月的天数和闰年的天数可自动调整;时钟可设置为24或12小时格式。

(2) 31B 的8位暂存数据存储RAM 。

(3) 串行I/O 口方式使得引脚数量最少。

(4) DS1302与单片机之间能简单地采用同步串行的方式进行通信,仅需3根线。

12864LCD电子钟说明文档

12864LCD电子钟说明文档

void lcm_w_test(bit start, unsigned char ddata) {
unsigned char start_data,Hdata,Ldata;
if(start==0)
start_data=0xf8; //0:写指令
else
start_data=0xfa; //1:写数据
while(*str != '\0'){ lcm_w_test(1,*str++);
} *str = 0; } /******************************************************************************/
2. 仿制说明
Doyoung 电子技术 将无条件共享原理图、说明文档、HEX 文件供有兴趣的朋友仿制使用。如您 成功仿制本设计,至信 @,即可获得本制作品的源代码,用于学习或升级 升级开发。如果您成功升级了一次程序将可以获得 Doyoung现在制作品的所有源代码包(不包括 日后制作品)。目的只有一个,力图创造独立资料。
按键 3:下一项 按键 4:减 1
按键 1:退出 按键 2:加 1
[Esc] 2007 [Next] 2 月 14 日 星期五
23:34.10 23.5℃ [+] 调整日期 [-]
按键 3:下一项 按键 4:减 1
按键 1:退出 按键 2:加 1
[Esc] 2007 [Next] 2 月 14 日 星期五
[Esc] 2007 [Next] 2 月 14 日 星期五
23:34.10 23.5℃ [+] 调整分钟 [-]
Байду номын сангаас
按键 3:下一项 按键 4:减 1

单片机课程设计--智能电子钟(LCD显示)

单片机课程设计--智能电子钟(LCD显示)

课程设计课程名称_ 单片机原理与接口技术题目名称多功能数字时钟学生学院_ 材料与能源学院专业班级_ 电子材料及元器件方向学号_ _学生姓名_ ____________ 指导教师_2013 年 1 月16 日广东工业大学课程设计任务书题目名称多功能数字时钟学生学院材料与能源学院专业班级姓名学号一、课程设计的内容用AT89C52单片机制作一个时钟:1.设计并绘制硬件电路图;2.布置元件并焊接好元器件;3.编写程序并将调试好的程序固化到单片机中。

4.增加温度测试功能。

二、课程设计的要求与数据单片机采用STC89C52芯片,时钟芯片采用DALLAS 公司的DS1302,即涓流充电时钟芯片,它内含有一个实时时钟/日历和31 字节静态RAM,通过简单的串行接口与单片机进行通信实时时钟/日历电路提供秒分时日日期月年的信息,每月的天数和闰年的天数可自动调整,时钟操作可通过AM/PM 指示决定采用24 或12 小时格式,DS1302 与单片机之间能简单地采用同步串行的方式进行通信。

同时用选DS18B20 传感器将采集的室内温度显示于LCD上。

按此要求设计硬件和软件以实现这些功能。

三、课程设计应完成的工作1. 完成下载线的制作,为程序下载到单片机芯片中做好准备;2. 完成软件、硬件的设计,并进行硬件的焊接制作,并将调试成功的程序固化到单片机中,最后进行硬件与软件的调试;3.撰写设计说明书。

四、课程设计进程安排摘要随着时代的进步和发展,单片机技术已经普及到我们生活,工作,科研,各个领域,已经成为一种比较成熟的技术,本文将介绍一种基于单片机控制的液晶显示温度和时钟设计,时间可由键盘调整。

主要用到的芯片有单片机STC89C52.液晶1602LCM模块.时钟芯片DS1302.温度传感器DS18B20等。

关键词:单片机STC89C52,1602LCM模块,DS1302.,DS18B20目录1 系统需求分析 (1)1.1 电子时钟研究的背景和意义 (1)1.2 系统实用功能分析 (1)2 设计要求与方案 (2)2.1 设计要求 (2)2.1.1 基本要求 (2)2.1.2发挥部分 (2)2.2 系统基本方案选择 (2)2.2.1 芯片的选择 (2)2.2.2 显示模块选择方案 (2)2.2.3 时钟信号的选择方案 (3)2.3 电路设计最终方案决定 (3)3 系统的硬件设计与实现 (3)3.1 数字钟电路设计框图 (3)3.2 系统硬件概述 (4)3.3 硬件电路结构的设计 (4)3.3.1 单片机主控制模块的设计 (4)3.3.2 显示模块的设计 (4)3.3.3 LCD原理说明 (5)3.3.4 开关模块说明 (6)4 系统的软件设计 (7)4.1 程序流程框图 (7)4.2 LCD的初始化与及显示程序 (7)5 系统调试 (9)5.1软件调试 (9)5.2硬件调试 (9)参考文献 (10)附录 (11)1 系统需求分析1.1 电子时钟研究的背景和意义20实际末,电子技术获得了飞速的发展。

LCD显示电子时钟设计

LCD显示电子时钟设计

LCD显示电子时钟设计LCD显示电子时钟是一种以液晶显示技术为基础的电子时钟设计。

液晶显示器(Liquid Crystal Display,简称LCD)是指通过操控液晶分子的取向和透光性来显示图像的显示器,具有薄、轻、便携、低功耗、对环境光适应性强等特点,因此被广泛应用于各种电子设备中。

设计一个LCD显示电子时钟的目的是为了制作一个精确显示时间的时钟装置,并且通过液晶显示器来实时显示时间。

具体的设计思路如下:1.显示屏设计:选择一款适用的液晶显示屏,通过与微控制器连接来实时显示时间。

可以选择有背光功能的液晶显示屏,以便在光线较暗的环境中也可以清晰显示。

2.微控制器选择:选择一款适用的微控制器,来控制液晶显示器的驱动和时间的计算。

常用的微控制器有PIC、AVR等,可以根据需求选择性能和功能适配的型号。

3.时钟电路设计:通过时钟电路提供准确的时间信号,并连接到微控制器中,用于计时和更新时间。

时钟电路可以通过晶振或者RTC(实时时钟芯片)实现。

4.按键输入设计:设计一组按键接口,用于调整和设置时间。

通过按键,可以实现时间的调整、闹钟设置、12/24小时制切换等功能。

5.动态电源设计:由于时钟是一个长时间运行的装置,因此需要设计一个适合的动态电源电路,以保证电源的稳定和可靠性。

可以选择使用电池供电,以应对停电等特殊情况。

6.温度补偿设计:由于液晶显示器的性能受环境温度的影响较大,可以采用温度传感器来感知环境温度,并通过微控制器对温度进行补偿,以提高LCD显示器的准确性。

7.其他功能设计:根据实际需求,可以增加其他功能模块,如闹钟、报时、温湿度检测、闪烁灯效果等。

总结起来,设计一个LCD显示电子时钟需要考虑液晶显示屏、微控制器、时钟电路、按键输入、动态电源、温度补偿等方面的因素。

通过合理的设计和电路连接,可以实现一个功能齐全、精确显示时间的电子时钟。

LCD显示的定时闹钟设计方案

LCD显示的定时闹钟设计方案

LCD显示的定时闹钟设计方案1.设计要求使用AT89C51单片机结合字符型LCD显示器设计一个简易的定时闹钟LCD 时钟,若LCD选择有背光显示的模块,在夜晚或黑暗的场合中也可使用。

定时闹钟的基本功能如下:显示格式为“时时:分分”。

由LED闪动来做秒计数表示。

一旦时间到则发出声响,同时继电器启动,可以扩充控制家电开启和关闭。

程序执行后工作指示灯LED闪动,表示程序开始执行,LCD显示“ 00:00”,按下操作键K1〜K4动作如下:(1)K1 —设置现在的时间。

(2)K2 —显示闹钟设置的时间。

(3)K3 —设置闹铃的时间。

⑷K4 —闹铃ON/OFF勺状态设置,设置为ON时连续三次发出“哗”的一声,设置为OFF发出“哗”的一声。

设置当前时间或闹铃时间如下。

(1)K1 —时调整。

(2)K2 —分调整。

(3)K3 —设置完成。

(4)K4 —闹铃时间到时,发出一阵声响,按下本键可以停止声响。

本项目的难点在于4 个按键每个都具有两个功能,以最终实现菜单化的输入功能。

采用通过逐层嵌套的循环扫描,实现嵌套式的键盘输入。

2.设计方案2.1 原理本LCD定时闹钟,是以单片机及外围接口电路为核心硬件,辅以其他外围硬件电路,用汇编语言设计的程序来实现的。

根据C51单片机的外围接口特点扩展相应的硬件电路,然后根据单片机的指令设计出数字钟相应的软件,再利用软件执行一定的程序来实现数字钟的功能。

由于采用集成芯片性的单片机来制作电子钟,这样设计制作简单而且功能多、精确度高,也可方便扩充其他功能,实现也十分简单。

本设计是利用AT89C51单片机为主控芯片,由LCD晶振、电阻、电容、发光二极管、开关、喇叭等元件组成硬件电路,通过编写软件程序来实现和控制的数字定时闹钟2.2系统总框图2.3原理及工作过程说明(1)定时闹钟的基本功能如下:(a)启动仿真软件,使用LCD液晶显示器来显示现在的时间。

(b)程序执行之后显示“ 00:00”并且LED闪烁,表示开始已经计时。

智能电子钟LCD显示仿真图和程序

智能电子钟LCD显示仿真图和程序

#include <reg52.h> #include <intrins.h>#define uint unsigned int#define uchar unsigned char#define Date P3 //数码管数据口#define com P1sbit DS1302_CLK = P1^7; //实时时钟时钟线引脚sbit DS1302_IO = P2^6; //实时时钟数据线引脚sbit DS1302_RST = P1^6; //实时时钟复位线引脚sbit ACC0 = ACC^0;sbit ACC7 = ACC^7;uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};char hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year; //秒,分,时到日,月,年位闪的计数sbit Set = P2^0; //模式切换键sbit Up = P2^1; //加法按钮sbit Down = P2^2; //减法按钮sbit out = P2^3; //立刻跳出调整模式按钮sbit di=P2^4; //蜂鸣器char done,count,temp,flag,up_flag,down_flag;uchar TempBuffer[5],week_value[2];void show_time(); //显示程序/************************ 功能: 延时,延时时间大概为ms。

**********************/void delayms(int x){int i,j;for(i=110; i>0; i--)for(j=x; j>0; j--);}void beep(){di=1;delayms(400); di=0;}/**************************名称: 数码管显示*************************/xianshi(uchar shi1,uchar shi2,uchar fen1,uchar fen2,uchar miao1,uchar miao2) {Date=table[shi1];com=0xfe;delayms(10);Date=table[shi2];com=0xfd;delayms(10);Date=table[fen1];com=0xfb;delayms(10);Date=table[fen2];com=0xf7;delayms(10);Date=table[miao1];com=0xef;delayms(10);Date=table[miao2];com=0xdf;delayms(10);}/***********1602液晶显示部分子程序*********/sbit LcdRs= P2^5;sbit LcdRw= P2^6;sbit LcdEn = P2^7;sfr DBPort= 0x80;//内部等待函数****************unsigned char LCD_Wait(void){ LcdRs=0;LcdRw=1; _nop_();LcdEn=1; _nop_();LcdEn=0;return DBPort;}//向LCD写入命令或数据******************#define LCD_COMMAND 0 // Command#define LCD_DATA 1 // Data#define LCD_CLEAR_SCREEN 0x01 // 清屏#define LCD_HOMING 0x02 // 光标返回原点void LCD_Write(bit style, unsigned char input){LcdEn=0;LcdRs=style;LcdRw=0;_nop_();DBPort=input; _nop_();//注意顺序LcdEn=1; _nop_();//注意顺序LcdEn=0; _nop_();LCD_Wait();}//设置显示模式***********************#define LCD_SHOW 0x04 //显示开#define LCD_HIDE 0x00 //显示关#define LCD_CURSOR 0x02 //显示光标#define LCD_NO_CURSOR 0x00 //无光标#define LCD_FLASH 0x01 //光标闪动#define LCD_NO_FLASH 0x00 //光标不闪动void LCD_SetDisplay(unsigned char DisplayMode){LCD_Write(LCD_COMMAND, 0x08|DisplayMode); }//设置输入模式****************************#define LCD_AC_UP 0x02#define LCD_AC_DOWN 0x00 // default#define LCD_MOVE 0x01 // 画面可平移#define LCD_NO_MOVE 0x00 //defaultvoid LCD_SetInput(unsigned char InputMode){LCD_Write(LCD_COMMAND, 0x04|InputMode);}//初始化LCD*************************void LCD_Initial(){ LcdEn=0;LCD_Write(LCD_COMMAND,0x38); //8位数据端口,2行显示,5*7点阵LCD_Write(LCD_COMMAND,0x38);LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //开启显示, 无光标LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC递增, 画面不动}//液晶字符输入的位置************************void GotoXY(unsigned char x, unsigned char y){if(y==0)LCD_Write(LCD_COMMAND,0x80|x);if(y==1)LCD_Write(LCD_COMMAND,0x80|(x-0x40));}//将字符输出到液晶显示void Print(unsigned char *str){while(*str!='\0'){LCD_Write(LCD_DATA,*str);str++;}}/***********DS1302时钟部分子程序*********/typedef struct __SYSTEMTIME__{unsigned char Second;unsigned char Minute;unsigned char Hour;unsigned char Week;unsigned char Day;unsigned char Month;unsigned char Year;unsigned char DateString[11];unsigned char TimeString[9];}SYSTEMTIME; //定义的时间类型SYSTEMTIME CurrentTime;#define AM(X) X#define PM(X) (X+12) // 转成24小时制#define DS1302_SECOND 0x80 //时钟芯片的寄存器位置,存放时间#define DS1302_MINUTE 0x82#define DS1302_HOUR 0x84#define DS1302_WEEK 0x8A#define DS1302_DAY 0x86#define DS1302_MONTH 0x88#define DS1302_YEAR 0x8Cvoid DS1302InputByte(unsigned char d){ //实时时钟写入一字节(内部函数)unsigned char i;ACC = d; for(i=8; i>0; i--){DS1302_IO = ACC0; //相当于汇编中的RRCDS1302_CLK = 1; DS1302_CLK = 0; ACC = ACC >> 1; } } unsigned char DS1302OutputByte(void){ //实时时钟读取一字节(内部函数)unsigned char i; for(i=8; i>0; i--){ ACC = ACC >>1; //相当于汇编中的RRCACC7 = DS1302_IO; DS1302_CLK = 1;DS1302_CLK = 0; } return(ACC); }void Write1302(unsigned char ucAddr, unsigned char ucDa){ DS1302_RST = 0;DS1302_CLK = 0;DS1302_RST = 1;DS1302InputByte(ucAddr); // 地址,命令DS1302InputByte(ucDa); // 写1Byte数据DS1302_CLK = 1;DS1302_RST = 0;}unsigned char Read1302(unsigned char ucAddr){ //读取DS1302某地址的数据unsigned char ucData;DS1302_RST = 0;DS1302_CLK = 0;DS1302_RST = 1;DS1302InputByte(ucAddr|0x01); // 地址,命令ucData = DS1302OutputByte(); // 读1Byte数据DS1302_CLK = 1;DS1302_RST = 0;return(ucData);}void DS1302_GetTime(SYSTEMTIME *Time){//获取时钟芯片的时钟数据到自定义的结构型数组unsigned char ReadV alue;ReadValue = Read1302(DS1302_SECOND);Time->Second = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_MINUTE);Time->Minute = ((ReadV alue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_HOUR);Time->Hour = ((ReadV alue&0x70)>>4)*10 + (ReadV alue&0x0F);ReadValue = Read1302(DS1302_DAY);Time->Day = ((ReadV alue&0x70)>>4)*10 + (ReadV alue&0x0F);ReadValue = Read1302(DS1302_WEEK);Time->Week = ((ReadValue&0x70)>>4)*10 + (ReadV alue&0x0F);ReadValue = Read1302(DS1302_MONTH);Time->Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_YEAR);Time->Year = ((ReadValue&0x70)>>4)*10 + (ReadV alue&0x0F); }void DateToStr(SYSTEMTIME *Time){ //将时间年,月,日,星期数据转换成液晶显示字符串,放到数组里DateString[] if(hide_year<2){ Time->DateString[0] = '2';Time->DateString[1] = '0';Time->DateString[2] = Time->Year/10 + '0';Time->DateString[3] = Time->Year%10 + '0';}else{ Time->DateString[0] = ' '; Time->DateString[1] = ' ';Time->DateString[2] = ' '; Time->DateString[3] = ' ';} Time->DateString[4] = '/';if(hide_month<2){Time->DateString[5] = Time->Month/10 + '0';Time->DateString[6] = Time->Month%10 + '0';}else{ Time->DateString[5] = ' '; Time->DateString[6] = ' ';}Time->DateString[7] = '/';if(hide_day<2){Time->DateString[8] = Time->Day/10 + '0';Time->DateString[9] = Time->Day%10 + '0';}else{Time->DateString[8] = ' ';Time->DateString[9] = ' '; }if(hide_week<2){//星期的数据另外放到week_value[]数组里,,因为等一下要在最后显视week_value[0] = Time->Week%10 + '0';}else { week_value[0] = ' ';}week_value[1] = '\0';Time->DateString[10] = '\0'; //字符串末尾加'\0' ,判断结束字符}void TimeToStr(SYSTEMTIME *Time){ if(hide_hour<2){ Time->TimeString[0] = Time->Hour/10 + '0';Time->TimeString[1] = Time->Hour%10 + '0';}else{ Time->TimeString[0] = ' ';Time->TimeString[1] = ' ';}Time->TimeString[2] = ':';if(hide_min<2){ Time->TimeString[3] = Time->Minute/10 + '0';Time->TimeString[4] = Time->Minute%10 + '0';}else {Time->TimeString[3] = ' ';Time->TimeString[4] = ' '; }Time->TimeString[5] = ':';if(hide_sec<2){Time->TimeString[6] = Time->Second/10 + '0';Time->TimeString[7] = Time->Second%10 + '0';}else{Time->TimeString[6] = ' ';Time->TimeString[7] = ' '; }Time->DateString[8] = '\0';}void Initial_DS1302(void) //时钟芯片初始化{ unsigned char Second=Read1302(DS1302_SECOND);if(Second&0x80) //判断时钟芯片是否关闭{Write1302(0x8e,0x00); //写入允许Write1302(0x8c,0x07); //Write1302(0x88,0x07);Write1302(0x86,0x25);Write1302(0x8a,0x07);Write1302(0x84,0x23);Write1302(0x82,0x59);Write1302(0x80,0x55);Write1302(0x8e,0x80); //禁止写入}}void Delay1ms(unsigned int count){unsigned int i,j;for(i=0;i<count;i++)for(j=0;j<20;j++);}/*延时子程序*/void mdelay(uint delay){ uint i;for(;delay>0;delay--){for(i=0;i<62;i++) //1ms延时.{;}}}void outkey() //跳出调整模式,返回默认显示{ uchar Second;if(out==0) { mdelay(8); count=0;hide_sec=0,hide_min=0,hide_hour=0,hide_day=0,hide_week=0,hide_month=0,hide_year=0;Second=Read1302(DS1302_SECOND);Write1302(0x8e,0x00); //写入允许Write1302(0x80,Second&0x7f);Write1302(0x8E,0x80); //禁止写入done=0; while(out==0); }}///////////////////////////////////////////////////////////////////////////////void Upkey()//升序按键{ Up=1;if(Up==0){mdelay(8);switch(count){case 1:temp=Read1302(DS1302_SECOND); //读取秒数temp=temp+1; //秒数加1up_flag=1; //数据调整后更新标志if((temp&0x7f)>0x59) //超过59秒,清零temp=0; break;case 2:temp=Read1302(DS1302_MINUTE); //读取分数temp=temp+1; //分数加1up_flag=1;if(temp>0x59) //超过59分,清零temp=0;break;case 3:temp=Read1302(DS1302_HOUR); //读取小时数temp=temp+1; //小时数加1up_flag=1;if(temp>0x23) //超过23小时,清零temp=0; break;case 4:temp=Read1302(DS1302_WEEK); //读取星期数temp=temp+1; //星期数加1up_flag=1;if(temp>0x7)temp=1;break;case 5:temp=Read1302(DS1302_DAY); //读取日数temp=temp+1; //日数加1up_flag=1;if(temp>0x31)temp=1;break;case 6:temp=Read1302(DS1302_MONTH); //读取月数temp=temp+1; //月数加1up_flag=1;if(temp>0x12)temp=1;break;case 7:temp=Read1302(DS1302_YEAR); //读取年数temp=temp+1; //年数加1up_flag=1;if(temp>0x85)temp=0;break;default:break;}while(Up==0); }}///////////////////////////////////////////////////////////////////////////////void Downkey()//降序按键{ Down=1;if(Down==0){ mdelay(8);switch(count){case 1:temp=Read1302(DS1302_SECOND); //读取秒数temp=temp-1; //秒数减1down_flag=1; //数据调整后更新标志if(temp==0x7f) //小于0秒,返回59秒temp=0x59;break;case 2:temp=Read1302(DS1302_MINUTE); //读取分数temp=temp-1; //分数减1down_flag=1;if(temp==-1)temp=0x59; //小于0秒,返回59秒break;case 3:temp=Read1302(DS1302_HOUR); //读取小时数temp=temp-1; //小时数减1down_flag=1;if(temp==-1)temp=0x23;break;case 4:temp=Read1302(DS1302_WEEK); //读取星期数temp=temp-1; //星期数减1down_flag=1;if(temp==0)temp=0x7;;break;case 5:temp=Read1302(DS1302_DAY); //读取日数temp=temp-1; //日数减1down_flag=1;if(temp==0)temp=31;break;case 6:temp=Read1302(DS1302_MONTH); //读取月数temp=temp-1; //月数减1down_flag=1;if(temp==0)temp=12;break;case 7:temp=Read1302(DS1302_YEAR); //读取年数temp=temp-1; //年数减1down_flag=1;if(temp==-1)temp=0x85;break;default:break;}while(Down==0); }} void Setkey()//模式选择按键{Set=1;if(Set==0){ mdelay(8); count=count+1; //Setkey按一次,count就加1 done=1; //进入调整模式while(Set==0); }}void bell(){if (Set==1);while(Set==1); }void keydone()//按键功能执行{ uchar Second;if(flag==0) //关闭时钟,停止计时{ Write1302(0x8e,0x00); //写入允许temp=Read1302(0x80);Write1302(0x80,temp|0x80);Write1302(0x8e,0x80); //禁止写入flag=1; }Setkey(); //扫描模式切换按键switch(count){case 1:do //count=1,调整秒{ outkey(); //扫描跳出按钮Upkey(); //扫描加按钮Downkey(); //扫描减按钮if(up_flag==1||down_flag==1){ //数据更新,重新写入新的数据Write1302(0x8e,0x00); //写入允许Write1302(0x80,temp|0x80); //写入新的秒数Write1302(0x8e,0x80); //禁止写入up_flag=0;down_flag=0; }hide_sec++; //位闪计数if(hide_sec>3)hide_sec=0;show_time(); //液晶显示数据}while(count==2);break;case 2:do //count=2,调整分{ hide_sec=0;outkey();Upkey();Downkey();if(temp>0x60)temp=0;if(up_flag==1||down_flag==1){ Write1302(0x8e,0x00); //写入允许Write1302(0x82,temp); //写入新的分数Write1302(0x8e,0x80); //禁止写入up_flag=0;down_flag=0; }hide_min++;if(hide_min>3)hide_min=0;show_time();}while(count==3);break;case 3:do //count=3,调整小时{ hide_min=0;outkey();Upkey();Downkey();if(up_flag==1||down_flag==1){ Write1302(0x8e,0x00); //写入允许Write1302(0x84,temp); //写入新的小时数Write1302(0x8e,0x80); //禁止写入up_flag=0;down_flag=0; }hide_hour++;if(hide_hour>3)hide_hour=0;show_time();}while(count==4);break;case 4:do //count=4,调整星期{ hide_hour=0;outkey();Upkey();Downkey();if(up_flag==1||down_flag==1){ Write1302(0x8e,0x00); //写入允许Write1302(0x8a,temp); //写入新的星期数Write1302(0x8e,0x80); //禁止写入up_flag=0;down_flag=0;}hide_week++;if(hide_week>3)hide_week=0;show_time();}while(count==5);break;case 5:do //count=5,调整日{hide_week=0;outkey();Upkey();Downkey();if(up_flag==1||down_flag==1){Write1302(0x8e,0x00); //写入允许Write1302(0x86,temp); //写入新的日数Write1302(0x8e,0x80); //禁止写入up_flag=0;down_flag=0; }hide_day++;if(hide_day>3)hide_day=0;show_time();}while(count==6);break;case 6:do //count=6,调整月{ hide_day=0;outkey();Upkey();Downkey();if(up_flag==1||down_flag==1){ Write1302(0x8e,0x00); //写入允许Write1302(0x88,temp); //写入新的月数Write1302(0x8e,0x80); //禁止写入up_flag=0;down_flag=0; }hide_month++;if(hide_month>3)hide_month=0;show_time();}while(count==7);break;case 7:do //count=7,调整年{ hide_month=0;outkey();Upkey();Downkey();if(up_flag==1||down_flag==1){ Write1302(0x8e,0x00); //写入允许Write1302(0x8c,temp); //写入新的年数Write1302(0x8e,0x80); //禁止写入up_flag=0;down_flag=0; }hide_year++;if(hide_year>3)hide_year=0;show_time();}while(count==8);break;case 8: count=0;hide_year=0;//count8, 跳出调整模式,返回默认显示状态Second=Read1302(DS1302_SECOND);Write1302(0x8e,0x00); //写入允许Write1302(0x80,Second&0x7f);Write1302(0x8E,0x80) ;//禁止写入done=0;break; //count=7,开启中断,标志位置0并退出default:break; }}void show_time() //液晶显示程序{uchar a,b,c,d,e,f,i;DS1302_GetTime(&CurrentTime); //获取时钟芯片的时间数据TimeToStr(&CurrentTime); //时间数据转换液晶字符DateToStr(&CurrentTime); //日期数据转换液晶字符GotoXY(0,1);Print(CurrentTime.TimeString); //显示时间GotoXY(0,0);Print(CurrentTime.DateString); //显示日期GotoXY(15,0);Print(week_value); //显示星期GotoXY(11,0);Print("Week"); //在液晶上显示字母weeka=CurrentTime.TimeString[0]&0x0f;b=CurrentTime.TimeString[1]&0x0f;c=CurrentTime.TimeString[3]&0x0f;d=CurrentTime.TimeString[4]&0x0f;e=CurrentTime.TimeString[6]&0x0f;f=CurrentTime.TimeString[7]&0x0f;xianshi(a,b,c,d,e,f);if(c==0&&d==0&&e==0&&f==0) //整点报时{i=a*10+b;while(i--)beep();}}void main(){ flag=1; //时钟停止标志LCD_Initial(); //液晶初始化Initial_DS1302(); //时钟芯片初始化up_flag=0;down_flag=0;done=0; //进入默认液晶显示while(1){while(done==1) keydone(); //进入调整模式while(out==0) bell(); //进入闹钟模式while(done==0&&out==1){ show_time(); //液晶显示数据flag=0; Setkey(); //扫描各功能键}}}。

(完整版)电子时钟(LCD显示)

(完整版)电子时钟(LCD显示)

电气工程及自动化专业单片机原理及应用课程设计报告姓名:XXXXXX学号:XXXXXXX专业班级:XXXXXX题目:电子时钟(LCD显示)电气与电子工程学院二〇一四年十二月三十日目录一、设计目的 (2)二、设计任务和要求 (2)三、设计原理分析 (2)四、硬件资源及其分配 (3)五、硬件图 (4)六、程序框图 (5)七、程序 (7)八、调试运行 (13)九、仿真截图 (13)十、设计心得体会 (14)一、设计目的1、设计要求以AT89C51单片机为核心的时钟,在LCD 显示器上显示当前的时间。

2、 使用字符型LCD 显示器显示当前时间。

显示格式为“时时:分分:秒秒”。

3、用4个功能键操作来设置当前时间。

4、熟悉掌握proteus 编成软件以及keil 软件的使用 二、设计任务与要求本设计以AT89C51单片机为核心,通过时钟程序的编写,并在LCD 显示器上显示出来。

该编程的核心在于定时器中断及循环往复判断是否有按键操作,并对每个按键的操作在LCD 显示器上作出相应的反应。

由于LCD 显示器每八位对应一个字符,故把秒、分、时的个位和十位分开表示。

该课题中有四个控制开关KM1、KM2、KM3、KM4分别控制时、分、秒、确定的调整,时间按递增的方式调整,每点一次按钮则相应的时间个位加以,且时间调整不干扰其他为调整时间的显示。

三、设计原理分析1、按照系统的设计功能要求,本时钟系统的设计必须采用单片机软件系统实现,用单片机的自动控制能力配合按键控制,来控制时钟的调整及显示。

图一 系统总原理图2、软件主要完成功能(1)显示时间程序用软件调节时间,通过程序的调节,最后用LED现实时钟(2)调节时间程序按键调节时间,能实现时、分的调节3、软件设计主要流程时间控制程序时间控制程序,用中断准确的控制时间,采用60进制,60秒为一分钟,60分钟为一个小时,全天设置为24小时。

四、硬件资源及原理图AT89C51芯片AT89C51 是美国ATMEL 公司生产的8 位Flash ROM 单片机。

(17)电子时钟(LCD显示)

(17)电子时钟(LCD显示)
1、课程设计报告(2000字)
2、设计能够实现上述功能的protues电路图和keil c程序。.单片机应用系统开发实例导航北京:人民邮电出版社,2003.10
2、张俊谟.单片机中级教程原理与应用北京:北京航空航天大学出版社,2000.6
3、何立民.MCS-51系列单片机应用系统设计(系统配置与接口技术)
邯郸学院《单片机》课程设计任务书
院别
信息工程学院
专业
计算机科学与技术
班级
2013级本科、2015级专接本
课程设计题目
电子时钟(LCD显示)
课程设计







一、基本内容
基于单片机设计一个电子时钟的系统。以AT89C51单片机为核心的时钟,在LCD显示器上显示当前的时间:使用字符型LCD显示器显示当前时间。显示格式为“时时:分分:秒秒”。用4个功能键操作来设置当前时间。功能键K1~K4功能如下。
K1—进入设置现在的时间。
K2—设置小时。
K3—设置分钟。
K4—确认完成设置。
程序执行后工作指示灯LED闪动,表示程序开始执行,LCD显示“00:00:00”,然后开始计时。
二、功能要求
1、根据课题,查阅相关资料
2、画出系统原理框图;
3、画出单元电路图;
4、编写相应部分程序;
5、撰写说明书
三、设计成果要求
进程安排
起止时间
完成内容
2015.12.16-2015.12.23
据任务书搜集相关的资料
2015.12.24-2015.12.30
设计并实现
2016.01.01-2016.01.01
撰写课程设计说明书
2016.01.08-2016.01.15
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

电气工程及自动化专业单片机原理及应用课程设计报告姓名:XXXXXX学号:XXXXXXX专业班级:XXXXXX题目:电子时钟(LCD显示)电气与电子工程学院二〇一四年十二月三十日目录一、设计目的 (2)二、设计任务和要求 (2)三、设计原理分析 (2)四、硬件资源及其分配 (3)五、硬件图 (4)六、程序框图 (5)七、程序 (7)八、调试运行 (13)九、仿真截图 (13)十、设计心得体会 (14)一、设计目的1、设计要求以AT89C51单片机为核心的时钟,在LCD 显示器上显示当前的时间。

2、 使用字符型LCD 显示器显示当前时间。

显示格式为“时时:分分:秒秒”。

3、用4个功能键操作来设置当前时间。

4、熟悉掌握proteus 编成软件以及keil 软件的使用 二、设计任务与要求本设计以AT89C51单片机为核心,通过时钟程序的编写,并在LCD 显示器上显示出来。

该编程的核心在于定时器中断及循环往复判断是否有按键操作,并对每个按键的操作在LCD 显示器上作出相应的反应。

由于LCD 显示器每八位对应一个字符,故把秒、分、时的个位和十位分开表示。

该课题中有四个控制开关KM1、KM2、KM3、KM4分别控制时、分、秒、确定的调整,时间按递增的方式调整,每点一次按钮则相应的时间个位加以,且时间调整不干扰其他为调整时间的显示。

三、设计原理分析1、按照系统的设计功能要求,本时钟系统的设计必须采用单片机软件系统实现,用单片机的自动控制能力配合按键控制,来控制时钟的调整及显示。

图一 系统总原理图2、软件主要完成功能(1)显示时间程序用软件调节时间,通过程序的调节,最后用LED现实时钟(2)调节时间程序按键调节时间,能实现时、分的调节3、软件设计主要流程时间控制程序时间控制程序,用中断准确的控制时间,采用60进制,60秒为一分钟,60分钟为一个小时,全天设置为24小时。

四、硬件资源及原理图AT89C51芯片AT89C51 是美国ATMEL 公司生产的8 位Flash ROM 单片机。

其最突出的优点是片内ROM 为Flash ROM,可擦写1000 次以上,应用并不复杂的通用ROM 写入器就能方便的擦写,读取也很方便,价格低廉,具有片程序ROM 二级保密系统。

因此可灵活应用于各种控制领域。

AT89C51 包含以下一些功能部件:1. 一个8 位CPU ;2. 一个片内振荡器和时钟电路;3. 4KB Flash ROM ;4. 128B 内RAM;5. 可寻址64KB 的外ROM 和外RAM 控制电路;6. 两个16 位定时/计数器;7. 21 个特殊功能寄存器;8. 4 个8 位并行I/O 口;9. 一个可编程全双工串行口;10. 5 个中断源,可设置成2 个优先级。

AT89C51 单片机一般采用双列直插DIP 封装,共40 个引脚,图2-1 为其引脚排列图。

40 个引脚大致可分为4 类:电源、时钟、控制各I/O 引脚五、硬件图六、程序框图七、程序#include <reg51.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int#define DelayNOP() {_nop_();_nop_();_nop_();_nop_();}sbit K1 =P0^0;sbit K2 =P0^1;sbit K3 =P0^2;sbit K4 =P0^3;sbit SPK=P3^0;sbit RS =P2^0;sbit RW =P2^1;sbit E =P2^2;uchar code Str1[] = " Current Time "; //一下两个字符串的串长均为16uchar code Str2[] = "Set New Time... ";uchar HMS_String[]=" 00:00:00 ";//带显示的时间串bit Settime=0; //是否修改时间bit Change_H_or_M =1;//1表示修改时.0表示修改分uchar MilliSecond,Hour =0,Minute=0, Second =0;//延时函数void DelayMS(uint x){uchar i;while(x--) for(i=0;i<120;i++);}//LCD忙状态检测bit LCD_Busy_Check(){bit result;RS = 0;RW = 1;E = 1;DelayNOP();result = (bit)(P0 & 0x80);E = 0;return result;}//写LCD命令void LCD_Write_Command(uchar cmd){while(LCD_Busy_Check());//判断LCD是否忙碌RS = 0;RW = 0;E = 0;_nop_();_nop_();P0 = cmd; DelayNOP();E = 1;DelayNOP();E = 0;}//设置LCD显示位置void LCD_Set_Pos(uchar pos){LCD_Write_Command(pos | 0x80);}//写LCD数据void LCD_Write_Data(uchar dat){while(LCD_Busy_Check());//判断LCD是否忙碌RS = 1;RW = 0;E = 0;P0 = dat; DelayNOP();E = 1;DelayNOP();E = 0;}//LCD初始化void LCD_Initialize(){LCD_Write_Command(0x38);DelayMS(1);LCD_Write_Command(0x0c);DelayMS(1);LCD_Write_Command(0x06);DelayMS(1);LCD_Write_Command(0x01);DelayMS(1);}// 显示函数,在LCD指定的行上显示字符串void Display_String(uchar*str,uchar LineNo) {uchar k;LCD_Set_Pos(LineNo);for(k=0;k<16;k++) LCD_Write_Data(str[k]);}//蜂鸣函数void Beep(){uchar i, j = 70;for(i=0;i<200;i++){while(--j);SPK= ~SPK;}DelayMS(300); SPK=0;}//时分秒显示void Display_HMS(uchar h,m,s){if(Settime) HMS_String[3] = '>';//显示修改标志else HMS_String[3] = ' '; //不显示修改标志HMS_String[4] = h/10 + '0'; //时HMS_String[5] = h%10 + '0';HMS_String[7] = m/10 + '0'; //分HMS_String[8] = m%10 + '0';HMS_String[10]= s/10 + '0'; //秒HMS_String[11]= s%10 + '0';Display_String(HMS_String,0x40);}//设置时间void Change_Time(){Settime=0;if(K1==0||K2==0||K3==0) //按下k1 k2 k3中的任何一个键即进入修改状态{TR0 = 0;Display_String(Str2,0x00); //第一行提示修改时间Settime = 1;}while (Settime){if(K1 == 0) //确定调整小时还是分钟{Beep();while(K1 == 0)Change_H_or_M = !Change_H_or_M;}else if(K2 == 0) //增加{Beep();while(K2 == 0);if(Change_H_or_M==1){if(++Hour == 24) Hour = 0;}else{if(++Minute == 60) Minute = 0;}}else if(K3 == 0) //减少Beep();while(K3 == 0);if(Change_H_or_M == 1){if(--Hour == 0xff) Hour = 23;}else{if(--Minute == 0xff) Minute = 59;}}else if(K4 == 0) //确定{Beep();while(K4 == 0);Display_String(Str1,0x00); //第一行还原显示str1 Settime = 0;TR0 = 1;}Display_HMS(Hour,Minute,Second);} //外层While在这里结束}//定时器0中断void Time0() interrupt 1{TH0 = (65536 -50000)/256;TL0 = (65536 -50000)%256; //重新装入50MS定时if(++MilliSecond == 20) //50*20=1s{MilliSecond = 0;if(++Second == 60){Second = 0;if(++Minute == 60)Minute = 0;if(++Hour == 24){Hour = 0;Minute = 0;Second = 0;}}}}}//主函数void main(){TMOD = 0x01;TH0 = (65536-50000)/256;TL0 = (65536-50000)%256;IE = 0x82;SPK = 0;LCD_Initialize();Display_String(Str1,0x00); //第一行显示TR0 = 1;P1 = 0xFF;while(1){Display_HMS(Hour,Minute,Second); //第二行显示时分秒DelayMS(500);Change_Time(); //显示过程中允许修改时间}}八、调试运行1、按硬件原理图接线用4个功能键操作来设置当前时间。

功能键K1~K4功能如下。

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

K2—设置小时。

K3—设置分钟。

K4—确认完成设置。

程序执行后工作指示灯LED闪动,表示程序开始执行,LED显示“00:00:00”,然后开始计时九、仿真截图结论:采用12MHZ晶振采用方式1定时,选取50ms采用20次中断达到一秒,采用查表方式控制LCD显示。

相关文档
最新文档