1602lcd显示的秒表报告
- 格式:doc
- 大小:1.92 MB
- 文档页数:17
1602lcd显示的秒表(1)目录7、2个串行中断,可编程UART串行通道;8、2个外部中断源,共8个中断源;9、2个读写中断口线,3级加密位;10、低功耗空闲和掉电模式,软件设置睡眠和唤醒功能;11、有PDIP、PQFP、TQFP及PLCC等几种封装形式,以适应不同产品的需求。
STC89C52为8 位通用微处理器,采用工业标准的C51内核,在内部功能及管脚排布上与通用的8xc52 相同,其主要用于会聚调整时的功能控制。
功能包括对会聚主IC 内部寄存器、数据RAM及外部接口等功能部件的初始化,会聚调整控制,会聚测试图控制,红外遥控信号IR的接收解码及与主板CPU通信等。
主要管脚有:XTAL1(19 脚)和XTAL2(18 脚)为振荡器输入输出端口,外接12MHz 晶振。
RST/Vpd(9 脚)为复位输入端口,外接电阻电容组成的复位电路。
VCC(40 脚)和VSS(20 脚)为供电端口,分别接+5V电源的正负端。
P0~P3 为可编程通用I/O 脚,其功能用途由软件定义,在本设计中,P0 端口(32~39 脚)被定义为N1 功能控制端口,分别与N1的相应功能管脚相连接,13 脚定义为IR输入端,10 脚和11脚定义为I2C总线控制端口,分别连接N1的SDAS(18脚)和SCLS(19脚)端口,12 脚、27 脚及28 脚定义为握手信号功能端口,连接主板CPU 的相应功能端,用于当前制式的检测及会聚调整状态进入的控制功能。
P0 口:P0 口是一组8 位漏极开路型双向I/O 口,也即地址/数据总线复用口。
作为输出口用时,每位能吸收电流的方式驱动8 个TTL逻辑门电路,对端口P0 写“1”时,可作为高阻抗输入端用。
在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8 位)和数据总线复用,在访问期间激活内部上拉电阻。
在Flash 编程时,P0 口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻。
目录1 概述 01.1 1602LCD研究的历史背景和意义 01.2 1602LCD研究的发展和现状 02 课题方案设计 02.1系统设计目的 02.2系统结构模块论证 (1)2.2.1 显示部分 (1)3 系统硬件设计 (1)3.1 总体设计 (1)3.2 单片机运行的最小系统 (2)3.2.1 电源电路 (2)3.2.2晶振电路 (2)3.2.3复位电路 (3)3.3 显示电路 (4)3.3.1引脚说明: (4)3.4 单片机STC89C52 (5)3.4.1主要特性 (5)3.4.2功能特性概述 (6)3.4.3主要引脚及芯片基本工作条件说明 (6)4 系统软件设计 (7)4.1 总流程图 (7)4.2 最小系统检测电路程序 (8)4.3 编程调试界面 (9)4.4 Proteus仿真结果 (9)5软硬件联调及调试结果 (10)5.1 实物图 (10)5.2 调试结果 (11)结束语 (12)参考文献 (12)附录2 1602LCD设计的秒表PCB图 (14)附录3 1602LCD设计的秒表Proteus仿真图 (15)附录4 1602LCD设计的秒表C语言程序清单 (15)附录5 基于单片机的1602LCD设计的秒表元器件目录表 (21)1 概述1.1 1602LCD研究的历史背景和意义LCD1602是16字乘以2行的字符型液晶模板。
其特点是:(1)位数多,可显示32位。
(2)显示内容丰富,可显示所有数字、字母、符号等192种ASCII码对应的字符。
(3)程序简单1.2 1602LCD研究的发展和现状液晶显示模块具有体积小、功耗低、显示内容丰富、超薄轻巧等优点,在袖珍式仪表和低功耗应用系统中得到广泛的应用。
目前字符型液晶显示模块已经是单片机应用设计中最常用的信息显示器件。
LCD1602液晶显示模块,它可以显示两行,每行16个字符,采用单+SV电源供电,外围电路配置简单,价格便宜,具有很高的性价比。
源程序代码://名称:用1602LCD设计的秒表//说明:首先按下K1键时开始计时,自此按下时暂停,第三次按下时继续累积计时,再次按下时停止计时,K2键用于清零秒表。
//#include <reg51.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int#define delayNOP ( ) ﹛_nop_( ); _nop_( ); _nop_( ); _nop_( );﹜//LCD控制函数void LCD_Initialize( );void LCD_Set_POS(uchar);void LCD_Write_Date(uchar);void Display_String(uchar﹡,uchar);sbit K1 = P1^0;sbit K2 = P1^1;sbit BEEP = P3^0;sbit LCD_RS = P2^0;sbit LCD_RW = P2^1;sbit LCD_EN = P2^2;uchar KeyCount = 0;uchar code msg1[] = ﹛〞Second Watch 0 〞﹜;uchar code msg2[] = ﹛〞>>>> 0 〞﹜;uchar code Prompts[] [16] ={﹛〞:: 1- - - - > 〞﹜,﹛〞:: 1- - - - > ::2 〞﹜,﹛〞:: 1 - >2 ::3- - > 〞﹜,﹛〞:: 1 - >2 ::3- - >4 〞﹜};// 计时缓冲与显示缓冲uchar Time_Buffer[] ={0,0,0,0};uchar LCD_Display_Buffer[]={〞00: 00: 00:00〞}; //// 蜂鸣器//void Beep ()﹛uchar i,j = 70;for (i = 0;i< 180;i++ )﹛while(--j);BEEP = ~BEEP;﹜BEEP = 0;﹜//// 延时//void DelayX(uint ms){uchar i;while(ms--) for (i= 0;i< 120;i++);﹜//// 显示计时//void Show_Second( ){uchar i;LCD_Set_POS(0x45); //设置LCD显示起点for(i = 3;i != 0xff ;i--);{//将两位整数的1/100s,秒,分,时转换为8位数字字符LCD_Display_Buffer[2﹡i+1] = Time_Buffer[i] / 10 + ˊ0 ˊ;LCD_Display_Buffer[2﹡i] = Time_Buffer[i] % 10 + ˊ0 ˊ;//在 = 3,2,1,0时分别显示时,分,秒,1/100sLCD_Writer_Date(LCD_Display_Buffer[2﹡i+1])LCD_Writer_Date(LCD_Display_Buffer[2﹡i])LCD_Writer_Date(ˊ: ˊ)}}//// Time0中断//Void Time0( ) interrupt 1 using 0{THO = -10000 / 256;TLO = -10000 % 256;Time_Buffer[0] ++if(Time_Buffer[0] == 100){Time_Buffer[0] = 0; Time_Buffer[1]++;}if(Time_Buffer[1] == 60) //秒{Time_Buffer[1] = 0; Time_Buffer[2]++;}if(Time_Buffer[2] == 60) //分{Time_Buffer[2] = 0; Time_Buffer[3]++;}if(Time_Buffer[3] == 24) //时Time_Buffer[3] = 0;}////主函数//void main( ){uchar i;IE = 0x82;TMOD = 0x01;THO = -10000 / 256;TLO = -10000 % 256;LCD_Initialize( );Display_String(msg1,0x00);Display_String(msg2,0x40);While(1){if(k1 == 0){DelayX(100);i = ++KeyCount;switch (i){case 1:case 3: TRO = 1;Display_String(Prompts[i-1],0);Break;case 2:case 4: TRO = 0;Display_String(Prompts[i-1],0);break;default:TRO = 0;break;}While (K1 == 0); // 等待释放K1键Beep( );}elseif(K2 == 0){TRO = 0;KeyCount = 0;for(i = 0;i < 4; i++)Time_Buffer [i] = 0; // 清零计数缓冲Display_String(msg1,0);Beep( );DelayX(100);while (K2 == 0); // 等待释放K2键}Show_Second( );}}//// 1602LCD显示驱动函数//#include 〈reg51.h〉#include 〈intrins.h〉#define uchar unsigned char#define uint unsigned int#define DellayNOP( )﹛_nop_( ); _nop_( ); _nop_( ); _nop_( );﹜sbit LCD_RS = P2^0;sbit LCD_RW = P2^1;sbit LCD_EN = P2^2;bit LCD_Busy_Check( );void LCD_Initialize( );void LCD_Set_POS(uchar);void LCD_Write_Command(uchar);void LCD_Write_ Date(uchar);//// 延时//void DelayMS(uint ms){uchar t;while(ms--) for (t =0;t < 120;t++);}//// LCD忙检查//bit LCD_Busy_Check( );{bit Rsult;LCD_RS = 0; LCD_RW = 1; LCD_EN = 1;DelayNOP( );Result = (bit)(p0 ﹠ 0x80);LCD_EN = 0return Result;}//// 向LCD写指令//void LCD_Write_Command(uchar cmd);{while(LCD_Busy_Check() );LCD_RS = 0; LCD_RW = 0; LCD_EN = 0;_nop_( ); _nop_( );pO = cmd; DelayNOP( );LCD_EN = 1;DelayNOP( );LCD_EN = 0;}//// 向LCD写数据//void LCD_Write_Date(uchar str);{while(LCD_Busy_Check() );LCD_RS = 1; LCD_RW = 0; LCD_EN = 0;pO = str; DelayNOP( ); LCD_EN = 1;DelayNOP( );LCD_EN = 0;}//// 初始化LCD//void LCD_Initialize( );{DelayMS(5); LCD_Write_Command(0x38);DelayMS(5); LCD_Write_Command(0x0c);DelayMS(5); LCD_Write_Command(0x06);DelayMS(5); LCD_Write_Command(0x01);DelayMS(5);}//// 设置显示位置//void LCD_Set_POS(uchar Poition){LCD_Write_Command(Position ︱ 0x80);}////显示函数,在LCD指定行上显示字符串//void Display_String(uchar﹡str,uchar LineNO) {uchar k;LCD_Set_POS(LineNO);for (k = 0;k < 16;k++) LCD_Write_Date(str[k]) }。
目录1概述 (1)1.1课题的研究意义和目的 (1)2方案论证 (1)2.1 STC89C52主要功能特性 (1)2.2系统分析 (3)3硬件系统的设计 (3)3.1硬件介绍 (3)3.2部分硬件原理图 (4)3.3最小单片机系统 (5)4系统的软件设计 (5)5软硬件联调 (7)5.1正面图 (7)5.2反面接线 (8)5.3测试结果 (8)结束语 (9)参考文献 (9)附录 (10)附录1 protel原理图 (10)附录2 PCB图 (11)附录3 protues仿真图 (12)附录4 程序清单 (12)附录5元器件清单 (17)1概述1.1课题的研究意义和目的1、通过本实验的设计初步了解单片机工作原理和各功能端口的相关设置;2、掌握PROTEUS软件的安装和配置过程;3、学会绘制电路原理图;4、了解装载程序和调试;5、PROTEUS VSM 与uVision3的联调;6、用单片机仿真软件,并进行调试;7、掌握单片机相应的编程步骤,了解秒表相关的工作流程;8、熟悉KEIL\PROTEUS等相关软件的使用。
2方案论证2.1 STC89C52主要功能特性1、兼容MCS51指令系统2、8k可反复擦写(大于1000次)Flash ROM;3、32个双向I/O口;4、256x8bit部RAM;5、3个16位可编程定时/计数器中断;6、时钟频率0-24MHz;7、2个串行中断,可编程UART串行通道;8、2个外部中断源,共8个中断源;9、2个读写中断口线,3级加密位;10、低功耗空闲和掉电模式,软件设置睡眠和唤醒功能;11、有PDIP、PQFP、TQFP及PLCC等几种封装形式,以适应不同产品的需求。
STC89C52为8 位通用微处理器,采用工业标准的C51核,在部功能及管脚排布上与通用的8xc52 相同,其主要用于会聚调整时的功能控制。
功能包括对会聚主IC 部寄存器、数据RAM及外部接口等功能部件的初始化,会聚调整控制,会聚测试图控制,红外遥控信号IR的接收解码及与主板CPU通信等。
/**efenwu*GDUT*09-*-**/#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intuchar code welcom[16]={" Welcome! "}; uchar idata timer[16]={" 22:55:33 "}; uchar timecount;sfr WDT_CONTR=0xe1;sbit RS=P1^0;sbit RW=P1^1;sbit EN=P1^2;bit timeflag;void delay(uint time){uint x,y;for(x=time;x>0;x--)for(y=112;y>0;y--);}bit LcdBusy(void){bit result;P2 =0xff;//"这里要拉高,切记"EN = 0;RS = 0;RW = 1;EN = 1;_nop_();_nop_();_nop_();_nop_();result=(bit)(P2&0x80);_nop_();EN=0;return result;}void WriteData(uchar Data){while(LcdBusy());RS = 1;RW = 0;EN = 0;;P2 = Data;EN = 1;_nop_(); //"写数据、命令下降沿有效《》读数据、命令高电平有效"_nop_();EN = 0;}void WriteCom(uchar Com,bit test){if(test){ while(LcdBusy());}RS = 0;RW = 0;EN = 0;P2 = Com;EN = 1;_nop_();_nop_();EN = 0;}void IntiLcd(void){delay(15);WriteCom(0x38,0);delay(5);WriteCom(0x38,0);delay(5);WriteCom(0x38,0);WriteCom(0x38,1);WriteCom(0x08,1);WriteCom(0x01,1);WriteCom(0x06,1);WriteCom(0x0c,1);}void LcdXY(uchar y,uchar x){uchar addr;addr=(y-1)*0x40+(x-1);WriteCom(addr|0x80,1);}void DisString(uchar *Matric){uchar i;for(i=0;i<16;i++)WriteData(Matric[i]);}void timer0(void)interrupt 1{TH0 = (65536-50000)/256;TL0 = (65536-50000)%256;if(++timecount>=20){timecount =0;timeflag =1;}}void Watch(void){if(timeflag){timeflag=0;if(++timer[11]>=':'){timer[11]='0';if(++timer[10]>='6'){timer[10]='0';if(++timer[8]>=':'){timer[8]='0';if(++timer[7]>='6'){timer[7]='0';if(++timer[5]>=':'){timer[5]='0';timer[4]++;}if((timer[5]>='4')&&(timer[4]>='2')){timer[5]='0';timer[4]='0';}}}}}LcdXY(2,1);DisString(timer);}}void Inti(void){TMOD = 0x01;TH0 = (65536-50000)/256;TL0 = (65536-50000)%256;EA = 1;ET0 = 1;timecount =0;timeflag =0;}int main(){WDT_CONTR=0x35;Inti();IntiLcd();LcdXY(1,1);DisString(welcom);LcdXY(2,1);DisString(timer);TR0=1;while(1){Watch();WDT_CONTR=0x35;}return 0;}。
单片机及嵌入式设计姓名:班级:信息工程学号:学院:信息科学与技术学院一、题目51秒表二、设计要求我们设计的是一个1602液晶显示的秒表,计时精度达到0.1秒,另外有两个独立的按键对秒表进行控制,一个键控制计时的开始,一个键控制计时的停止。
三、使用的系统平台软件平台:keil51keil51是美国keil software出品的51系列兼容单片机C语言软件开发系统,是众多单片机开发软件之一,它支持众多不同公司的MCS51架构的芯片,它集编辑,编译,仿真于一体,同时还支持PLM、汇编、和C语言的程序设计,它的界面和常用的微软VC++的界面相似,界面友好,易学易用,在调试程序,软件仿真方面也有强大的功能。
硬件平台:STC89C52单片机、1602液晶显示器、按钮、发光二极管 STC89C52单片机:STC89C52是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash存储器。
STC89C52使用经典的MCS-51内核,但做了很多的改进使得芯片具有传统51单片机不具备的功能。
在单芯片上,拥有灵巧的8 位CPU和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
具有以下标准功能: 8k字节Flash,512字节RAM, 32 位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,3个16 位定时器/计数器,4个外部中断,一个7向量4级中断结构(兼容传统51的5向量2级中断结构),全双工串行口。
另外 STC89X52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。
空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
最高运作频率35MHz,6T/12T可选。
1602液晶显示器:1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。
XXXX学院实验报告Experimentation Report of Taiyuan Normal University系部计算机年级大三课程单片机原理与接口技术姓名同组者日期学号项目 LCD1602显示时钟一、实验目的1、了解单片机顺序执行的特点;2、掌握C语言的编写和keilc51的使用;3、熟悉DS1302芯片的工作过程二、实验仪器硬件资源:单片机开发板笔记本电脑 DS1302芯片;软件资源:软件 Keil uVision5;三、实验原理1、流程图2、连接图四、实验结果将LCD屏连接到单片机上,点击编译运行,LCD屏上显示时间:2013-01-01 2 12-00-38。
在DS1302.c文件里修改uchar TIME[7] = {0, 0, 0x12, 0x01, 0x01,0x02, 0x13};为uchar TIME[7] = {0x14, 0x11, 0x19, 0x28, 0x11,0x04, 0x19};点击编译运行按钮,LCD屏幕显示2019-11-28 4 19-11-14。
四、实验代码及分析//主函数void main(){Ds1302Init(); //初始化DS1302LcdInit(); //初始化LCDwhile(1){Ds1302ReadTime(); //DS1302读时间LcdDisplay(); //LCD显示时间}}//初始化DS1302void Ds1302Init(){uchar n;Ds1302Write(0x8E,0X00); //禁止写保护,就是关闭写保护功能for (n=0; n<7; n++) //写入7个字节的时钟信号:分秒时日月周年{Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]);}Ds1302Write(0x8E,0x80); //打开写保护功能}//读取时钟信息void Ds1302ReadTime(){uchar n;for (n=0; n<7; n++) //读取7个字节的时钟信号:分秒时日月周年{TIME[n] = Ds1302Read(READ_RTC_ADDR[n]);}}//---DS1302写入和读取时分秒的地址命令---////---秒分时日月周年最低位读写位;-------//uchar code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d}; uchar code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};//---DS1302时钟初始化2013年1月1日星期二12点00分00秒。
今日做一个简单1602应用案例—-设计一个秒表。
要求:具有秒表启动和复位功能按键,秒表计时时间实时显示在LCD1602。
1.系统的硬件电路原理图:2.系统的程序设计2.1 头文件、全局变量和函数的声明#include “LCD_1602.h”#includeunsigned char Disp_Buffer[10];//这个可以稍微设置大一点,不影响结果显示,显示的时候遇到字符串结束标志就结束//定义二个位变量,分别对应按键开始按键和停止复位按键sbit key_set=P3^2;sbit key_reset=P3^3;unsigned char TIme_count=0;unsigned int TIme_S=0;void TImer_inial();//定时器初始化void delay(unsigned int i);//延时函数void start();//启动秒表void stop();//停止复位秒表void second_cal_show();//秒的计算与显示2.2 主程序主程序主要完成显示屏的初始化和初始化显示、定时器的初始化,注意定时初始化的时候不启动。
启动有开始按键控制,不按下开始键不启动定时器。
初始化完了,在while循环中调用start();确定是否启动定时器,调用stop();根据按键状态确定是否停止秒表并复位;调用second_cal_show(); 进行秒的计算和显示。
void main(){InitLcd1602();LcdShowStr(0, 0, “Current : 0 S”);LcdShowStr(0, 1, “Last: 0 S”);TImer_inial();while(1){start();stop();second_cal_show();}}2.3 子程序2.3.1 初始定时器:定时器T0工作在模式1,定时器定时时间0.02秒。
void timer_inial(){TMOD = 0X01;//TH0=0XB8;//定时0.02sTL0=0X00;}2.3.2 延时函数:软件延时,主要用按键软件消抖//延时函数void delay(unsigned int i){unsigned int k;for(k=0;k2.3.3 启动函数:检测按键是否按下,按键如果按下则启动定时器T0,并从0开始计数。
目录1概述 (1)1.1课题的研究意义和目的 (1)2方案论证 (1)2.1 STC89C52主要功能特性 (1)2.2系统分析 (3)3硬件系统的设计 (3)3.1硬件介绍 (3)3.2部分硬件原理图 (4)3.3最小单片机系统 (5)4系统的软件设计 (5)5软硬件联调 (7)5.1正面图 (7)5.2反面接线 (8)5.3测试结果 (8)结束语 (8)参考文献 (9)附录 (9)附录1 protel原理图 (9)附录2 PCB图 (10)附录3 protues仿真图 (11)附录4 程序清单 (11)附录5元器件清单 (16)1概述1.1课题的研究意义和目的1、通过本实验的设计初步了解单片机工作原理和各功能端口的相关设置;2、掌握PROTEUS软件的安装和配置过程;3、学会绘制电路原理图;4、了解装载程序和调试;5、PROTEUS VSM 与uVision3的联调;6、用单片机仿真软件,并进行调试;7、掌握单片机相应的编程步骤,了解秒表相关的工作流程;8、熟悉KEIL\PROTEUS等相关软件的使用。
2方案论证2.1 STC89C52主要功能特性1、兼容MCS51指令系统2、8k可反复擦写(大于1000次)Flash ROM;3、32个双向I/O口;4、256x8bit内部RAM;5、3个16位可编程定时/计数器中断;6、时钟频率0-24MHz;7、2个串行中断,可编程UART串行通道;8、2个外部中断源,共8个中断源;9、2个读写中断口线,3级加密位;10、低功耗空闲和掉电模式,软件设置睡眠和唤醒功能;11、有PDIP、PQFP、TQFP及PLCC等几种封装形式,以适应不同产品的需求。
STC89C52为8 位通用微处理器,采用工业标准的C51内核,在内部功能及管脚排布上与通用的8xc52 相同,其主要用于会聚调整时的功能控制。
功能包括对会聚主IC 内部寄存器、数据RAM及外部接口等功能部件的初始化,会聚调整控制,会聚测试图控制,红外遥控信号IR的接收解码及与主板CPU通信等。
主要管脚有:XTAL1(19 脚)和XTAL2(18 脚)为振荡器输入输出端口,外接12MHz 晶振。
RST/Vpd(9 脚)为复位输入端口,外接电阻电容组成的复位电路。
VCC(40 脚)和VSS(20 脚)为供电端口,分别接+5V电源的正负端。
P0~P3 为可编程通用I/O 脚,其功能用途由软件定义,在本设计中,P0 端口(32~39 脚)被定义为N1 功能控制端口,分别与N1的相应功能管脚相连接,13 脚定义为IR输入端,10 脚和11脚定义为I2C总线控制端口,分别连接N1的SDAS(18脚)和SCLS (19脚)端口,12 脚、27 脚及28 脚定义为握手信号功能端口,连接主板CPU 的相应功能端,用于当前制式的检测及会聚调整状态进入的控制功能。
目的。
要注意的是:每当访问外部数据存储器时将跳过一个ALE 脉冲。
对Flash 存储器编程期间,该引脚还用于输入编程脉冲(PROG)。
如有必要,可通过对特殊功能寄存器(SFR)区中的8EH 单元的D0 位置位,可禁止ALE 操作。
该位置位后,只有一条MOVX 和MOVC指令才能将ALE 激活。
此外,该引脚会被微弱拉高,单片机执行外部程序时,应设置ALE 禁止位无效。
PSEN:程序储存允许(PSEN)输出是外部程序存储器的读选通信号,当AT89C52 由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN 有效,即输出两个脉冲。
在此期间,当访问外部数据存储器,将跳过两次PSEN信号。
EA/VPP:外部访问允许。
欲使CPU 仅访问外部程序存储器(地址为0000H—FFFFH),EA 端必须保持低电平(接地)。
需注意的是:如果加密位LB1 被编程,复位时内部会锁存EA端状态。
如EA端为高电平(接Vcc 端),CPU 则执行内部程序存储器中的指令。
Flash 存储器编程时,该引脚加上+12V 的编程允许电源Vpp,当然这必须是该器件是使用12V 编程电压Vpp。
XTAL1:振荡器反相放大器的及内部时钟发生器的输入端。
XTAL2:振荡器反相放大器的输出端。
2.2系统分析设计的电路主要是能多次记时和查询时间,记时的多少通过显示电路显示出来,每一次计时可以通过控制电路查询出来。
设计框图如图2-1所示;图2-13硬件系统的设计3.1硬件介绍根据设计要求和设计思路,硬件电路有两部分组成,即单片机按键电路,LCD 显示器电路。
图2-2 为硬件电路设计框图。
按键电路STC89C52LCD显示电路图2-2系统硬件电路根据课题设计要求,它由以下几个部件组成:单片机89C52RC、电源、时分秒显示模块。
时分秒显示采用动态扫描,以降低对单片机端口数的要求,同时也降低系统的功耗。
显示模块中时分秒显示驱动、校时模块都通过89C52RC的I/O口控制。
显示模块中的复位电路由89C52RC的RESET端控制。
电源部分:电源部分有二部分组成。
一部分是由220V的市电通过变压、整流稳压来得到+5V电压,维持系统的正常工作;另一部分是由5V的电池供电,以保证停电时正常走时。
正常情况下电池是不提供电能的,以保证电池的寿命。
3.2部分硬件原理图3.2.1STC89C52管脚图如图3-1所示:图3-13.2.2 1602LCD液晶硬件图如图3-2所示:图3-2 3.3最小单片机系统如图3-3所示:C130pF C2 30pF C3 10uFX111.0592MR110k图3-34系统的软件设计此部分主要介绍显示模块,显示模块是实现数字钟的重要部分,在显示时,首先将时间十进制数据转化为显示段码,然后送往液晶显示。
显示段码采用动态扫描的方式。
在要求改变显示数据的类别时,只须改变@R1(指向数据缓冲区的指针)指向的十进制数据缓冲区即可。
如图4-1所示:图4-15软硬件联调5.1正面图5.2反面接线5.3测试结果结束语通过这次实验,我学会了熟练运用protues,keil,protel等软件,在做本次课程设计的过程中,我感触最深的当属查阅大量的设计资料了。
为了让自己的设计更加完善,查阅这方面的设计资料是十分必要的,同时也是必不可少的。
其次,在这次课程设计中,我们运用到了以前所学的专业课知识。
虽然过去从未独立应用过它们,但在学习的过程中带着问题去学我发现效率很高,这是我做这次课程设计的又一收获后,要做好一个课程设计,就必须做到:在设计程序之前,对所用单片机的内部结构有一个系统的了解,知道该单片机内有哪些资源;要有一个清晰的思路和一个完整的的软件流程图;在设计程序时,不能妄想一次就将整个程序设计好,反复修改、不断改进是程序设计的必经之路;在设计课程过程中遇到问题是很正常德,但我们应该将每次遇到的问题记录下来,并分析清楚,以免下次再碰到同样的问题的课程设计结束了,但是从中学到的知识会让我受益终身。
参考文献[1]陈益飞.单片机原理及应用技术[M].北京:国防工业出版社,2011.[2]彭伟.单片机C语言设程序设计实训100例[M]. 北京:电工业出版社,2009.[3] 赵亮. 液晶显示模块LCD1602应用[J]. 电子制作,2007.[4] 于志赣,刘国平,张旭斌. 液晶LCD1602模块的应用[J].机电技术,2009.附录附录1 protel原理图附录2 PCB图附录3 protues仿真图附录4 程序清单#include <reg51.h>#include <intrins.h>#define uchar unsigned char#define unit unsigned int#define delayNOP() {_nop_();_nop_();_nop_();_nop_();} //LCD 控制void LCD_Initialize();void LCD_Set_POS(uchar);void LCD_Write_Data(uchar);void Display_String(uchar *,uchar);sbit K1=P1^0;sbit K2=P1^1;sbit BEEP=P3^0;sbit LCD_RS=P2^0;sbit LCD_RW=P2^1;sbit LCD_EN=P2^2;uchar KeyCount=0;uchar code msg1[]={"Second Watch 0"};uchar code msg2[]={">>>> "};uchar code Prompts[][16]={{"::1----> "},{"::1----> ::2 "},{"::1->2 ::3--> "},{"::1->2 ::3-->4"}};//计时缓冲与显示缓冲uchar Time_Buffer[] ={0,0,0,0};uchar LCD_Display_Buffer[]={"00:00:00:00"};//蜂鸣器void Beep(){uchar i,j=70;for (i=0;i<180;i++){while(--j);BEEP=~BEEP;}BEEP=0;}//延时void DelayX(unit ms){uchar i;while(ms--) for(i=0;i< 120;i++) ;}//显示计时void Show_Second(){uchar i;LCD_Set_POS(0x45);//设置LCD显示起点for(i=3;i!=0xff;i--){//将两位整数的1/100s,秒,分,时转换为8位数字字符LCD_Display_Buffer[2*i+1]=Time_Buffer[i]/10+'0'; LCD_Display_Buffer[2*i ]=Time_Buffer[i]%10+'0';//在i=3,2,1,0时分别显示时,分,秒,1、100sLCD_Write_Data(LCD_Display_Buffer[2*i+1]);LCD_Write_Data(LCD_Display_Buffer[2*i]);LCD_Write_Data(':');}}//Time0中断void Time0() interrupt 1 using 0{TH0=-10000/256;TL0=-10000%256;Time_Buffer[0]++;if(Time_Buffer[0]==100){Time_Buffer[0]=0; Time_Buffer[1]++; }if(Time_Buffer[1]==60) //秒{Time_Buffer[1]=0;Time_Buffer[2]++;}if(Time_Buffer[2]==60) //分{Time_Buffer[2]=0;Time_Buffer[3]++;}if(Time_Buffer[3]==24) //时Time_Buffer[3]=0;}//主函数void main(){uchar i;IE=0x82;TMOD=0x01;TH0=-10000/256;TL0=-10000%256;LCD_Initialize();Display_String(msg1,0x00);Display_String(msg2,0x40);while(1){if(K1==0){DelayX(100);i=++KeyCount;switch(i){case 1:case 3:TR0 =1;Display_String(Prompts[i-1],0); break;case 2:case 4:TR0 =0;Display_String(Prompts[i-1],0);break;default:TR0=0;break;}while (K1==0) ; //等待释放K1键Beep();}elseif(K2==0){TR0=0;KeyCount=0;for(i=0;i<4;i++)Time_Buffer[i]=0; //清零计时缓冲Display_String(msg1,0);Beep();DelayX(100);while (K2==0) ; //等待释放K2键}Show_Second();}}//1602LCD显示驱动函数e#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int#define DelayNOP(){_nop_();_nop_();_nop_();_nop_();}bit LCD_Busy_Check();void LCD_Initialize();void LCD_Set_POS(uchar) ;void LCD_Write_Command(uchar);void LCD_Write_Data(uchar);//延时void DelayMS(uint ms){uchar t;while(ms--) for (t=0;t<120;t++);}//LCD忙检查bit LCD_Busy_Check(){bit Result;LCD_RS=0;LCD_RW=1;LCD_EN=1;DelayNOP(); Result=(bit)(P0&0x80);LCD_EN=0;return Result;}//向LCD写指令void LCD_Write_Command(uchar cmd){while (LCD_Busy_Check() );LCD_RS=0;LCD_RW=0;LCD_EN=0;_nop_(); _nop_();P0=cmd; DelayNOP();LCD_EN=1;DelayNOP();LCD_EN=0;}//向LCD写数据‘void LCD_Write_Data(uchar str){while (LCD_Busy_Check()) ;LCD_RS=1;LCD_RW=0;LCD_EN=0;P0=str;DelayNOP(); LCD_EN=1;DelayNOP();LCD_EN=0;}//初始化LCDvoid LCD_Initialize(){DelayMS(5);LCD_Write_Command(0x38);DelayMS(5);LCD_Write_Command(0x0c);DelayMS(5);LCD_Write_Command(0x06);DelayMS(5);LCD_Write_Command(0x01);DelayMS(5);}//设置显示位置void LCD_Set_POS(uchar Position){LCD_Write_Command(Position|0x80);}//显示函数,在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]);}附录5元器件清单。