《电子钟的设计》PPT课件.ppt
微控制器应用技术II,高级应用技术,微控制器应用技术,微控制器应用技术主要内容,单片机内部资源基本应用,单片机应用技术提升,按键键盘辨识技术,显示技术(数码管、液晶),AD、DA转换技术,电机驱动技术,定时芯片温度采集数据存储,汇编语言与C51,电子钟设计,远距数据传送,密码锁的设计,数字电压表设计,信号发生器设计,AVR单片机应用定时器直流电机转速PWM控制一线数据采集,基于单片机的电子钟的设计,硬件设计单片机最小系统数码管LCD液晶按键定时芯片软件设计显示控制程序按键信息读取程序定时程序数据处理程序,八位数码管显示,八位数码管显示格式,共阴极数码管,共阳极数码管,八段管脚送上显示字符字形码,公共端送低电平,八段管脚送上显示字符字形码,公共端送高电平,多位是数码管,轮流向数码管八段管脚送字型码,向显示位的公共端送低(高)电平,八位数码管显示,数码管与单片机连接最小系统数码管的限流与驱动,八位数码管显示,数码管与单片机连接,八位数码管显示,显示程序原理,RAM 地址+0+1+2+3+4+5+6+7,EEPROM地址,字形码表,显示的字符,+0+1+2+3+4+5+6+7+8+9+10,字符 0 1 2 3 4 5 6 7 8 9,字形码,位码,显示器,位码表,八位数码管显示,显示程序,P0口,P2口,unsigned char code ZXMtable11=0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90,0 xbf;unsigned char code WMtable8=0 x01,0 x02,0 x04,0 x08,0 x10,0 x20,0 x40,0 x80;unsigned char DisplayBuff8=2,3,10,5,9,10,5,6;void Display(void)unsigned char i;for(i=0;i8;i+)P0=ZXMtableDisplayBuffi;P2=WMtablei;Delay(10);P0=0 xff;P2=0 x00;,八位数码管显示,编程联系:1、单片机控制共阴极数码管,设计驱动电路。2、编程使数码管显示21-14-563、设定hour=12,min=34,sec=21三个变量编程使数码管显示12-34-21,定时/计数器应用,6.3.1 定时/计数器的主要特性,定时计数器数量at89C51 2个T0,T1at89C52 3个 T0,T1,T22051:2个,工作方式:T0:4种T1:3种T2:3种,6.3.1 定时/计数器T0、T1的结构及工作原理,P3.5,P3.4,计数脉冲,计数脉冲,定时计数脉冲,定时器/计数器注意两个方面:1、由于它是加法计数器,每来一个计数脉冲,加法器中的内容加1个单位,当由全1加到全0时计满溢出,因而,如果要计N个单位,则首先应向计数器置初值为X,且有:初值X=最大计数值(满值)M计数值N最大计数值(满值)计算:当定时器/计数器工作于R位计数方式时,最大计数值(满值)=2R。(R=13、16、8)最大计数值为8192、65536、256,2、当定时/计数器工作于计数方式时,对芯片引脚T0(P3.4)或T1(P3.5)上的输入脉冲下降沿计数,计一个输入脉冲下降沿需要两个机器周期。即每一个机器周期的S5P2时刻对T0(P3.4)或T1(P3.5)上信号采样一次,如果上一个机器周期采样到高电平,下一个机器周期采样到低电平,则计数器在下一个机器周期的S3P2时刻加1计数一次。因而需要两个机器周期才能识别一个计数脉冲,所以外部计数脉冲的频率应小于振荡频率的1/24。,6.3.2 定时/计数器的方式和控制寄存器,一定时/计数器的方式寄存器TMOD,其中:M1、M0为工作方式选择位,用于对T0的四种工作方式,T1的三种工作方式进行选择,选择情况如下,C/T:定时或计数方式选择位,当C/T=1时工作于计数方式;当C/T=0时工作于定时方式。,GATE:门控位,用于控制定时/计数器的启动是否受外部中断请求信号的影响。,若T0采用16位定时,T1不用:TMOD=?,若T0采用16位定时,T18位计数:TMOD=?,二定时/计数器的控制寄存器TCON,T1溢出标志,T0溢出标志,T1启动,T0启动,位地址 8FH 8EH 8DH 8CH 8BH 8AH 89H 88H,外部中断控制位,1:启动0:停止,1:启动0:停止,1:定时计数到溢出0:定时未到,定时器T0启动:TCON=TCON|0 x10;TR0=1;,6.3.3 定时/计数器的工作方式,一方式0,方式0是13位的定时/计数方式,因而最大计数值(满值)为2的13次幂,等于8192。如计数值为N,则置入的初值X为:X=8192-N 如定时/计数器T0的计数值为1000,则初值为7192,转换成二进制数为,则TH0=11100000B,TL0=00011000B。,TH0=(8192-1000)/32TL0=(8192-1000)%32,二方式1,方式1的结构与方式0结构相同,只是把13位变成16位,16位的加法计数器被全部用上。,由于是16位的定时/计数方式,因而最大计数值(满值)为2的16次幂,等于65536。如计数值为N,则置入的初值X为:X=65536-N如定时/计数器T0的计数值为1000,则初值为65536-1000=64536,转换成二进制数为,则TH0=11111100B,TL0=00011000B。,TH0=(65536-1000)/256TL0=(65536-1000)%256,P3.4或P3.5,三方式2,方式2下,16位的计数器只用了8位来计数,用的是TL0(或TL1)的8位来进行计数,而TH0(或TH1)用于保存初值。当TL0(或TL1)计满时则溢出,一方面使TF0(或TF1)置位,另一方面溢出信号又会触发图5.5上的三态门,使三态门导通,TH0(或TH1)的值就自动装入TL0(或TL1)。,由于是8位的定时/计数方式,因而最大计数值(满值)为2的8次幂,等于256。如计数值为N,则置入的初值X为:X=256-N 如定时/计数器T0的计数值为100,则初值为256-100=156,转换成二进制数为10011100B,则TH0=TL0=10011100B。注意:由于方式2计满后,溢出信号会触发三态门自动地把TH0(或TH1)的值装入TL0(或TL1)中,因而如果要重新实现N个单位的计数,不用重新置入初值。,四方式3,方式3只有定时/计数器T0才有,当M1M0两位为11时,定时/计数器T0工作于方式3,方式3的结构如下图.方式3下,定时/计数器T0被分为两个部分TL0和TH0,其中,TL0可作为定时/计数器使用,占用T0的全部控制位:GATE、C/T、TR0和TF0;而TH0固定只能作定时器使用,对机器周期进行计数,这时它占用定时/计数器T1的TR1位、TF1位和T1的中断资源。,二定时/计数器的应用,通常利用定时/计数器来产生周期性的波形。利用定时/计数器产生周期性波形的基本思想是:利用定时/计数器产生周期性的定时,定时时间到则对输出端进行相应的处理。如产生周期性的方波只须定时时间到对输出端取反一次即可。,【例6-2】设系统时钟频率为12MHZ,用定时/计数器T0编程实现从P1.0输出周期为500s的方波。分析:从P1.0输出周期为500s的方波,只须P1.0每250s取反一次则可。当系统时钟为12MHZ,定时/计数器T0工作于方式2时,最大的定时时间为256s,满足250s的定时要求,方式控制TMOD寄存器应设定为00000010B(02H)。系统时钟为12MHZ,定时250s,计数值N为250,初值X=256-250=6,则TH0=TL0=06H。,汇编程序:ORG 0000HLJMP MAINORG 000BH;LJMP TIMER0ORG 0100H;主程序MAIN:MOV TMOD,#02HMOV TH0,#06HMOV TL0,#06HSETB EASETB ET0SETB TR0SJMP$/中断处理程序TIMER0:CPL P1.0RETIEND,C语言程序:#include sbit P1_0=P10;void main()TMOD=0 x02;/0000 0010TH0=0 x06;TL0=0 x06;EA=1;ET0=1;TR0=1;while(1);/中断服务程序void time0_int(void)interrupt 1 P1_0=P1_0;,(1)采用中断处理方式的程序:,6.3.4 定时/计数器的初始化编程及应用,一定时/计数器的编程,设置工作方式寄存器TMOD,设置定时初值寄存器THx、TLx,开总中断EA=1,定时器中断ETx,启动定时器,TR0或TR1置1,编写定时器中断函数,编写查询定时到函数,void Timer_Initial()TMOD=/T0、T1工作方式TH0=/T0定时初值TL0=TH1=/T1定时初值TL1=ET0=/T0中断允许控制ET1=/T1中断允许控制EA=/单片机中断允许控制TR0=/根据需要T0启动控制TR1=/T1启动控制,void Timerx_Int(void)interrupt 1或3TH0=/T0重置定时初值TL0=/方式2不需要TH1=/T1重置定时初值TL1=/方式2不需要。,定时计数器初始化函数模版,定时器中断函数模板,定时中断后需要完成的事情,定时器编程,例2 设计一个秒计数器。在P1.7端接一个发光二极管LED,要求利用定时控制使LED亮1秒灭1秒周而复始,设晶振12 MHz。,基本思路:设置定时器定时10ms,并设计一个10毫秒计数器对定时10ms的次数计数,当10毫秒计数器的计数值达到100时,则1秒定时到。,#includeunsigned int Counter;sbit P17=P17;void Timer0_Init(void)TMOD=0 x10;/置T1工作方式 TH1=(65536-10000)/256;/T1送定时初值 TL1=(65536-10000)%256;ET1=1;/定时器T1允许中断 EA=1;TR1=1;/启动T1void main(void)Timer0_Init();P17=1;while(1);,void Timer0(void)interrupr 3 TH1=(65536-10000)/256;TL1=(65536-10000)%256;Counter+;if(Counter=100)Counter=0;P17=P17;,主函数,T1中断函数,定时器编程练习:1、编程在单片机P1.0输出周期为10ms的方波。2、已知AT89S51单片机的系统时钟12MHz,请利用T0和P1.0输出矩形波脉冲。波形如下:,电子钟程序设计,定时器中断函数,功能:10ms定时;计数;时、分、秒计时,主程序:完成定时器初始化和启动;完成时间数据处理;完成时间显示;,电子钟的计时编程,#define T=1void Timer1(void)interrupt 1 TH1=(65536-10000/T)/256;TH1=(65536-10000/T)/256;Count+;if(Count=200)Count=0;sec+;if(sec=60)sec=0;min+;if(min=60)min=0;hour+;if(hour=24)hour=0;,基于MCS-51单片机电子钟的设计,设计一个电子钟,能够显示时分秒,格式:小时分钟秒,该电子钟能够进行时分调整。当电子钟停走时,允许调时;当电子钟计时时,不允许调整时间。,中断法,void Counter1(void)interrupt 3TH1=0 xff;TL1=255;TR0=TR0;void Int0(void)interrupt 0if(TR0=0)hour+;if(hour=24)hour=0;void Int1(void)interrupt 2 if(TR0=0)min+;if(min=60)min=0;,两个按钮分别接至单片机的两个外部中断管脚INT0(P3.2)和INT1(P3.3),P3.2按钮调整小时;P3.3按钮调整分钟;第三个按钮接计数器T1(P3.5),利用计数中断控制启动和停止。,void Read_Key(void)uchar key;key=P1,扫描法,按钮接至P1口的低三位(P1.0、P1.1、P1.2),分别判断按钮的按动的下降沿出现的次数。,延时消除按钮抖动,主函数,读入按键函数流程,按键分析函数流程,时间调整函数流程,闪烁控制函数流程,LCD电子钟,学习目标,2、LCD的使用:LCD驱动函数(API函数)void LCD_write_str(uchar x,uchar y,uchar*s),1、硬件:与单片机的连接电路,xLCD横坐标(列坐标016)yLCD纵坐标(行坐标01)s指向字符串的指针变量,LCD电子钟,液晶显示器简称LCD显示器。液晶显示器按其功能可分为三类:笔段式液晶显示器、字符点阵式液晶显示器和图形点阵式液晶显示器。前两种可显示数字、字符和符号等,而图形点阵式液晶显示器还可以显示汉字和任意图形,达到图文并茂的效果。,1 字符型点阵式LCD液晶显示器,目前市面上常用的有16字1行、16字2行、20字2行和40字2行等的字符液晶显示模块。以162字符型液晶显示模块RT-1602C为例,详细介绍字符型液晶显示模块的应用。,笔段式,字符点阵式,图形点阵式,字符点阵式,图形点阵式,RT-1602C采用标准的16脚接口,一字符型液晶显示模块RT-1602C的外观与引脚,LCD1602的读写时序,数据写入LCD,读数据,二字符型液晶显示模块RT-1602C的内部结构,液晶显示模块RT-C1602C的内部结构可以分成三部份:一为LCD控制器,二为LCD驱动器,三为LCD显示装置,如图所示:,HD44780是集控制器,驱动器于一体,专用于字符显示控制驱动集成电路。HD44100是作扩展显示字符位的。HD44780是字符型液晶显示控制器的代表电路。HD44780集成电路的特点:1、可选择57或510点字符。2、HD44780的显示缓冲区DDRAM、字符发生存储器(ROM)CGROM及用户自定义的字符发生器CGRAM全部内藏在芯片内。,字符发生存储器CGROM(ROM)存储了160个5X7不同的点阵字符图形和32个5x10字符,如图所示:,5X10,CGRAM字符发生器存放用户自定义的字符点阵,共有8个自行编程的任意5*7点阵字符图形。地址0 x000 x07,DDRAM显示数据存储器用于存放LCD当前要显示字符的代码,80字节,可以存放80个8位字符代码。,HD44780有80个字节的显示缓冲区DDRAM,分两行,地址分别为80H+(00H27H,40H67H),它实际显示位置的排列顺序跟LCD的型号有关,液晶显示模块RT-1602C的显示地址与实际显示位置的关系如图所示,LCD1602DDRAM,寄存器选择和显示器地址,LCD寄存器1、指令寄存器IR存放控制LCD的指令2、数据寄存器DR存放显示的数据(字符代码)显示控制方法1、确定显示字符的位置(地址)将显示字符的地址送入IR2、将显示字符数据(代码)送入DR,LCD管脚RS用于选择寄存器IR和DR,LCD1602DDRAM,DDRAM,若想在LCD某个位置显示一个字符1、确定显示位置:将地址信息送入指令寄存器IR2、确定显示内容:将该字符对应的8位“代码”通过数据寄存器DR,写入与对应LCD位置的DDRAM中。,HD44780具有8位数据和4位数据传输两种方式,可与4/8位CPU相连。8位连接方式,命令或数据一次写入,1、直接控制方式,RS BIT P2.0RW BIT P2.1E BIT P2.2;写入数据在AWRI_D:SETB E MOV P0,ASETB RSCLR RWCLR ERET,sbit RS=P20sbit RW=P21sbit E=P22void WriteData(unsigned char D)E=1;P0=D;RS=1;RW=0E=0;,8位总线连接方式,WRI_D:MOV DPTR,#0fffdHMOVX DPTR,ARET,void Write_Data(unsigned char D)XBYTE0 xfffd=D;,1111 1111 1111 11010000 0000 0000 0001,5、HD44780具有简单而功能较强的指令集,可实现字符移动,闪烁等显示功能。,4位连接方式,命令或数据从D4D7写入LCD分两次写入一个8位命令和数据。先写高4位,再写低4位。,Void Write_Data4(unsigned char D)E=1;RS=1;RW=0 P0=(P0,P0高四位清零低四位不变,D高四位不变低四位清零,LCD1602基本命令与驱动函数,LCD1602指、令:11条清屏、光标复位、输入方式设置、显示控制、光标移位等LCD驱动函数在LCD上某个位置写一个字符在LCD上显示一个字符串,三指令格式与指令功能,LCD控制器HD44780内有多个寄存器,通过RS和R/W引脚共同决定选择哪一个寄存器,选择情况如表,总共有11条指令,它们的格式和功能如下:,指令写入指令寄存器IR,数据写入数据寄存器DR,1清屏命令格式:,功能:清除屏幕,将显示缓冲区DDRAM的内容全部写入空格(ASCII 20H)。光标复位,回到显示器的左上角。地址计数器AC清零。,2光标复位命令格式:,01H,02H,3输入方式设置命令格式:,功能:设定当写入一个字节后,光标的移动方向以及后面的内容是否移动。当I/D=1时,光标从左向右移动;I/D=0时,光标从右向左移动。当S=1时,内容移动,S=0时,内容不移动。,04H07H,4显示开关控制命令格式:,功能:控制显示的开关,当D=1时显示,D=0时不显示。控制光标开关,当C=1时光标显示,C=0时光标不显示。控制字符是否闪烁,当B=1时字符闪烁,B=0时字符不闪烁。,08H0FH,08H0BH:关显示,0CH:开显示,光标不显示,字符不闪烁,0DH:开显示,光标不显示,字符闪烁,0EH:开显示,光标显示,字符不闪烁,0FH:开显示,光标显示,字符闪烁,5光标移位置命令格式:,功能:移动光标或整个显示字幕移位。当S/C=1时整个显示字幕移位,当S/C=0时只光标移位。当R/L=1时光标右移,R/L=0时光标左移。,10H、14H、18H、1CH,6功能设置命令格式:,功能:设置数据位数,当DL=1时数据位为8位,DL=0时数据位为4位。设置显示行数,当N=1时双行显示,N=0时单行显示。设置字形大小,当F=1时510点阵,F=0时为57点阵。,命令20H:表示四位数据传送,单行5*7点阵命令24H:表示四位数据传送,单行5*10点阵命令28H:表示四位数据传送,双行5*7点阵命令2CH:表示四位数据传送,双行5*10点阵命令30H:表示八位数据传送,单行5*7点阵命令34H:表示八位数据传送,单行5*10点阵命令38H:表示八位数据传送,双行5*7点阵命令3CH:表示八位数据传送,双行5*10点阵,7设置字库CGRAM地址命令,格式:,功能:设置用户自定义CGRAM的地址,对用户自定义CGRAM访问时,要先设定CGRAM的地址,地址范畴063(00H3FH)。(40H7F),8显示缓冲区DDRAM地址设置命令,格式:,功能:设置当前显示缓冲区DDRAM的地址,对DDRAM访问时,要先设定DDRAM的地址,地址范畴0127。,00H27H(0 39)40H67H(64103),9读忙标志及光标地址计数器AC命令,格式:,功能:读忙标志及地址计数器AC,当BF=1时则表示忙,这时不能接收命令和数据;BF=0时表示不忙。低7位为读出的AC的地址,值为0127。,10写DDRAM或CGRAM数据格式:,功能:向DDRAM或CGRAM当前位置中写入数据。对DDRAM或CGRAM写入数据之前须设定DDRAM或CGRAM的地址。,11读DDRAM或CGRAM命令格式:,功能:从DDRAM或CGRAM当前位置中读出数据。当DDRAM或CGRAM读出数据时,先须设定DDRAM或CGRAM的地址。,LCD1602驱动函数,P0.7,P2.2,P2.1,P2.0,P0.0,8051,DB0,DB7,E,RS,R/W,RT-1602,VL,BLK,BLK,RP=10K,OV,OV,+5V,R=10欧姆 1/2W,+5V,八位数据传送方式,#include#include#define uchar unsigned char#define uint unsigned int#define LCD_Data P0sbit LCD_RS=P20;sbit LCD_RW=P21;sbit LCD_E=P22;,/*延时1uS*/void Delay1Us(int n)for(;n0;n-)_nop_();/*延时1MS*/void Delay1Ms(void)Delay1Us(1000);,LCD驱动程序,/*LCD写数据*参数WDLCM,向LCD写入的数据*/void LCD_Write_Data8(uchar WDLCM)LCD_RS=1;LCD_RW=0;LCD_E=1;/若晶振速度太高可以在这后加小的延时LCD_Data=WDLCM;LCD_E=0;Delay1Ms();Delay1Ms();/*LCD写命令*BuysC为0时忽略忙检测参数WCLCM,向LCD写入的命令*/void LCD_Write_Command8(uchar WCLCM)LCD_RS=0;LCD_RW=0;LCD_E=1;LCD_Data=WCLCM;LCD_E=0;Delay1Ms();Delay1Ms();,向数据寄存器DR写入一个字符代码(ASCII码),向指令寄存器IR写入一条命令,LCD1602驱动,四位数据传送方式,#include#include#define uchar unsigned char#define uint unsigned int#define LCD_DATA P0sbit LCD_RS=P00;sbit LCD_RW=P01;sbit LCD_E=P02;void Delay1Us(int n)for(;n0;n-)_nop_();,/*延时1MS*/void Delay1Ms(void)Delay1Us(1000);void LCD_en_write(void)LCD_E=0;LCD_E=1;Delay1Us(1);LCD_E=0;,void LCD_Write_Command4(uchar command)Delay1Us(16);LCD_RS=0;/选择指令寄存器LCD_RW=0;LCD_DATA,void LCD_Write_Data4(uchar Data1)Delay1Us(16);LCD_RS=1;/选择数据寄存器LCD_RW=0;LCD_DATA,向指令寄存器IR写入一个命令,向数据寄存器DR写入一个字符代码(ASCII码),期望得到LCD的驱动,在LCD的某一位置显示一个字符;或从LCD某一位置开始显示一个字符串,void LCD_Write_Char(uchar x,uchar y,uchar DData);void LCD_Write_Str(uchar x,uchar y,uchar*s);,x,y显示字符的坐标x:015;y:01,DData字符的ASCII码,s指向字符串的指针变量,要将x,y换算成DDRAM的地址00H0FH,或40H4FH,写入命令寄存器,再将数据DData写入数据寄存器,/*设置光标位置函数*x列坐标015y行坐标01*/void LCD_set_xy(uchar x,uchar y)uchar address;if(y=0)address=0 x80+0 x00+x;else address=0 x80+0 x40+x;LCM_Write_Command8(address);/*在某位置显示一个字符*x列坐标015y行坐标01DData1显示字符的ASCII码*/void LCD_Write_Char(uchar x,uchar y,uchar DData)LCD_set_xy(x,y);LCD_Write_Data8(DData);,/*从某位置开始显示字符串*x列坐标015y行坐标01s指针变量s指向显示字符串*/void LCD_Write_Str(uchar x,uchar y,uchar*s)LCD_set_xy(x,y);while(*s)LCD_Write_Data8(*(s+);,八位数据传送的驱动,/*设置光标位置函数*x列坐标015y行坐标01*/void LCD_set_xy(uchar x,uchar y)uchar address;if(y=0)address=0 x80+x;else address=0 xc0+x;LCM_WriteCommand4(address);/*在某位置显示一个字符*x列坐标015y行坐标01DData1显示字符的ASCII码*/void LCD_Write_Char(uchar x,uchar y,uchar DData)LCD_set_xy(x,y);LCD_Write_Data4(DData);,/*从某位置开始显示字符串*x列坐标015y行坐标01s指针变量s指向显示字符串*/void LCD_Write_Str(uchar x,uchar y,uchar*s)LCD_set_xy(x,y);while(*s)LCD_Write_Data4(*(s+);,四位数据传送的驱动,四LCD显示器的初始化,LCD使用之前须对它进行初始化,初始化可通过复位完成,也可在复位后完成,初始化过程如下:,清屏,功能设置,开关显示设置,输入方式设置,设置四位或八位、双行或单行、5*7或5*10点阵20H、24H、28H、2CH、30H、34H、38H、3CH,设置开/关显示、光标是否显示、字符是否闪烁08H0FH,设置光标左右移动、内容是否移动04H07H,01H,8.42 LCD显示器与单片机的接口与应用,下图是LCD显示器与8051单片机的接口图,图中RT-1602C的数据线与8051的P0口相连,RS与8051的P2.0相连,R/W与8051的P2.1相连,E端与8051的P2.3相连。编程在LCD显示器的第一行、第一列开始显示“Welcome to FSPT”,第二行、第8列开始显示“8”。,P0.7,P2.2,P2.1,P2.0,P0.0,8051,DB0,DB7,E,RS,R/W,RT-1602,VL,BLK,BLK,RP=10K,OV,OV,+5V,R=10欧姆 1/2W,+5V,/*LCD1602初始化*/void LCD_Init8()LCD_Write_Command8(0 x30);LCD_Write_Command8(0 x30);LCD_Write_Command8(0 x30);LCD_Write_Command8(0 x38);/设置8位数据,2行 5X7字符LCD_Write_Command8(0 x0C);/设置显示开、光标不显示、不闪烁LCD_Write_Command8(0 x01);/清屏LCD_Write_Command8(0 x06);/显示光标移动设置,#includeunsigned char code str1=“Welcome to FSPT”;void main(void)LCD_Init8();LCD_Write_Str(0,0,str1);LCD_Write_Char(8,1,8);while(1);,LCD显示应用程序,LCD4位连接方式,void main()LCD_init4();while(1)LCD_Write_Str(0,0,str1);LCD_Write_Char(8,1,8);while(1);,void LCD_init4()LCD_Write_Command4(0 x28);/LCD4位控制方式Delay1Us(40);LCD_Write_Command4(0 x28);LCD_Write_Command4(0 x0c);/开显示、光标不亮、字符不闪LCD_Write_Command4(0 x01);Delay1Ms();Delay1Ms();,编程练习,LCD 第一行显示:LCD_CLOCK第二行显示:自己的班级学号,LCD1602电子秒表设计,1、电子秒表精确到0.01秒2、P3.7接一个开关,按钮按下,秒表开始计时,按钮松开秒表停止。3、当 秒表停止时,第一行显示“Time Stop”;当 秒表运行时,第一行显示“Time Run”;,日历时钟芯片DS1302电子钟设计,一DS1302的主要性能指标,(1)DS1302实时时钟具有能计算2100年之前的秒、分、时、日、日期、星期、月、年的能力,还有闰年调整的能力。(2)内部含有31个字节静态RAM,可提供用户访问。(3)采用串行数据传送方式,使得管脚数量最少,简单3 线接口。(4)工作电压范围宽:2.0V5.5V。(5)工作电流:2.0V时,小于300nA。(6)时钟或RAM数据的读/写有两种传送方式:单字节传送和多字节传送方式。(7)采用8脚DIP封装或SOIC封装。(8)与TTL兼容,Vcc=5V。(9)可选工业级温度范围:-40C+85C。(10)具有涓流充电能力。(11)采用主电源和备份电源双电源供应。(12)备份电源可由电池或大容量电容实现。,DS1302封装形式,二引脚功能DS1302的引脚如图所示,图 DS1302引脚图,(CE),DS1302典型应用电路,DS1302内部结构图,电源控制,输入移位寄存器,命令和控制逻辑,实时时钟,静态RAM,晶振电路,三DS1302的寄存器及片内RAM,DS1302有一个控制寄存器、12个日历、时钟寄存器和31个RAM。,1控制寄存器,控制寄存器用于存放DS1302的控制命令字,DS1302的RST引脚回到高电平后写入的第一个字就为控制命令。它用于选择DS1302各寄存器及对其读写过程进行控制,它的格式如下:,其中:D7:固定为1D6:RAM/CK位,片内RAM或日历、时钟寄存器选择位。D5D1:地址位,用于选择进行读写的日历、时钟寄存器或片内RAM。对日历、时钟寄存器或片内RAM的选择见表。,80H、81H,82H、83H,84H、85H,86H、87H,88H、89H,8AH、8BH,8CH、8DH,8EH、8FH,90H、91H,BEH、BFH,C0H、C1H,FCH、FDH,FEH、FFH,.,控制命令,写 读,2日历、时钟寄存器DS1302共有12个寄存器,其中有7个与日历、时钟相关,存放的数据为BCD码形式。日历、时钟寄存器的格式如表。,说明:(1)数据都以BCD码形式。(2)小时寄存器的D7位为12小时制/24小时制的选择位,当为1时选12小时制,当为0时选24小时制。当12小时制时,D5位为0是上午,D5位为1是下午,D4为小时的十位。当24小时制时,D5、D4位为小时的十位。(3)秒寄存器中的CH位为时钟暂停位,当为1时钟暂停,为0时钟开始启动。(4)写保护寄存器中的WP为写保护位,当WP=1,写保护,当WP=0未写保护,当对日历、时钟寄存器或片内RAM进行写时WP应清零,当对日历、时钟寄存器或片内RAM进行读时WP一般置1。,(5)慢充电寄存器:TCS位为控制慢充电的选择,当它为1010才能使慢充电工作。DS为二极管选择位。DS为01选择一个二极管,DS为10选择二个二极管,DS为11或00充电器被禁止,与TCS无关。RS用于选择连接在VCC2与VCC1之间的电阻,RS为00,充电器被禁止,与TCS无关.,3.片内RAMDS1302片内有31个RAM单元,对片内RAM的操作有两种方式:单字节方式和多字节方式。当控制命令字为C0HFDH时为单字节读写方式,命令字中的D5D1用于选择对应的RAM单元,其中奇数为读操作,偶数为写操作。当控制命令字为FEH、FFH时为多字节操作(表9.5中的RAM突发模式),多字节操作可一次把所有的RAM单元内容进行读写。FEH为写操作,FFH为读操作。,4、DS1302数据输入输出时序图,数据输入(单字节写入),数据输入是在控制字输入后的下一个SCLK时钟的上升沿时数据被写入DS1302,数据输入从低位即位0开始。,命令控制字,输入的数据,数据输出,数据输出是在8位控制指令字后的下一个SCLK脉冲的下降沿输出数据,输出数据时从低位0位至高位7依次输出。需要注意的是,第一个数据位是在控制字的最后一位之后的第一个下降沿被输出。此时只要保持CE高电平,如果有额外的SCLK周期,将重新发送数据字节,即多字节传送模式。,DS1302通过RST引脚驱动输入输出过程,当置RST高电平启动输入输出过程:(1)在SCLK时钟的控制下,首先把控制命令字写入DS1302的控制寄存器,用于选择内部时钟寄存器或RAM;(2)根据写入的控制命令字,依次读写内部寄存器或片内RAM单元的数据;按(1)、(2)顺序可以读写一个日历、时钟寄存器或RAM;如果(1)写入控制命令字为0BEH或0BFH,则(2)一次连续写或读所有的日历、时钟寄存器共8个字节时钟突发模式;如果(1)写入控制命令字为0FEH或0FFH,则(2)一次连续写或读所有的RAM共31个字节RAM突发模式;当数据读写完后,RST变为低电平结束输入输出过程。,4DS1302的输入输出过程,四、DS1302与单片机的接口,DS1302与单片机的连接仅需要3条线:时钟线SCLK、数据线I/O和复位线 RST。连接图如图9.18。时钟线SCLK与P3.1相连,数据线I/O与P3.0相连,复位线 RST与P3.2相连。,图中DS1302的驱动程序。,DS1302驱动:,#include#define uchar unsigned charsbit T_CLK=P10;sbit T_IO=P11;sbit T_RST=P12;sbit ACC0=ACC0;sbit ACC7=ACC7;void Clock(void)T_CLK=0;T_CLK=1;/产生上升沿T_CLK=0;/产生下降沿,/*名称:ReadB功能:从DS1302读出1字节数据输入:无返回值:ACC进入函数前,T_CLK=0*/uchar ReadB(void)uchar i;for(i=8;i0;i-)ACC=ACC1;ACC7=T_IO;/读入数据Clock();return(ACC);,/*名称:WriteB功能:往DS1302写入1字节数据输入:ucDa返回值:无进入函数前,T_CLK=0*/void WriteB(uchar ucDa)uchar i;ACC=ucDa;for(i=8;i0;i-)T_IO=ACC0;/数据送入IOClock();ACC=ACC1;,/*名称:v_W1302功能:单字节写,往DS1302某寄存器写入命令/数据,先写命令,后写数据调用:WriteB()输入:ucAddr,ucDa返回值:无*/void v_W1302(uchar ucComm,uchar ucDa)T_RST=0;T_CLK=0;/时钟准备T_RST=1;/开始WriteB(ucComm);/写入命令WriteB(ucDa);/写入数据T_CLK=1;T_RST=0;/停止,/*名称:uc_R1302功能:单字节读,读取DS1302某寄存器的数据,先写命令,后读数据调用:WriteB(),ReadB()输入:ucComm DS1302命令返回值:ucDa*/uchar uc_R1302(uchar ucComm)uchar ucDa;T_RST=0;T_CLK=0;T_RST=1;WriteB(ucComm);/