(完整版)电子时钟(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

智能电子钟(LCD显示)LED电子钟设计

智能电子钟(LCD显示)LED电子钟设计

目录1、设计目的 (1)2、系统方案设计 (1)2.1 设计任务及要求 (1)2.1.1 设计任务 (1)2.1.2 设计要求 (1)2.2 方案设计 (2)2.2.1 设计原理 (2)2.3 器件连接 (2)2.3.1 LCD1602引脚对应开发板连接图: (2)2.3.2 DS1302引脚对应开发板连接图: (3)2.4 原理图及仿真 (4)2.4.1 原理图 (4)2.4.2 仿真图: (5)3、实验结果 (5)3.1整体实现展示: (5)3.1.1 开发板上实现电子钟功能,LCD屏为亮状态: (6)3.1.2 开发板上实现电子钟功能,LCD屏为灭状态: (6)3.2 电子钟功能实现,LCD屏正常走时展示: (7)3.2.1 屏亮 (7)3.2.2 屏灭 (7)3.3 调节功能实现展示: (8)3.3.1 自动开关屏实现展示: (8)3.3.2 时钟调节功能实现展示: (9)3.3.3 自动判别闰年功能展示: (10)4、设计总计 (10)4.1 调试过程中遇到的问题 (10)4.2 心得体会 (11)5、参考文献 (11)附录:源程序 (12)项目分工表:略。

1、设计目的单片机项目设计是以课题或设计方式开展的一门课程,具有较强的综合性、实践性,是工科、工程类院校或职业类院校电类专业在校生的必修课,是将单片机原理与应用课程的理论知识转变为应用技术的重要教学环节。

这一环节不但能加深对单片机原理的理解,而且还能培养学生的实践动手能力,开发学生的分析、解决问题的能力。

单片机项目设计环节的训练能够让学生知道单片机工程项目的制作过程,使学生尽早了解单片机系统的开发流程。

掌握单片机系统的开发应用,巩固和加深已学过的知识,提高动手能力及解决实际问题的能力,同时培养团队合作精神。

将自己学到的知识更好地运用于实际当中。

2、系统方案设计2.1 设计任务及要求2.1.1 设计任务(1)根据技术要求和现有开发环境,制作智能电子钟(LCD);(2)设计系统实现方案;(3)设计并绘制电路原理图;(4)画出功能模块的程序流程图;(5)使用汇编语言(或C语言)编写实现程序(6)结合硬件调试、修改并完善程序;(7)编写课程设计报告。

电子时钟(LCD显示)课程设计说明书

电子时钟(LCD显示)课程设计说明书

目录1. 设计要求 (1)2. 时钟总体设计思路 (1)3. 系统硬件设计 (1)3.1单片机控制系统 (3)3.2 键盘控制系统设计 (3)3.3 显示电路 (4)3.4 硬件原理及说明 (4)3.5 主要性能参数 (5)4. 软件设计 (5)4.1 软件功能 (5)4.2软件设计 (6)4.3 汇编源程序 (5)5. Proteus仿真 (11)6. 课程设计总结 (12)参考文献 (13)1. 设计要求以AT89C51单片机为核心的时钟,在LED 显示器上显示当前的时间: 使用字符型LCD 显示器显示当前时间。

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

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

功能键K1~K4功能如下。

K1—设置小时。

K2—设置分钟。

K3—设置秒数。

程序执行后工作指示灯LED 闪动,表示程序开始执行,LED 显示“00:00:00”,然后开始计时。

单片机是一种集成电路芯片,采集超大规模集成电路技术把具有数据处理能力(如算数运算、逻辑运算、数据传送、中断处理)的微型处理器,随机存取数据存储器(RAM )、只读程序存储器(ROM )、输入/输出电路(I/O ),可能还包括定时/计数器、串行通信口(SCI )、显示驱动电路(LCD 或LED 驱动电路)、脉宽调制电路(PWM )、模拟多路转化器及A/D 转化器等电路集成到一片芯片上,构成一个最小而又完善的计算机系统。

这些电路能在软件的控制下准确、迅速、高效的完成程序设计者事先规定的任务。

2. 时钟的总体设计思路按照系统的设计功能要求,本时钟系统的设计必须采用单片机软件系统实现,用单片机的自动控制能力配合按键控制,来控制时钟的调整及显示。

图一 系统总原理图3. 系统硬件设计3.1 单片机控制系统本次设计时钟电路,采用了ATC89C51单片机芯片控制电路,这种单片机芯片比较简单,并且省去了很多复杂的线路,更容易表达和理解,通过按钮来调节电微型控制器 时钟电路数据显示 按键调时子钟的时、分、秒。

LCD显示的指针式电子钟

LCD显示的指针式电子钟

信息工程学院课程设计报告书题目: LCD显示的指针式电子钟专业:电子信息的科学与技术班级: 0311410学号: 031141012学生姓名:何标指导教师:高林2014年 5 月 15 日信息工程学院课程设计任务书2014年5月20 日信息工程学院课程设计成绩评定表目录1 任务提出与方案论证 (6)1.1设计要求 (6)1.2原理说明 (6)2 总体设计 (7)3 详细设计 (8)3.1 AT89C51单片机简介 (8)3.2时钟模块设计 (9)3.3 显示模块设计 (10)3.4 设置模块 (10)3.5 振荡电路 (10)3.6 复位设置 (11)4 总结 (12)参考文献 (13)附录仿真电路图 (14)摘要单片机就是微控制器,是面向应用对象设计、突出控制功能的芯片。

单片机接上晶振、复位电路和相应的接口电路,装载软件后就可以构成单片机应用系统。

本设计就是应用单片机强大的控制功能制作而成的指针式电子钟,该指针式电子钟实现如下功能:液晶屏模拟表盘与时分秒指针显示当前时钟,K1键用于选择调节对象,K2键用于调整时分秒,在按下K4键时确定调节值,时钟继续运行。

本设计采用的是AT89C51单片机,AT89C51单片机内部带有定时/计数功能,此定时功能是通过对外部晶振的脉冲进行计数,从而达到计时功能,只要使用11.0592的晶振就能实现零误差的计时,因此可以利用此功能实现计时。

芯片采用DALLAS公司的涓细充电时钟芯片DS1302,该芯片通过简单的串行通信与单片机进行通信,时钟/日历电路能够实时提供年、月、日、时分、秒信息,采用双电源供电,当外部电源掉电时能够利用后备电池准确计时。

显示器件采用PG12864LCD液晶,12864是一种图形点阵液晶显示器,它主要由行驱动器/列驱动器及128×64全点阵液晶显示器组成。

可完成图形显示,也可以显示8×4个(16×16点阵)汉字。

lcd1602液晶显示数字钟

lcd1602液晶显示数字钟

{
time[1]=0;//超过,分清零
time[0]++;//小时加1
if(time[0]>23)//是否超过23
{
time[0]=0; //小时清零
•}

}
时间计算
• void main(void)
•{

uchar i;


while(1)

{
• 计时
for(i=0;i<250;i++)//循环调用显示程序250次,实现1秒
display_code[]={0x3f,0x60,0x5b,0x4 f,0x66,0x5d,0x7d,0x07,0x7f,0x6f,0x 40}; • uchar time[4]={0,0,0,0}; //时间初 值全为0
• void delay(void);//延时0.5毫秒 •{
定时1秒
• uchar i;
• for(i=250;i>0;i--);
•}
• void display()
/*程序用于P0口接数码管的断码,P2接数码管的位码*/
•{

uchar i,k;

k=0x80;
//k初始化,指向第一位数码管

for(i=0;i<8;i++) //循环8次,i值为0~7

{

P2=0;
//关闭显示

P0=display_code[time[i]/10]; //输出十位数的断码


{

display();//调用动态显示,动态显示一次约4毫秒

}

FPGA电子钟LED+LCD显示

FPGA电子钟LED+LCD显示

1 目的和意义数字电子钟是数字电路中的一个经典学习内容。

我们选用电子钟作为最后结课项目的目的,是为了学习verilog语言、FPGA的基本知识、由顶层至底层的设计思路。

使我们对EDA知识有了个基本的了解,也掌握了基础的知识,同时锻炼了我们团队合作的精神,特别是在接口的确定上,我们学到了更多。

2 原理2.1 电子钟的计数和调节功能数字电子钟的核心内容是三个计数器,即秒钟计数器、分钟计数器和时钟计数器。

秒钟计数器的时钟为1秒的时钟,当秒钟计数器计满60,则输出一个计满信号。

秒钟的计满信号作为分钟计数器的时钟,同样,分钟计数器计满60后,则输出一个分钟计满信号,这个信号作为时钟计数器的时钟。

同时,三个计数器里面的计数值,会实时的经过译码等操作,显示在7段LED数码管和LCD上。

原理图如图2.1.图 2.1电子钟三个计数器模块图当然,作为一个电子钟,必须具备调节时间的功能。

我们使用四个按键作为时间调节按钮,分别对应秒钟调节、分钟调节、时钟调节和确定按钮。

其原理图如2.2.图2.2 电子钟计数器调节原理当电子钟不需要调节时,电子钟计数器的时钟信号是和晶振(PLL和分频器)相连的,即,此时,电子钟会自动计数。

若S4键按下,进入调节状态,那么电子钟的三个计数器的时钟信号,会连链接到按键S1、S2、S3上,这样,只要按一次S1(S2或者S3),计数器中的计数值就会增加一个。

即实现了按键调节时钟的功能。

若调节完毕,再按S4键,计数器的时钟信号又连接到晶振(PLL和分频器)上去,再次进入自动计时状态。

2.2 计数器的显示2.2.1 LED数码管的显示LED数码管的示意图如下图2.3(DE-2中的数码管多一个小数点):图2.3 七段数码管的示意图只要点亮相应的码段,即可显示相应的数字。

所以,LED数码管的显示要通过一个简单的译码器,译码表如下:表1 LED数码管的译码表2.2.2LCD显示DE-2板载的液晶为16x2液晶。

制作一个采用LCD1602显示的电子钟

制作一个采用LCD1602显示的电子钟

计算机科学与工程系实验报告实验题目:制作一个采用LCD1602显示的电子钟班级:姓名:学号:日期:一、实验目的掌握单片机使用定时器/计数器控制字符型液晶显示器LCD1602的设计与软件编程二、实验要求在LCD上显示当前的时间。

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

设有4个功能键k1~k4,功能如下:(1)k1——进入时间修改。

(2)k2——修改小时,按一下k2,当前小时增1。

(3)k3——修改分钟,按一下k3,当前分钟增1。

(4)k4——确认修改完成,电子钟按修改后的时间运行显示。

三、实验要求提交的实验报告中应包括:电路原理图、实验设计思路、C51源程序(含注释语句)、运行效果(含运行截图与说明)、实验小结三、硬件电路原理图的设计四、编程思路及C51源程序编程思路:1、实现当按下K1之后,使中断T0停止计数2、实现当按下K2之后,使小时加一3、实现当按下K3之后,使分钟加一4、实现当按下K4之后,使中断T0恢复计数源程序:#include<reg51.h>#ifndef LCD_CHAR_1602_2005_4_9#define LCD_CHAR_1602_2005_4_9#define uchar unsigned char#define uint unsigned intsbit lcdrs = P2^0;sbit lcdrw = P2^1;sbit lcden = P2^2;void delay(uint z)//延时函数,此处使用晶振为11.0592MHz {uint x,y;for(x=z;x>0;x--){for(y=110;y>0;y--){;}}}void write_com(uchar com) //写入指令数据到lcd{lcdrw=0;lcdrs=0;P3=com;delay(5);lcden=1;delay(5);lcden=0;}void write_data(uchar date) //写入字符显示数据到lcd{lcdrw=0;lcdrs=1;P3=date;delay(5);lcden=1;delay(5);lcden=0;}void init1602()//1602液晶初始化设定{lcdrw=0;lcden=0;write_com(0x3C);write_com(0x0c);write_com(0x06);write_com(0x01);write_com(0x80);}/*void write_string(uchar *pp,uint n)//采用指针的方法输入字符,n为字符数目{int i;for(i=0;i<n;i++)write_data(pp[i]);}*/void write_sfm(uchar add,uchar date)//向指定地址写入数据{uchar shi,ge;shi=date/10;ge=date%10;write_com(0x80+add);write_data(0x30+shi);write_data(0x30+ge);}#endif#define uchar unsigned char#define uint unsigned intsbit Key1 = P1^0;sbit Key2 = P1^1;sbit Key3 = P1^2;sbit Key4 = P1^3;uchar int_time;//定义中断次数计数变量uchar second;//秒计数变量uchar minute;//分钟计数变量uchar hour;//小时计数变量uchar code date[]=" H.I.T. CHINA ";//LCD第1行显示的内容uchar code time[]=" TIME 23:59:55 ";//LCD第2行显示的内容uchar second=55,minute=59,hour=23;void clock_init(){uchar i,j;for(i=0;i<16;i++){write_data(date[i]);}write_com(0x80+0x40);for(j=0;j<16;j++){write_data(time[j]);}}void clock_write( uint s, uint m, uint h){write_sfm(0x47,h);write_sfm(0x4a,m);write_sfm(0x4d,s);}void Keyscan1(){if(Key1==0) {delay(10);if(Key1==0) while(!Key1); TR0=0;}if(Key4==0) {delay(10);if(Key4==0) while(!Key4); TR0=1;}if(Key3==0){delay(10);if(Key3==0)while(!Key3);minute++;if(minute==60)minute=0;} if(Key2==0){delay(10);if(Key2==0)while(!Key2);hour++;if(hour==24)hour=0;}}void main(){init1602();//LCD初始化clock_init();//时钟初始化TMOD=0x01;//设置定时器T0为方式1定时EA=1; // 总中断开ET0=1; // 允许T0中断TH0=(65536-46483)/256;//给T0装初值TL0=(65536-46483)%256;TR0=1;int_time=0;//中断次数、秒、分、时单元清0second=55;minute=59;hour=23;while(1){clock_write(second ,minute, hour);Keyscan1();}}void T0_interserve(void) interrupt 1 using 1 //T0中断服务子程序{int_time++;//中断次数加1if(int_time==20) //若中断次数计满20次{int_time=0; //中断次数变量清0second++;//秒计数变量加1}if(second==60)//若计满60s{second=0; //秒计数变量清0minute ++;//分计数变量加1}if(minute==60)//若计满60分{minute=0;//分计数变量清0hour ++;//小时计数变量加1}if(hour==24){hour=0;//小时计数计满24,将小时计数变量清0 }TH0=(65536-46083)/256;//定时器T0重新赋值TL0=(65536-46083)%256;}五、仿真运行效果展示仿真初始状态按下k1键,进入修改模式六、实验小结通过本次实验,我掌握了LCD1602编程的方法,将所学知识运用到实践中,这是一件慢慢的过程,首先要把理论知识理解透彻,然后就是例题看懂,弄懂举一反三。

LCD12864液晶电子钟

LCD12864液晶电子钟

长沙学院《单片机原理及应用》课程设计说明书题目 LCD12864液晶显示电子钟设计系(部)专业(班级)姓名学号指导教师起止日期《单片机原理及应用》课程设计任务书系(部):专业:课题名称LCD12864液晶显示电子钟设计设计内容及要求1、课题内容:设计一种基于AT89S52 单片机的液晶显示电子时钟,要求如下:(1)、能正确显示时间、日期和星期显示格式为:时间:XX 小时:XX 分:XX 秒;日期:XX 年:XX 月:XX 日;星期:X。

(2)、时间能够由按键调整,误差小于1S。

(3)、闹钟功能:时间运行到与闹钟设定时间时,闹钟响(持续响3秒)。

(4)、报时功能:时间运行到正点时间时,闹钟响,几点钟就响几声(每声持续响2 秒,每两声之间时间间隔1 秒)。

液晶显示器第一行显示“数字电子钟”;第二行显示“当前时间”;第三行显示日期和星期;第四行显示最近一个闹钟的设定时间。

2、要求:完成该系统的硬件和软件的设计,在Proteus 软件上仿真通过,并提交一篇课程设计说明书。

设计工作量1、汇编或C51 语言程序设计;2、程序调试;3、在Proteus 上进行仿真成功,进行实验板下载调试;4、提交一份完整的课程设计说明书,包括设计原理、程序设计、程序分析、仿真分析、调试过程,参考文献、设计总结等。

进度安排起止日期设计内容(或预期目标)备注第一天课题介绍,答疑,收集材料,C51介绍第二天设计方案论证,练习编写C51程序第三天——第六天程序设计第六天——第八天程序调试、仿真第九天——第十天系统测试并编写设计说明书教研室意见年月日系(部)主管领导意见年月日目录一、整体方案设计 (4)1、单片机的选择 (4)2、单片机结构 (4)二、前期准备 (5)三、程序设计 (8)1、键盘约定 (8)2、界面显示 (9)3、全局变量的定义 (9)4、系统时钟 (9)5、闹钟控制时间的设定 (9)四、总结与体会 (10)参考文献 (11)一、整体方案设计1、单片机的选择单片微型计算机主要由微处理器、存储器、I/O接口电路等组成。

LCD12864液晶显示电子钟设计

LCD12864液晶显示电子钟设计

LCD12864液晶显示电子钟设计
介绍:
设计目标:
设计一个能够实时显示时间和日期的电子钟,能够精确地获取当前的时间,并对用户的操作作出相应的响应。

设计原理:
该电子钟设计采用了单片机ATmega16作为核心,配合RTC(实时时钟)模块,通过控制液晶显示屏来显示时间和日期。

硬件设计:
1.电源电路:使用直流电源电压为5V,通过稳压芯片将输入电压稳定在5V。

2.单片机电路:将ATmega16与晶振、复位电路、电源电路等连接起来。

3.RTC电路:通过连接RTC芯片和单片机,实现对实时时钟的读取和控制功能。

4.液晶显示屏电路:将液晶显示屏与单片机进行连接,通过单片机控制液晶显示屏的显示。

软件设计:
1.初始化:对单片机和RTC进行初始化设置。

2.获取时间:从RTC读取当前时间和日期。

3.显示时间:将获取到的时间和日期分别显示在液晶显示屏的相应位置。

4.操作功能:通过按键控制,实现对时间和日期的调整和设置功能。

设计步骤:
1.确定电路设计需求和所需元器件。

2.搭建硬件电路,完成电路连接。

3.使用相关软件进行单片机和RTC的编程设置。

4.测试整个电路是否能够正确工作,如对时间进行调整并观察液晶显示屏的显示是否准确。

5.根据需求进行适当的优化和完善设计。

总结:。

LCD数字电子钟的设计

LCD数字电子钟的设计

内蒙古科技大学智能仪表综合训练设计说明书题目:LCD数字电子钟学生姓名:王雪利学号:0967112230专业:测控技术与仪器班级:2009-2指导教师:肖俊生日期:2012-10-22LCD显示数字电子钟摘要随着科技的发展,单片机的应用正在不断深入,涉及到日常生活的方方面面。

本设计是基于单片机89C52为控制核心,以LCD1602为显示的数字时钟。

其主要功能是可正常显示时钟、日历、带有定时闹钟的多功能数字电子钟。

本设计采用89C52RC 单片机芯片作为中央处理器,内部定时器定时计数产生时钟日历信息,星期通过编程计算自动生成,并利用液晶显示屏LCD1602来显示时钟、日历、星期、闹钟等信息,通过按键来设置或校准相关信息。

本数字时钟设计的原理相对简单,所以硬件电路也相对简单,难点和重点主要放在C语言的编程上,使用到定时器的子程序、延时程序、键盘程序、液晶模块和单片机模块的初始化程序、液晶显示的程序等,各个函数交叉调用,配合主程序的运行。

关键字:电子钟; STC89C52; LCD1602;键盘;定时器第一章前言随着电子技术的不断发展,单片机技术在设计中所体现出来的优势越来越明显,它不仅是电子信息类专业的一个重要部分,而且在其他类专业工程中也是不可缺少的。

广泛地应用于家电、工业过程控制、仪器仪表、智能武器、航天和空间飞行器等领域,已成为新一代一些电子设备不可缺少的核心部件。

单片机把计算机最基本的功能电路,如CPU、程序存储器、数据存储器、I/O接口、定时、计数器、中断系统等集成到一块芯片上,形成单片形态的计算机。

单片机通常以最小系统运行,在家用电器中和常用的智能仪器仪表中常常可以“单片”工作,同时单片机在我们日常生活中叶经常见到,同时单片机在我们日常生活中也经常见到,如电子表、舞厅里的一些等国的控制、工厂一些自动化控制等。

将来只要有自动控制方面的都会离不开单片机的开发和使用,对于现代的自动化控制起着举足轻重的作用。

  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显示。

相关文档
最新文档