单片机课程设计数字钟实验报告

合集下载

单片机课程设计电子钟实验.

单片机课程设计电子钟实验.

数字钟实验一实验目的与要求进一步熟悉I∧2C总线,掌握时钟芯片的使用;掌握使用液晶显示器显示时间二实验内容⒈PGF8563:⑴实时时钟芯片,可记时时间1900-2099年,不具有周调整功能。

⑵数据传输采用I∧2C总线,固定片选地址;闹铃中断功能,可编程频率输出⒉实验过程读写PGF8563中的时间程序;在12864J液晶显示器显示时间星期、日期三实验步骤1、主机连线说明:E4区:SDA----A3区:P1.0E4区:SCL----A3区:P1.1A1区:CS、RW、RS、CS1/2----A3区:CS1、A0、A1、A22、初始化PCF8563,设置初始化时间(2005-07-01 Fri 12:30:00),读取时间数据;调整读取的时间数据,转换为可以再图形液晶显示器上显示的数据,显示时间(年、月、日、星期、小时、分、秒三实验原理图四程序流程图五程序清单PCF8563时钟实验说明;实验目的: 1.掌握时钟芯片的使用; 2.掌握使用液晶显示器显示时间;实验内容: 1.读写PCF8563中的时间数据; 2.将时间显示在12864J液晶显示器上;连线说明:;PCF8563: E4区-->A3区; SDA-->P1.0,数据线; SCL-->P1.1,时钟;液晶12864J: A1区-->A3区; CS-->CS1(0F000H),片选; RW-->A0,读/写控制端; RS-->A1,数据/指令控制端; CS1/2-->A2,左右半屏使能端;*******************************************************SEC EQU 30H ;保存秒数据,用于检测秒变化 TEMP EQU 31H ;时间显示缓冲区XSET EQU 33H ;时间起始显示行设置 YSET EQU 34H ;时间起始显示列设置Time11 EQU 35H ;数据缓冲区WR_COM_AD_L XDATA 0F004H ;写左半屏指令地址 WR_COM_AD_R XDATA 0F000H ;写右半屏指令地址WR_DATA_AD_L XDATA 0F006H ;写左半屏数据地址WR_DATA_AD_R XDATA 0F002H ;写右半屏数据地址RD_BUSY_AD XDATA 0F001H ;查忙地址RD_DATA_AD XDATA 0F003H ;读数据地址X EQU 0B8H ;起始显示行基址Y EQU 040H ;起始显示列基址FirstLine EQU 0C0H ;起始显示行SDA BIT P1.0 ;数据传输口SCL BIT P1.1 ;时钟INT BIT P3.2 ;闹钟/定时中断输出;内部寄存器地址CS1 EQU 00H ;控制/状态寄存器1CS2 EQU 01H ;控制/状态寄存器2Second EQU 02H ;秒寄存器Minute EQU 03H ;分寄存器Hour EQU 04H ;时寄存器Day EQU 05H ;天寄存器Weekday EQU 06H ;周寄存器Mouth EQU 07H ;月寄存器Year EQU 08H ;年寄存器MinuteA EQU 09H ;分闹铃寄存器HourA EQU 0AH ;时闹铃寄存器DayA EQU 0BH ;天闹铃寄存器WeekdayA EQU 0CH ;周闹铃寄存器CO EQU 0DH ;时钟输出控制寄存器TimerCtrl EQU 0EH ;定时控制寄存器Timer EQU 0FH ;定时设置寄存器;PCF8563的片选地址:001HPCF8563_WRITE EQU 0A2H ;写指令PCF8563_READ EQU 0A3H ;读指令ORG 0LCALL MainINIT ;主程序初始化MAIN: LCALL Sec_Change ;检测秒变化,给出判断标志位CY,1-有变化 JNC MAIN LCALL Time_Read ;读取时间MOV SEC,TIME11 ;保存秒数据,用于检测秒变化LCALL Time_Display ;显示时间JMP MAIN ;循环进行实验内容介绍与PCF8563测试;主程序初始化MainINIT: LCALL LCD_INIT ;初始化液晶显示LCALL PCF8563_INIT ;PCF8563初始化LCALL BackGround ;显示背景,即显示不会变化的部分LCALL Time_Read ;读取时间,读取的时间数据存放在TIME中 MOVSEC,TIME11 ;保存秒数据,用于检测秒变化LCALL Time_Display ;显示时间CLR F0 ;清秒变化标志RET;显示时间背景BackGround: MOV DPTR,#PIC2 ;显示"2"MOV A,#2MOV B,#0LCALL ByteDisL ;显示1个字节子程序,左单屏MOV DPTR,#PIC0 ;显示"0"MOV A,#2MOV B,#8LCALL ByteDisLMOV DPTR,#BG1 ;第1行背景"-"MOV A,#2 ;起始显示行:第2行MOV B,#32 ;起始显示列:第16列LCALL ByteDisLMOV DPTR,#BG1MOV A,#2MOV B,#56LCALL ByteDisLMOV DPTR,#BG2 ;第2行背景":"MOV A,#4MOV B,#48LCALL ByteDisL ;显示1个字节子程序,左半屏MOV DPTR,#BG2MOV A,#4MOV B,#8LCALL ByteDisR ;显示1个字节子程序,右半屏RETBG1: ;"-"DB000H,000H,000H,000H,000H,000H,000H,000H,001H,001H,001H,001H,001H,001H,0 01H,001H BG2: ;":"DB000H,000H,000H,0C0H,0C0H,000H,000H,000H,000H,000H,000H,030H,030H,000H, 000H,000H;********************************;时间显示;********************************;检测秒变化,给出判断标志F0,1-秒有变化;0-秒无变化Sec_Change: LCALL Sec_Read ;读取秒CJNE A,SEC,Sec_Change_1 ;与前一次读取的秒比较,判断秒是否有变化 CLR C RETSec_Change_1: SETB CRET;时间显示,时间数据在TIME缓冲区中Time_Display: MOV A,TIME11 ;显示秒ANL A,#0F0HSWAP AACALL TEMPChangeMOV A,#4MOV B,#16LCALL ByteDisRMOV A,TIME11ANL A,#0FHLCALL TEMPChangeMOV A,#4MOV B,#24LCALL ByteDisRMOV A,TIME11+1ANL A,#0F0HSWAP ALCALL TEMPChangeMOV A,#4MOV B,#56LCALL ByteDisLMOV A,TIME11+1ANL A,#0FHLCALL TEMPChangeMOV A,#4MOV B,#0LCALL ByteDisRMOV A,TIME11+2ANL A,#0F0HSWAP ALCALL TEMPChangeMOV A,#4MOV B,#32LCALL ByteDisLMOV A,TIME11+2 起始显示行在第4行(从第0行开始算) 起始显示列在第16列(从第0列开始算) ;显示秒,右半屏显示分 ;时间数据转换为图形显示数据起始显示行在第4行(从第0行开始算) 起始显示列在第56列(从第0列开始算) ;显示分,左半屏显示小时 ;时间数据转换为图形显示数据起始显示行在第4行(从第0行开始算) 起始显示列在第32列(从第0列开始算) ;显示小时,左半屏 ;; ; ;; ; ;; ANL A,#0FHLCALL TEMPChangeMOV A,#4MOV B,#40LCALL ByteDisL;显示日MOV A,TIME11+3ANL A,#0F0HSWAP ALCALL TEMPChange ;时间数据转换为图形显示数据 MOV A,#2 ;起始显示行在第2行(从第0行开始算) MOV B,#0 ;起始显示列在第0列(从第0列开始算) LCALL ByteDisR ;显示日,右半屏MOV A,TIME11+3ANL A,#0FHLCALL TEMPChangeMOV A,#2MOV B,#8LCALL ByteDisR;显示周MOV A,TIME11+4LCALL WeekChange ;周数据转换为图形显示数据MOV A,#2 ;起始显示行在第2行(从第0行开始算) MOV B,#40 ;起始显示列在第32列(从第0列开始算) LCALL WeekDisplay ;显示周,右半屏;显示月MOV A,TIME11+5ANL A,#0F0HSWAP ALCALL TEMPChange ;时间数据转换为图形显示数据 MOV A,#2 ;起始显示行在第2行(从第0行开始算) MOV B,#40 ;起始显示列在第40列(从第0列开始算) LCALL ByteDisL ;显示月,左半屏MOV A,TIME11+5ANL A,#0FHLCALL TEMPChangeMOV A,#2MOV B,#48LCALL ByteDisL;显示年MOV A,TIME11+6ANL A,#0F0HSWAP ALCALL TEMPChange ;时间数据转换为图形显示数据MOV A,#2 ;起始显示行在第2行(从第0行开始算)MOV B,#16 ;起始显示列在第16列(从第0列开始算) LCALL ByteDisL ;显示年,左半屏MOV A,TIME11+6ANL A,#0FHLCALL TEMPChangeMOV A,#2MOV B,#24LCALL ByteDisLRET;时间数据转换为图形显示数据的起始地址TEMPChange: RL AMOV B,AMOV DPTR,#Time_TabMOVC A,@A+DPTRXCH A,BINC AMOVC A,@A+DPTRMOV DPL,AMOV DPH,BRETTime_Tab: DW PIC0, PIC1, PIC2, PIC3, PIC4, PIC5, PIC6, PIC7, PIC8, PIC9 PIC0: ;-- 文字: 0 --DB000H,0E0H,010H,008H,008H,010H,0E0H,000H,000H,00FH,010H,020H,020H,010H, 00FH,000H PIC1:;-- 文字: 1 --DB000H,010H,010H,0F8H,000H,000H,000H,000H,000H,020H,020H,03FH,020H,020H,0 00H,000H PIC2:;-- 文字: 2 --DB000H,070H,008H,008H,008H,088H,070H,000H,000H,030H,028H,024H,022H,021H,0 30H,000H PIC3:;-- 文字: 3 --DB000H,030H,008H,088H,088H,048H,030H,000H,000H,018H,020H,020H,020H,011H,0 0EH,000H PIC4:;-- 文字: 4 --DB000H,000H,0C0H,020H,010H,0F8H,000H,000H,000H,007H,004H,024H,024H,03FH, 024H,000HPIC5:;-- 文字: 5 --DB000H,0F8H,008H,088H,088H,008H,008H,000H,000H,019H,021H,020H,020H,011H,0 0EH,000H PIC6:;-- 文字: 6 --DB000H,0E0H,010H,088H,088H,018H,000H,000H,000H,00FH,011H,020H,020H,011H,0 0EH,000H PIC7:;-- 文字: 7 --DB000H,038H,008H,008H,0C8H,038H,008H,000H,000H,000H,000H,03FH,000H,000H,0 00H,000H PIC8:;-- 文字: 8 --DB000H,070H,088H,008H,008H,088H,070H,000H,000H,01CH,022H,021H,021H,022H,0 1CH,000H PIC9:;-- 文字: 9 --DB000H,0E0H,010H,008H,008H,010H,0E0H,000H,000H,000H,031H,022H,022H,011H,0 0FH,000H;周数据转换为图形显示数据的起始地址,存在TEMPDis中WeekChange: RL AMOV B,AMOV DPTR,#Week_TabMOVC A,@A+DPTRXCH A,BINC AMOVC A,@A+DPTRMOV DPL,AMOV DPH,BRETWeek_Tab: DW Week0, Week1, Week2, Week3, Week4, Week5, Week6Week0: ;"Sun"DB000H,070H,088H,008H,008H,008H,038H,000H,000H,038H,020H,021H,021H,022H,0 1CH,000H DB080H,080H,000H,000H,000H,080H,080H,000H,000H,01FH,020H,020H,020H,010H,0 3FH,020H DB080H,080H,000H,080H,080H,080H,000H,000H,020H,03FH,021H,000H,000H,020H,0 3FH,020H Week1: ;"Mon"DB008H,0F8H,0F8H,000H,0F8H,0F8H,008H,000H,020H,03FH,000H,03FH,000H,03FH, 020H,000HDB000H,000H,080H,080H,080H,080H,000H,000H,000H,01FH,020H,020H,020H,020H,0 1FH,000H DB080H,080H,000H,080H,080H,080H,000H,000H,020H,03FH,021H,000H,000H,020H,0 3FH,020H Week2: ;"Tue"DB018H,008H,008H,0F8H,008H,008H,018H,000H,000H,000H,020H,03FH,020H,000H,0 00H,000H DB080H,080H,000H,000H,000H,080H,080H,000H,000H,01FH,020H,020H,020H,010H,0 3FH,020H DB000H,000H,080H,080H,080H,080H,000H,000H,000H,01FH,022H,022H,022H,022H,0 13H,000H Week3: ;"Wed"DB0F8H,008H,000H,0F8H,000H,008H,0F8H,000H,003H,03CH,007H,000H,007H,03CH, 003H,000H DB000H,000H,080H,080H,080H,080H,000H,000H,000H,01FH,022H,022H,022H,022H,0 13H,000H DB000H,000H,000H,080H,080H,088H,0F8H,000H,000H,00EH,011H,020H,020H,010H,0 3FH,020H Week4: ;"Thu"DB018H,008H,008H,0F8H,008H,008H,018H,000H,000H,000H,020H,03FH,020H,000H,0 00H,000H DB008H,0F8H,000H,080H,080H,080H,000H,000H,020H,03FH,021H,000H,000H,020H,0 3FH,020H DB080H,080H,000H,000H,000H,080H,080H,000H,000H,01FH,020H,020H,020H,010H,0 3FH,020H Week5: ;"Fri"DB008H,0F8H,088H,088H,0E8H,008H,010H,000H,020H,03FH,020H,000H,003H,000H,0 00H,000H DB080H,080H,080H,000H,080H,080H,080H,000H,020H,020H,03FH,021H,020H,000H,0 01H,000H DB000H,080H,098H,098H,000H,000H,000H,000H,000H,020H,020H,03FH,020H,020H,0 00H,000H Week6: ;"Sat"DB000H,070H,088H,008H,008H,008H,038H,000H,000H,038H,020H,021H,021H,022H,0 1CH,000H DB000H,000H,080H,080H,080H,080H,000H,000H,000H,019H,024H,022H,022H,022H,0 3FH,020H DB000H,080H,080H,0E0H,080H,080H,000H,000H,000H,000H,000H,01FH,020H,020H,0 00H,000H;显示周WeekDisplay: PUSH ACC ;A,B--X行,Y列序数PUSH BLCALL ByteDisR ;右半屏显示一个字节子程序POP ACCADD A,#8MOV B,APOP ACCPUSH ACCPUSH BLCALL ByteDisR ;显示第2个字母 POP ACCADD A,#8MOV B,APOP ACCLCALL ByteDisR ;显示第3个字母 RET;液晶初始化LCD_INIT: MOV A,#3EH ;初始化左半屏,关显示 LCALL WRComL ;写指令子程序MOV A,#FirstLine ;设置起始显示行,第0行 LCALL WRComLMOV A,#3EH ;初始化右半屏,关显示 LCALL WRComR ;写指令子程序MOV A,#FirstLine ;设置起始显示行,第0行 LCALL WRComRLCALL LCDClear ;清屏MOV A,#3FH ;开显示LCALL WRComLMOV A,#3FH ;开显示LCALL WRComRRET;清屏LCDClear: ;清左半屏MOV A,#0 ;起始行,第0行MOV B,#0 ;起始列,第0列LCDClearL1: PUSH ACCMOV R7,#64LCALL SETXYL ;设置起始显示行列地址 LCDClearL2: CLR ALCALL WRDATALDJNZ R7,LCDClearL2POP ACCINC ACJNE A,#8,LCDClearL1 ;共8行;清右半屏MOV A,#0 ;起始行,第0行MOV B,#0 ;起始列,第0列LCDClearR1: PUSH ACCMOV R7,#64LCALL SETXYR ;设置起始显示行列地址LCDClearR2: CLR ALCALL WRDATARDJNZ R7,LCDClearR2POP ACCINC ACJNE A,#8,LCDClearR1 ;共8行RET;***************************************;显示字体,显示一个数据要占用X行两行位置;***************************************;左半屏显示一个字节/字:A-起始显示行序数X(0-7);B-起始显示列序数Y(0-63);DPTR-显示字数据首地址ByteDisL: MOV R7,#8 ;显示8个字节数据,用于显示一个英文/符号 JMP DispL WordDisL: MOV R7,#16 ;显示16字节数据,用于显示一个汉字DispL: PUSH ACCPUSH 07HLCALL SETXYL ;设置起始显示行列地址LCALL DisplayL ;显示上半行数据POP 07H ;DPTR指向下半部分字体数据区POP ACCINC ALCALL SETXYL ;设置起始显示行列地址LCALL DisplayL ;显示下半行数据RET;右半屏显示一个字节/字:A-起始显示行序数X(0-7);B-起始显示列序数Y(0-63);DPTR-显示字数据首地址ByteDisR: MOV R7,#8 ;显示8个字节数据,用于显示一个英文/符号 SJMP DispR WordDisR: MOV R7,#16 ;显示16字节数据,用于显示一个汉字DispR: PUSH ACCPUSH 07HLCALL SETXYR ;设置起始显示行列地址LCALL DisplayR ;显示上半行数据POP 07H ;DPTR指向下半部分字体数据区POP ACCINC ALCALL SETXYR ;设置起始显示行列地址LCALL DisplayR ;显示下半行数据RET;***************************************;显示图形;***************************************;显示左半屏一行图形,A-X起始行序数(0-7),B-Y起始列地址序数(0-63) LineDisL: MOV R7,#64LCALL SETXYL ;设置起始显示行列LCALL DisplayL ;显示数据RET;显示右半屏一行图形,A-X起始行地址序数(0-7),B-Y起始列地址序数(0-63) LineDisR: MOV R7,#64LCALL SETXYR ;设置起始显示行列LCALL DisplayR ;显示数据RET;***************************************;基本控制;***************************************;显示左半屏数据,R7-显示数据个数DisplayL: CLR AMOVC A,@A+DPTRLCALL WRDataL ;写左半屏数据INC DPTRDJNZ R7,DisplayLRET;显示右半屏数据,R7-显示数据个数DisplayR: CLR AMOVC A,@A+DPTRLCALL WRDataR ;写左半屏数据INC DPTRDJNZ R7,DisplayRRET;设置左半屏起始显示行列地址,A-X起始行序数(0-7),B-Y起始列序数(0-63) SETXYL: ORL A,#X ;行地址=行序数+行基址LCALL WRComLMOV A,BORL A,#Y ;列地址=列序数+列基址LCALL WRComLRET;设置右半屏起始显示行列地址,A-X起始行序数(0-7),B-Y起始列序数(0-63) SETXYR: ORL A,#X ;行地址=行序数+行基址LCALL WRComRMOV A,BORL A,#Y ;列地址=列序数+列基址 LCALL WRComRRET;写左半屏控制指令,A-写入指令WRComL: PUSH DPLPUSH DPHMOV DPTR,#WR_COM_AD_LMOVX @DPTR,AWRComL1: MOV DPTR,#RD_BUSY_ADMOVX A,@DPTRJB ACC.7,WRComL1 ;检查液晶显示是否处于忙状态 POP DPHPOP DPLRET;写右半屏控制指令,A-写入指令WRComR: PUSH DPLPUSH DPHMOV DPTR,#WR_COM_AD_RMOVX @DPTR,AWRComR1: MOV DPTR,#RD_BUSY_ADMOVX A,@DPTRJB ACC.7,WRComR1 ;检查液晶显示是否处于忙状态 POP DPHPOP DPLRET;写左半屏数据,A-写入数据WRDataL: PUSH DPLPUSH DPHMOV DPTR,#WR_DATA_AD_LMOVX @DPTR,AWRDataL1: MOV DPTR,#RD_BUSY_ADMOVX A,@DPTRJB ACC.7,WRDataL1 ;检查液晶显示是否处于忙状态 POP DPHPOP DPLRET;写右半屏数据,A-写入数据WRDataR: PUSH DPLPUSH DPHMOV DPTR,#WR_DATA_AD_RMOVX @DPTR,AWRDataR1: MOV DPTR,#RD_BUSY_ADMOVX A,@DPTRJB ACC.7,WRDataR1 ;检查液晶显示是否处于忙状态POP DPHPOP DPLRET;初始化PCF8563_INIT: LCALL Delay8ms ;IIC总线从通电到开始操作要求8ms延时LCALL Register_INIT ;寄存器初始化LCALL Time_INIT ;时间初始化INIT_1: RET;寄存器初始化Register_INIT: LCALL CS1_Set ;设置控制/状态寄存器1LCALL CS2_Set ;设置控制/状态寄存器2LCALL DayA_Set ;设置天闹铃寄存器LCALL WeekdayA_Set ;设置周闹铃寄存器LCALL CO_Set ;设置时钟输出寄存器RETCS1_Set: MOV A,#CS1 ;A-寄存器地址,B-寄存器设置值MOV B,#00H ;全设为正常模式LCALL Write ;数据写入子程序RETCS2_Set: MOV A,#CS2MOV B,#02H ;开闹铃中断,关定时器中断LCALL WriteRETDayA_Set: MOV A,#DayAMOV B,#00H ;关天闹铃LCALL WriteRETWeekdayA_Set: MOV A,#WeekdayAMOV B,#00H ;关周闹铃LCALL WriteRETCO_Set: MOV A,#COMOV B,#00H ;关时钟输出LCALL WriteRET;时间初始化,05年7月1日 12:30:00,压缩BCD码格式(1个字节包含2个BCD 码) Time_INIT: MOV A,#Year ;A-寄存器地址;B-设置参数 MOV B,#05HLCALL Write ;写入一个字节数据子程序MOV A,#MouthMOV B,#07H ;最高位表示世纪:0-20XX,1-19XXLCALL WriteMOV A,#Weekday ;周是不会自动调整的,需要自已核对MOV B,#05HLCALL WriteMOV A,#DayMOV B,#1HLCALL WriteMOV A,#HourMOV B,#12HLCALL WriteMOV A,#MinuteMOV B,#30HLCALL WriteMOV A,#SecondMOV B,#00HLCALL WriteRET;读秒,返回A-秒数据Sec_Read: MOV A,#SecondLCALL ReadANL A,#7FHRET;读取时间,TIME-时间数据缓冲区Time_Read: MOV A,#Second ;起始读取地址,从秒开始MOV R7,#7 ;连续读取数据个数:秒,分,时,天,周,月,年 MOVR0,#TIME11 ;时间数据缓冲区LCALL Read_Sequence ;连续读取子程序LCALL Time_AdjustRET;时间写入,将秒,分,时,日,周,月,年写入;TIME-欲写入时间数据缓冲区Time_Write: MOV R0,#TIME11 ;时间数据缓冲区首地址MOV A,#Second ;秒数据地址为起始写入地址Time_Write_1: PUSH ACCMOV B,@R0 ;B-时间数据LCALL WritePOP ACCINC AINC R0CJNE R0,#TIME11+7,Time_Write_1RET;闹钟时间读取,只开启了时,分闹铃Alarm_Read: MOV A,#MinuteA ;起始读取地址,从分钟闹铃开始 MOV R7,#2 ;读取数据个数:分,时LCALL Read_Sequence ;连续读取子程序RET;时间调整,去除不必要的位数据Time_Adjust: MOV R0,#TIME11MOV A,@R0ANL A,#7FH ;调整秒XCH A,@R0INC R0MOV A,@R0ANL A,#7FH ;调整分钟XCH A,@R0INC R0MOV A,@R0ANL A,#3FH ;调整小时XCH A,@R0INC R0MOV A,@R0ANL A,#3FH ;调整日XCH A,@R0INC R0MOV A,@R0ANL A,#07H ;调整周XCH A,@R0INC R0MOV A,@R0ANL A,#1FH ;调整月,年不用调整XCH A,@R0RET;停止闹铃Alarm_Stop: MOV A,#CS2 ;控制/状态2寄存器地址LCALL Read ;读出当前控制/状态2寄存器值,在A中 ANL A,#0F7H ;清AF闹铃标志,AF在CS2第3位 MOV B,A ;欲写入数据放B中MOV A,#CS2LCALL WriteRET;写入1个字节数据,A-寄存器地址,B-数据Write: PUSH ACC ;寄存器地址压栈LCALL Start ;开始信号MOV A,#PCF8563_WRITE ;写操作指令LCALL Write_8bits ;写入8位数据LCALL Acknowledge ;查询接收端应答信号POP ACC ;写入寄存器地址LCALL Write_8bitsLCALL AcknowledgeMOV A,B ;写入设置值LCALL Write_8bitsLCALL AcknowledgeLCALL Stop ;停止信号RET;读取数据,分为两种模式:字节读取和连续读取;字节读取,一次读取一个字节的数据,A-读取地址及存放读出的数据Read: PUSH ACC ;寄存器地址压栈LCALL Start ;开始信号MOV A,#PCF8563_WRITE ;写操作指令LCALL Write_8bits ;写入8位数据LCALL Acknowledge ;查询接收端应答信号POP ACC ;写入寄存器地址LCALL Write_8bitsLCALL AcknowledgeLCALL StartMOV A,#PCF8563_Read ;读操作指令LCALL Write_8bitsLCALL AcknowledgeLCALL Read_8bits ;读取数据LCALL Stop ;停止信号RET;连续读取n个数据,n≤16;A-寄存器首地址,R7-读取数据个数,RO-读取数据存放首地址 Read_Sequence: PUSH ACC ;寄存器地址压栈LCALL Start ;开始信号MOV A,#PCF8563_WRITE ;写操作指令LCALL Write_8bits ;写入8位数据LCALL Acknowledge ;查询接收端应答信号POP ACC ;写入寄存器地址LCALL Write_8bitsLCALL AcknowledgeLCALL StartMOV A,#PCF8563_Read ;读操作指令 LCALL Write_8bits LCALL AcknowledgeSJMP Read_Sequence_1Read_Sequence_2:LCALL MasterACKRead_Sequence_1:LCALL Read_8bits ;读取数据 MOV @R0,A INC R0DJNZ R7,Read_Sequence_2LCALL StopRETDelay_tHD_DAT MACRONOPENDMDelay_tSU_DAT MACRONOPENDMDelay_tHIGH MACRONOPNOPENDMDelay_tLOW MACRONOPENDMDelay_tHD_STA MACRONOPENDMDelay_tSU_STO MACRONOPENDMDelay_tBUF MACRONOPNOPENDM;写入8位数据Write_8bits: PUSH 07HMOV R7,#8Write_8bits_1: CLR SCLDelay_tHD_DATRLC AMOV SDA,C ;在SCL为低时,将数据送上SDADelay_tSU_DATSETB SCLDelay_tHIGHDJNZ R7,Write_8bits_1CLR SCLPOP 07HRET;读取8位数据Read_8bits: PUSH 07HMOV R7,#8Read_8bits_1: CLR SCLDelay_tLOWSETB SCL ;SCL高电平时,读取SDA数据Delay_tHIGHMOV C,SDARLC ADJNZ R7,Read_8bits_1CLR SCLPOP 07HRET;开始信号Start: SETB SDA ;I2C总线操作开始信号:SCL为高时,SDA由高-->低 SETB SCLDelay_tBUFCLR SDADelay_tHD_STACLR SCLRET;结束信号Stop: Delay_tHD_DATCLR SDA ;I2C总线操作结束信号:SCL为高时,SDA由低-->高 SETB SCL Delay_tSU_STOSETB SDA ;操作结束后,确保I2C总线处于释放状态RET;从机应答查询Acknowledge: Delay_tLOWSETB SDA ;查询接收端应答信号,要先释放总线SETB SCLDelay_tHIGHJB SDA,$ ;接收端应答标志:将SDA置低CLR SCLRET;主机应答MasterACK: Delay_tHD_DATCLR SDA ;数据线SDA置0应答Delay_tSU_DATSETB SCLDelay_tHIGHCLR SCLSETB SDA ;置高数据,必须RET;延时8msDelay8ms: PUSH 07HPUSH 06HMOV R7,#36Delay8ms_1: MOV R6,#100DJNZ R6,$DJNZ R7,Delay8ms_1POP 06HPOP 07HRETEND六实验设备A1区:12864液晶显示模块电路12864J液晶:CS:片选信号,低电平有效;CS1/2:左右半屏使能选择,H:左半屏,L:右半屏;RS:选择读写的是指令或数据,L:指令,H:为数据。

微机原理闹钟实验报告

微机原理闹钟实验报告

微机原理闹钟实验报告实验名称:微机原理闹钟实验报告实验目的:1. 了解单片机的基本工作原理和编程方法;2. 学习如何使用单片机设计并实现闹钟功能;3. 掌握数字时钟显示技术。

实验器材:1. 单片机实验箱;2. AT89C52单片机;3. LED数码管;4. 4位开关;5. 电源线;6. 连线线缆。

实验原理:本次实验使用单片机AT89C52来设计和实现闹钟功能。

单片机是一种微型电子计算机系统,具有高度集成、功能强大等特点。

数码管是一种常见的数字显示装置,适用于时钟、计时器等场合。

实验步骤:1. 将AT89C52单片机与LED数码管通过连接线连接起来,保证电源线的正负极连接正常。

2. 编写C程序,实现显示当前时间的功能。

通过编程可以将当前时间在数码管上显示出来。

3. 设定闹钟时间和闹铃的功能,通过编程实现。

当闹钟时间到达时,数码管上会显示闹钟时间,并通过蜂鸣器发出声音。

4. 调试程序,确保闹钟功能正常运行。

5. 完成闹钟的相关操作,包括设置闹钟时间、启动闹钟、关闭闹钟等功能。

实验结果:经过编程和调试,我们成功实现了微机原理闹钟的功能。

我们能够通过设置闹钟时间并启动闹钟来实现报时的功能。

当闹钟时间到达时,数码管上会显示相应的时间,并通过蜂鸣器发出声音,起到提醒作用。

实验总结:通过这次实验,我深入了解了单片机的基本工作原理和编程方法。

同时,我学会了使用单片机设计和实现闹钟功能,并掌握了数字时钟显示技术。

这次实验让我对单片机的应用有了更深刻的认识,并提高了我对数字电路设计和编程的能力。

同时,我还发现了实验过程中可能存在的问题和改进的空间。

例如,我可以进一步完善闹钟功能,加入更多的定时和报时功能,提高闹钟的多样化和实用性。

此外,我还可以优化程序的运行效率,提高系统的稳定性和响应速度。

总之,本次实验对我的学习和提高具有重要意义。

通过实践操作,我深入理解了微机原理闹钟的设计与实现,拓宽了我的知识面和实践能力。

我将继续深入学习和掌握微机原理和相关技术,为以后的学习和研究打下坚实的基础。

单片机数字钟实习报告

单片机数字钟实习报告

一、实习目的随着电子技术的飞速发展,单片机作为一种重要的电子元件,在工业、医疗、通讯等领域得到了广泛的应用。

为了更好地掌握单片机的原理和应用,提高动手能力,我们选择了单片机数字钟作为实习项目。

通过本次实习,我们旨在掌握单片机的编程、调试、硬件连接等方面的知识,实现数字时钟的显示与控制。

二、实习内容1. 单片机数字钟硬件设计(1)选用AT89C51单片机作为核心控制单元,具有丰富的片上资源,方便编程和调试。

(2)采用LCD1602液晶显示屏,显示时间、日期等信息。

(3)使用DS1302实时时钟芯片,实现时间的存储和更新。

(4)选用按键作为输入设备,实现时间的调整和设置。

(5)选用蜂鸣器作为报警设备,实现定时报警功能。

2. 单片机数字钟软件设计(1)编写主程序,实现系统初始化、时间显示、按键扫描、时间调整等功能。

(2)编写中断服务程序,实现DS1302时钟芯片的读写、按键消抖等功能。

(3)编写子程序,实现时间的计算、格式化、显示等功能。

3. 单片机数字钟调试与测试(1)连接电路,检查各个模块的连接是否正确。

(2)编写程序,将程序烧录到单片机中。

(3)调试程序,确保程序运行正常。

(4)测试各个功能模块,如时间显示、按键调整、定时报警等。

三、实习过程1. 硬件设计(1)根据设计要求,绘制电路原理图。

(2)购买所需元器件,进行焊接。

(3)组装电路板,连接各个模块。

2. 软件设计(1)编写程序,采用C语言进行编程。

(2)使用Keil软件进行编译、烧录。

(3)在仿真软件Proteus中进行仿真,验证程序的正确性。

3. 调试与测试(1)连接电路,检查各个模块的连接是否正确。

(2)编写程序,将程序烧录到单片机中。

(3)调试程序,确保程序运行正常。

(4)测试各个功能模块,如时间显示、按键调整、定时报警等。

四、实习总结1. 通过本次实习,我们掌握了单片机的编程、调试、硬件连接等方面的知识。

2. 学会了使用LCD1602液晶显示屏、DS1302实时时钟芯片、按键等元器件。

单片机实验报告数字时钟设计报告

单片机实验报告数字时钟设计报告

单片机实验报告数字时钟设计报告一、实验目的本次单片机实验的目的是设计并实现一个基于单片机的数字时钟。

通过该实验,深入了解单片机的工作原理和编程方法,掌握定时器、中断、数码管显示等功能的应用,提高综合运用知识解决实际问题的能力。

二、实验原理1、单片机选择本次实验选用了常见的 51 系列单片机,如 STC89C52。

它具有丰富的资源和易于编程的特点,能够满足数字时钟的设计需求。

2、时钟计时原理数字时钟的核心是准确的计时功能。

通过单片机内部的定时器,设定合适的定时时间间隔,不断累加计时变量,实现秒、分、时的计时。

3、数码管显示原理采用共阳或共阴数码管来显示时间数字。

通过单片机的 I/O 口控制数码管的段选和位选信号,使数码管显示相应的数字。

4、按键控制原理设置按键用于调整时间。

通过检测按键的按下状态,进入相应的时间调整模式。

三、实验设备与材料1、单片机开发板2、数码管3、按键4、杜邦线若干5、电脑及编程软件(如 Keil)四、实验步骤1、硬件连接将数码管、按键与单片机开发板的相应引脚通过杜邦线连接起来。

确保连接正确可靠,避免短路或断路。

2、软件编程(1)初始化单片机的定时器、中断、I/O 口等。

(2)编写定时器中断服务程序,实现秒的计时。

(3)设计计时算法,将秒转换为分、时,并进行进位处理。

(4)编写数码管显示程序,将时间数据转换为数码管的段选和位选信号进行显示。

(5)添加按键检测程序,实现时间的调整功能。

3、编译与下载使用编程软件将编写好的程序编译生成可执行文件,并下载到单片机中进行运行测试。

五、程序设计以下是本次数字时钟设计的主要程序代码片段:```cinclude <reg52h>//定义数码管段选码unsigned char code SEG_CODE ={0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};//定义数码管位选码unsigned char code BIT_CODE ={0x01, 0x02, 0x04, 0x08, 0x10,0x20, 0x40, 0x80};//定义时间变量unsigned int second = 0, minute = 0, hour = 0;//定时器初始化函数void Timer_Init(){TMOD = 0x01; //定时器 0 工作在方式 1 TH0 =(65536 50000) / 256; //定时 50ms TL0 =(65536 50000) % 256;EA = 1; //开总中断ET0 = 1; //开定时器 0 中断TR0 = 1; //启动定时器 0}//定时器 0 中断服务函数void Timer0_ISR() interrupt 1{TH0 =(65536 50000) / 256;TL0 =(65536 50000) % 256;second++;if (second == 60){second = 0;minute++;if (minute == 60){minute = 0;hour++;if (hour == 24){hour = 0;}}}}//数码管显示函数void Display(){unsigned char i;for (i = 0; i < 8; i++)P2 = BIT_CODEi;if (i == 0){P0 = SEG_CODEhour / 10;}else if (i == 1){P0 = SEG_CODEhour % 10;}else if (i == 2){P0 = 0xBF; //显示“”}else if (i == 3){P0 = SEG_CODEminute / 10;else if (i == 4){P0 = SEG_CODEminute % 10;}else if (i == 5){P0 = 0xBF; //显示“”}else if (i == 6){P0 = SEG_CODEsecond / 10;}else if (i == 7){P0 = SEG_CODEsecond % 10;}delay_ms(1);//适当延时,防止闪烁}}//主函数void main(){Timer_Init();while (1){Display();}}```六、实验结果与分析1、实验结果将程序下载到单片机后,数字时钟能够正常运行,准确显示时、分、秒,并且通过按键可以进行时间的调整。

数字钟实验报告5篇范文

数字钟实验报告5篇范文

数字钟实验报告5篇范文第一篇:数字钟实验报告数字钟实验报告班级:电气信息i类112班实验时间:实验地点:指导老师:目录一、实验目的-----------------3二、实验任务及要求--------3三、实验设计内容-----------3(一)、设计原理及思路3(二)、数字钟电路的设计--------------------------4(1)电路组成---------4(2)方案分析---------10(3)元器件清单------11四、电路制版与焊接---------11五、电路调试------------------12六、实验总结及心得体会---13七、组员分工安排------------19一、实验目的:1.学习了解数码管,译码器,及一些中规模器件的逻辑功能和使用方法。

2.学习和掌握数字钟的设计方法及工作原理。

熟悉集成电路的引脚安排,掌握各芯片的逻辑功能及使用方法了解面包板结构及其接线方法。

3.了解pcb板的制作流程及提高自己的动手能力。

4.学习使用protel软件进行电子电路的原理图设计、印制电路板设计。

5.初步学习手工焊接的方法以及电路的调试等。

使学生在学完了《数字电路》课程的基本理论,基本知识后,能够综合运用所学理论知识、拓宽知识面,系统地进行电子电路的工程实践训练,学会检查电路的故障与排除故障的一般方法锻炼动手能力,培养工程师的基本技能,提高分析问题和解决问题的能力。

二、实验任务及要求1.设计一个二十四小时制的数字钟,时、分、秒分别由二十四进制、六十进制、六十进制计数器来完成计时功能。

2.能够准确校时,可以分别对时、分进行单独校时,使其到达标准时间。

3.能够准确计时,以数字形式显示时、分,发光二极管显示秒。

4.根据经济原则选择元器件及参数;5..小组进行电路焊接、调试、测试电路性能,撰写整理设计说明书。

三、实验设计内容1、设计原理及思路 3.1数字钟的构成数字钟一般由振荡器、分频器、计数器、译码器、显示器、较时电路、报时电路等部分组成,这些都是数字电路中应用最广的基本电路3.2原理分析数字钟实际上是一个对标准频率(1hz)进行计数的计数电路。

单片机数字钟实习报告

单片机数字钟实习报告

单片机数字钟实习报告一、实习目的和意义随着计算机科学与技术的飞速发展,计算机的应用已经渗透到国民经济与人们生活的各个角落,而单片机技术作为计算机技术中的一个独立分支,具有性价比高、集成度高、体积小、可靠性高、控制功能强大、低功耗、低电压等特点,因此在各个领域得到了广泛的应用。

本次实习旨在通过设计一款数字钟,使学生掌握单片机的原理及其应用,提高实际动手能力和创新能力。

数字钟作为一种典型的数字电路,包括组合逻辑电路和时序电路。

通过设计制作数字钟,可以让学生了解数字钟的原理,学会制作数字钟,并进一步了解各种中小规模集成电路的作用及实用方法。

同时,通过数字钟的制作,可以让学生进一步学习与掌握各种组合逻辑电路与时序电路的原理与使用方法。

二、实习内容和要求1. 设计一款基于单片机的数字钟,能显示时、分、秒。

2. 数字钟具有校时功能,能以24小时为一个周期循环显示时间。

3. 掌握单片机的原理及其编程方法,熟悉LCD1602液晶显示屏的使用。

4. 了解数字钟的原理,学会制作数字钟,并掌握各种组合逻辑电路与时序电路的原理与使用方法。

三、实习过程1. 首先,我们对单片机的原理进行了学习,了解了单片机的内部结构、工作原理及其编程方法。

同时,我们还学习了LCD1602液晶显示屏的使用,掌握了如何将单片机与LCD1602液晶显示屏进行连接。

2. 接下来,我们开始了数字钟的设计。

首先,我们设计了数字钟的电路原理图,包括了单片机、LCD1602液晶显示屏、按键、时钟芯片等元件。

然后,我们进行了电路板的焊接,焊接过程中,我们严格遵循电路焊接规范,确保了电路板的质量和稳定性。

3. 焊接完成后,我们开始了数字钟的程序编写。

我们编写了相应的程序,实现了数字钟的时、分、秒显示功能以及校时功能。

在编程过程中,我们深入理解了单片机的编程原理,掌握了Keil编程软件的使用。

4. 最后,我们对数字钟进行了调试和测试。

我们通过观察数字钟的显示效果,分析了可能存在的问题,并针对问题进行了改进。

单片机数字钟设计报告

单片机数字钟设计报告

目录一前言 (1)1.1数字电子钟的意义1.2数字电子钟的应用二总体方案设计 (1)三系统硬件设计 (2)6单片机最小系统1.I/O 地址分配2.复位电路3 时钟电路4 按键电路5 显示电路四系统软件设计 (6)1 软件程序内容2 软件流程图五系统调试 (9)1 系统功能 (9)2.软件调试问题及解决六设计总结 (9)附录 (11)1)系统原理图 (11)2)系统仿真图源程序 (13)一前言1.1数字电子钟的意义单片机模块中最常见的是数字钟, 数字钟是一种用数字电路技术实现时、分、秒计时的装置, 与机械式时钟相比具有更高的准确性和直观性, 且无机械装置, 具有更更长的使用寿命, 因此得到了广泛的使用。

数字钟是采用数字电路实现对.时,分,秒.数字显示的计时装置,广泛用于个人家庭,车站, 码头办公室等公共场所,成为人们日常生活中不可少的必需品,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表, 钟表的数字化给人们生产生活带来了极大的方便, 而且大大地扩展了钟表原先的报时功能。

诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等, 所有这些, 都是以钟表数字化为基础的。

因此, 研究数字钟及扩大其应用, 有着非常现实的意义。

1.2数字电子钟的应用数字钟已成为人们日常生活中: 必不可少的必需品, 广泛用于个人家庭以及车站、码头、剧场、办公室等公共场所, 给人们的生活、学习、工作、娱乐带来极大的方便。

由于数字集成电路技术的发展和采用了先进的石英技术, 使数字钟具有走时准确、性能稳定、携带方便等优点, 它还用于计时自动报时及自动控制的领域。

二总体方案设计数字钟在日常生活中最常见, 应用也最广泛。

本文主要就是设计一款数字钟, 以89C52单片机为核心, 配备液晶显示模块、时钟芯片、等功能模块。

数字钟采用24小时制方式显示时间, 定时信息以及年月日显示等功能。

单片机设计时钟实训报告

单片机设计时钟实训报告

一、引言随着科技的不断发展,单片机技术在电子领域得到了广泛的应用。

为了提高学生的实践能力,培养实际工程应用能力,我们进行了单片机设计时钟实训。

本实训以AT89C51单片机为核心,通过学习时钟电路的设计、编程和调试,使学生掌握单片机在时钟设计中的应用,提高学生的动手能力和创新思维。

二、实训目的1. 掌握单片机的基本原理和编程方法;2. 熟悉时钟电路的设计和调试;3. 培养学生的实际工程应用能力和创新思维;4. 提高学生的团队协作能力和沟通能力。

三、实训内容1. 硬件设计(1)单片机选型:选用AT89C51单片机作为核心控制单元;(2)时钟电路:采用晶振电路作为时钟源,实现1Hz的基准时钟;(3)显示电路:采用LCD1602液晶显示屏,实现时间、日期和星期等信息显示;(4)按键电路:设计4个按键,分别用于设置时间、日期、星期和闹钟功能;(5)复位电路:采用上电复位和按键复位两种方式,保证系统稳定运行。

2. 软件设计(1)系统初始化:初始化单片机,设置波特率、定时器等;(2)时间显示:通过读取实时时钟芯片(如DS1302)的数据,显示时间、日期和星期;(3)按键处理:根据按键输入,实现时间、日期、星期和闹钟的设置与修改;(4)闹钟功能:当设定的时间到达时,通过蜂鸣器发出提示音。

3. 调试与优化(1)调试方法:使用Proteus软件进行仿真调试,观察程序运行状态,分析故障原因;(2)优化方法:针对仿真过程中出现的问题,优化程序代码,提高程序运行效率。

四、实训过程1. 硬件制作(1)按照设计图纸,焊接电路板;(2)连接晶振、LCD显示屏、按键和蜂鸣器等元器件;(3)调试电路,确保各元器件正常工作。

2. 软件编写(1)使用Keil C51软件编写程序,实现时钟显示、按键处理和闹钟功能;(2)编译程序,生成HEX文件。

3. 调试与优化(1)使用Proteus软件进行仿真调试,观察程序运行状态;(2)针对仿真过程中出现的问题,优化程序代码,提高程序运行效率;(3)将优化后的程序烧录到单片机中,进行实际运行测试。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

单片机课程设计:电子钟一、实现功能1、能够实现准确计时,以数字形式显示时、分、秒的时间。

2、小时以24小时计时形式,分秒计时为60进位,能够调节时钟时间。

3、闹钟功能,一旦走时到该时间,能以声或光的形式告警提示。

4、能够实现按键启动与停止功能。

5、能够实现整点报时功能。

6、能够实现秒表功能。

二、设计思路1、芯片介绍VCC:电源。

GND:接地。

P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL 门电流。

当P1口的管脚第一次写1时,被定义为高阻输入。

P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。

在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。

P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。

P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。

在FLASH编程和校验时,P1口作为第八位地址接收。

P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。

并因此作为输入时,P2口的管脚被外部拉低,将输出电流。

这是由于内部上拉的缘故。

P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。

在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。

P2口在FLASH编程和校验时接收高八位地址信号和控制信号。

P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。

当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。

作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。

P3口也可作为AT89C51的一些特殊功能口,如下表所示:口管脚备选功能P3.0 RXD(串行输入口)P3.1 TXD(串行输出口)P3.2 /INT0(外部中断0)P3.3 /INT1(外部中断1)P3.4 T0(记时器0外部输入)P3.5 T1(记时器1外部输入)P3.6 /WR(外部数据存储器写选通)P3.7 /RD(外部数据存储器读选通)P3口同时为闪烁编程和编程校验接收一些控制信号。

RST:复位输入。

当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。

ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。

在FLASH编程期间,此引脚用于输入编程脉冲。

在平时,ALE 端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。

因此它可用作对外部输出的脉冲或用于定时目的。

然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。

如想禁止ALE的输出可在SFR8EH地址上置0。

此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。

另外,该引脚被略微拉高。

如果微处理器在外部执行状态ALE禁止,置位无效。

PSEN:外部程序存储器的选通信号。

在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。

但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。

EA/VPP:当/EA保持低电平时,则在此期间外部程序存储(0000H-FFFFH),不管是否有内部程序存储器。

注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。

在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。

2、显示电路就时钟而言,通常可采用液晶显示或数码管显示。

由于一般的段式液晶屏,需要专门的驱动电路,而且液晶显示作为一种被动显示,可视性相对较差;对于具有驱动电路和微处理器接口的液晶显示模块(字符或点阵),一般多采用并行接口,对微处理器的接口要求较高,占用资源多。

另外,89C2051本身无专门的液晶驱动接口,因此,本时钟采用数码管显示方式。

数码管作为一种主动显示器件,具有亮度高、价格便宜等优点,而且市场上也有专门的时钟显示组合数码管。

对于实时时钟而言,显示显然是另一个重要的环节。

通常LED 显示有两种方式:动态显示和静态显示。

静态显示的优点是程序简单、显示亮度有保证、单片机CPU 的开销小,节约CPU的工作时间。

但占有I/O口线多,每一个LED 都要占有一个I/O口,硬件开销大,电路复杂。

需要几个LED就必须占有几个并行口,比较适用于LED数量较少的场合。

当然当LED数量较多的时候,可以使用单片机的串行口通过移位寄存器的方式加以解决,但程序编写比较麻烦。

LED动态显示硬件连接简单,但动态扫描的显示方式需要占有CPU较多的时间,在单片机没有太多实时测控任务的情况下可以采用。

本系统需要采用6位LED数码管来分别显示时、分、秒,因数码管个数较多,故本系统选择动态显示方式。

此次设计主要是应用单片机来设计电子时钟,硬件部分主要分以下电路模块:显示电路用6个共阴数码管分别显示,小时、分钟和秒,通过动态扫描进行显示,从而避免了译码器的使用,同时节约了I/0端口,使电路更加简单。

单片机采用AT89S51系列,这种单片机应用简单,适合电子钟设计。

针对要实现的功能,采用AT89S51单片机进行设计,AT89S51单片机是一款低功耗,高性能CMOS8位单片机,片内含4KB在线可编程(ISP)的可反复擦写1000次的Flash只读程序存储器,器件采用高密度、非易失性存储技术制造,兼容标准MCS- 51指令系统及80C51引脚结构。

这样,既能做到经济合理又能实现预期的功能。

在程序方面,采用分块设计的方法,这样既减小了编程难度、使程序易于理解,又能便于添加各项功能。

程序可分为闹钟的声音程序、时间显示程序,秒表显示程序,时间调整程序、闹钟调整程序、定时调整程序,延时程序、整点报时等。

运用这种方法,关键在于各模块的兼容和配合,以免各模块不匹配会出现意想不到的错误。

首先,在编程之前必须了解硬件结构尤其是各引脚的用法,以及内部寄存器、存储单元的用法,否则,编程无从下手,电路也无法设计。

这是前期准备工作。

第二部分是硬件部分:依据想要的功能分块设计设计,比如输入需要开关电路,输出需要显示驱动电路和数码管电路等。

第三部分是软件部分:先学习理解汇编语言的编程方法再根据设计的硬件电路进行分块的编程调试,最终完成程序设计。

第四部分是软件画图部分:设计好电路后进行画图,包括电路图和仿真图的绘制。

第五部分是软件仿真部分:软硬件设计好后将软件载入芯片中进行仿真,仿真无法完成时检查软件程序和硬件电路并进行修改直到仿真成功。

在已经正确的设计基础上,添加额外的功能!在设计的的过程中,主要采用分块设计的方法,进行分块调试在进行整体组合。

在设计实时显示时间和秒表时主要是时间的计算,才能精确计时间,和两个定时器的优先级问题才能进行两个模块的切换。

三、设计流程图计时模块流程图四、设计功能模块1、时间调整模块s4按键按下(p1.3)进入时间调整状态,判断S4键,若再次按下开始进行小时调整,每次按下s4键时小时加一,若S4键未按下判断S0键(p1.4)是否按下,若S0键按下,分钟加一,若S0未按下,判断S1键,若s1键按下,返回主程序,进行时间与闹钟的切换。

2、闹钟模块若S0键按下,开启闹钟,进入闹钟判断模块,若满足闹钟的分钟与时钟的分钟相等,并且闹钟的小时与时钟的小时相等,进入喇叭响应模块。

S0键释放则关闭闹钟。

3、秒表模块若S2键(P1.1)按下,进入秒表模块,显示秒表初始值。

若S5键(p3.0)按下,显示秒表初始值并开始秒表计时。

若弹起S5键则停止秒表计数并复位。

若弹起S2键重新进行时间显示。

4、整点报时模块26H中存放整点报时的标志位,若时间模块中存放分钟的地址中数为60,则将存放小时的数传递给A并使A自增1,若A不等于0,,进入喇叭响应模块,若A为0返回主程序。

5、时钟定时模块定时50ms,定时为T0方式1,初始值TH0=3CH TL0=0B0H,X=216-50X0.001/0.000001=155366、秒表定时模块由于使用两个定时器,T0的自然优先级高于T1的,所以在执行秒表按键时,T1的优先级应高于T0,应对IP进行设置,使IP为08H。

定时10ms,定时为T1方式1,初始值TH0=0FCH TL0=18H,X=216-10X0.001/0.000001=645367、延时模块延时25msDELAY: MOV R4,#015HDL00: MOV R5,#0FFHDL11: MOV R6,#9HDL12: DJNZ R6,DL12DJNZ R5,DL11DJNZ R4,DL00RET四、proteus程序仿真图五、仿真结果分析通过S1、S0、S3和S4四个按键,对时间进行修改和闹钟的设置,S0控制闹钟的启动和停止。

通过S2来进入秒表模式,按下S5进行秒表正确计时。

弹起S5和S2进入时间显示。

按下S1键显示闹钟,松开后显示时间;按进入时间修改模式,再按S4键时间的时加1,按S2分加1,调整结束后按下S1恢复正常显示;按下S3键进入闹钟修改模式,再按S3键闹钟的时加1,按S2分加1,调整结束后按下S1恢复正常显示。

六、设计心得体会本次课程设计,即将告一段落,但收获却是弥足珍贵。

一分耕耘,一分收获。

部亲自去尝试,你很难去体验那份开心。

我们经过了这半年对单片机由一无所知到逐步了解,现在开始了一些小的制作。

课程设计是一项好的方向,让我们去自我提高,很有裨益。

实验开始前,同组的同伴就开始了收集资料,尝试着去努力实现一些功能。

起初,我对单片机知道很少,还是经过看看细节性的东西,才渐渐有些入门。

当然,实验的过程中也遇到了许多的难题。

1、实现电子钟的数码显示,在这一过程中,显示部分总是会出现这样那样的问题。

2、按键问题我的设计中,大部分功能选择是通过按键开关实现的。

在仿真中发现,调整数值时,有时按键反应太快,按一次,跳了几下,使设置时间很不方便。

但是仿真多了之后,找到了按键(实际上是按鼠标)的节奏,对按键的掌控力提高了不少,不怎么会出现跳变的情况了。

有些开关我采用了长按键的方式来防抖,效果不错,但是每次都要长按键,调整效率太低,我没有普及。

本来想把所有的按键都加延时防抖电路,但仿真中感觉对键盘的控制力没提高多少。

3、定时/计数器的使用问题。

在实验过程中多次运用到定时器T0\T1,我们在使用时忽略了中断的优先级,从而使同级的中断存在时,而不能很好的达到目的。

程序:ORG 0000HLJMP STARTORG 000BHLJMP TIMEORG 001BHLJMP TIMEA;********初始化*********START: MOV SP, #50HMOV 20H,#00H ;定义秒MOV 21H,#00H ;定义分MOV 22H,#00H ;定义时MOV 23H,#01H ;定义闹钟分钟MOV 24H,#01H ;定义闹钟小时MOV 25H,#00HMOV 26H,#00HMOV 30H,#00H ;时间SECOND送显缓冲区MOV 31H,#00HMOV 32H,#00H ;时间MINUTE送显缓冲区MOV 33H,#00HMOV 34H,#00H ;时间HOUR送显缓冲区MOV 35H,#00HMOV 36H,#01H ;闹钟分钟送显缓冲区MOV 37H,#00HMOV 38H,#01H ;闹钟小时十位送显缓冲区MOV 39H,#00H ;闹钟小时个位送显缓冲区MOV 50H,#00H ;按键次数MOV 27H,#00H ;秒表最低两位MOV 28H,#00H ;秒表秒计数单元MOV 29H,#00H ;秒表分计数单元MOV TMOD,#11H ;16位计数器MOV TH0, #03CH ;赋初值MOV TL0, #0B0HMOV TH1, #0FCH ;赋初值MOV TL1, #018HMOV IE, #8AH ;中断允许SETB TR0 ;启动T0MOV R2,#14HMOV R1,#0AHMOV P2,#0FFH;*********主程序**********MAIN:JB P1.4,GBLCALL TIMEPRO ;调用闹钟判断GB: LCALL DISPLAY1 ;调用时间显示JB P1.3,M1 ;P1.3=1时转移S4没有按下LCALL SETTIME ;调用SETTIME调时子程序LJMP MAINM1: JB P1.2,M2 ;P1 g.2=1时转移S3LCALL SETATIME ;调用SETATIME子程序LJMP MAINM2: JB P1.0,M4 ;P1.0=1时转移S1 LCALL LOOKATIME ;调用LOOKATIME显示闹钟子程序LJMP MAINM4: JB P1.1,M5 ;P1.1=1时转移主程序LCALL DISPLAY1 ;调用秒表显示LCALL LOOKM5: LJMP MAIN;*********存时间程序**********M7: MOV A,20HMOV B,#0AHDIV ABMOV 31H,A ;将A的低4位存入31单元MOV 30H,B ;将A的高4位存入30单元MOV A,21HMOV B,#0AHDIV ABMOV 33H,A ;将A的低4位存入33单元MOV 32H,B ;将A的高4位存入32单元MOV A,22HMOV B,#0AHDIV ABMOV 35H,A ;将A的低4位存入35单元MOV 34H,BM8: RET;*********秒表送出始值到显示缓冲区**********MJ: MOV 27H,#00HMOV 28H,#00HMOV 29H,#00HMOV A,27HMOV B,#0AHDIV ABMOV 31H,A ;将A的低4位存入31单元MOV 30H,B ;将A的高4位存入30单元MOV A,28HMOV B,#0AHDIV ABMOV 33H,A ;将A的低4位存入33单元MOV 32H,B ;将A的高4位存入32单元MOV A,29HMOV B,#0AHDIV ABMOV 35H,A ;将A的低4位存入35单元MOV 34H,BMK: RET;*********延时子程序********LOOK: LCALL DISPLAY1MM1: JNB P3.0,LERLCALL M7LCALL MJCLR TR1CLR PT1LCALL DISPLAY1LJMP M6LER: MOV IP,#08HSETB TR1LCALL DISPLAY1M6: RET;***********时间调整*******SETTIME: ;设置时间L0: LCALL DISPLAY1JB P1.3,L1 ;P1.3=1时转移MOV C,P1.3JC MM1LCALL DELAY1 ;延时JC MM1MSTOP1: MOV C,P1.3 ;P1.3为0时转移JNC MSTOP1LCALL DELAY1 ;延时MOV A,50HINC 50HCJNE A,#00H,HJ1LJMP L0HJ1:INC 22H ;小时自加一MOV A,22HCJNE A,#18H,GO12 ;小时计数循环MOV 22H,#00H ;复位MOV 34H,#00HMOV 35H,#00HLJMP L0L1: JB P1.4,L2 ;P1.1=1时转移MOV C,P1.4JC L1LCALL DELAY1 ;延时JC L1MSTOP2: MOV C,P1.4 ;P1.1=0时转移JNC MSTOP2LCALL DELAY1 ;延时MOV C,P1.4JNC MSTOP2INC 21H ;分钟加一MOV A,21HCJNE A,#3CH,GO11 ;分钟计数循环MOV 21H,#00H ; 复位MOV 32H,#00HMOV 33H,#00HLJMP L0GO11: MOV B,#0AHDIV ABMOV 32H,B ; 将A的低4位存入32单元MOV 33H,A ; 将A的高4位存入33单元LJMP L0GO12: MOV B,#0AHDIV ABMOV 34H,B ;将A的低4位存入34单元MOV 35H,A ; 将A的高4位存入35单元LJMP L0L2: JB P1.0,L0 ; P1.0=1时转移MOV C,P1.0JC L2LCALL DELAY1 ;延时MOV C,P1.0JC L2STOP1: MOV C,P1.0 ; P1.0=0时转移JNC STOP1LCALL DELAY1 ;延时MOV C,P1.0JNC STOP1MOV 50H,#00HMMM: LJMP MAIN;*******设置闹钟*******SETATIME:LCALL DISPLAY2 ; 调用DISPLAY2显示闹钟N0: LCALL DISPLAY2MM2: JB P1.2,N1 ;P1.2=1时转移MOV C,P1.2JC MM2LCALL DELAY1 ; 延时JC MM2MSTOP3: MOV C,P1.2 ; P1.2=0时转移JNC MSTOP3LCALL DELAY1 ; 延时MOV A,50HINC 50HCJNE A,#00H,HJ2LJMP N0HJ2:INC 24H ;小时加一MOV A,24HCJNE A,#24,GO22 ;小时计数循环MOV 24H,#00H ;复位MOV 38H,#00HMOV 39H,#00HLJMP N0N1: JB P1.4,N2 ;P1.1=1时转移MOV C,P1.4JC N1LCALL DELAY1 ;延时JC N1MSTOP4: MOV C,P1.4 ;P1.1=0时转移JNC MSTOP4LCALL DELAY1 ;延时MOV C,P1.4JNC MSTOP4INC 23H ;分钟加一MOV A,23HCJNE A,#60,GO21 ;分钟计数循环MOV 23H,#00H ;复位MOV 36H,#00HMOV 37H,#00HLJMP N0GO21: MOV B,#0AHDIV ABMOV 36H,B ;将A的低4位存入36单元MOV 37H,A ;将A的高4位存入37单元LJMP N0GO22: MOV B,#0AHDIV ABMOV 38H,B ;将A的低4位存入38单元MOV 39H,A ;将A的高4位存入39单元LJMP N0N2: JB P1.0 ,N0 ;P1.0=1时转移MOV C,P1.0JC N2LCALL DELAY1 ;延时MOV C,P1.0JC N2STOP2: MOV C,P1.0JNC STOP2LCALL DELAY1MOV C,P1.0JNC STOP2MOV 50H,#00HLJMP MAIN;*******闹钟判断*****************TIMEPRO: MOV A,21HMOV B,23HCJNE A,B,BK ;判断定时闹钟的分钟MOV A,22HMOV B,24HCJNE A,B,BK ;判断定时闹钟的小时SETB 25H.0MOV C,25H.0LCALL TIMEOUT ;调用TIMEOUT BK:RET;**************喇叭报警***************** TIMEOUT: CLR 26HX1: LCALL BZ ;调用喇叭响应程序CLR 25H.0 ;调用喇叭响应程序结束LCALL DELAY ;延时CLR 25H.0LJMP DISPLAY1BZ:MOV C,25H.1MOV P1.6,CCLR P1.7MOV R7,#0FFH ;喇叭响应时间T2: MOV R6,#0FFHT3: DJNZ R6,T3DJNZ R7,T2SETB P1.7RET;*************显示闹钟时间************ LOOKATIME:LCALL DISPLAY2MM: JNB P1.0,LOOKATIMELCALL DELAY1LJMP MAINDELAY1: MOV R4,#15H ;时间延时DL001: MOV R5,#0FFHDL111: DJNZ R5,DL111DJNZ R4,DL001RET;***********定时**************TIME: PUSH ACC ;保护现场PUSH PSWMOV TH0,#03CH ;初值MOV TL0,#0B0HDJNZ R2,RET0MOV R2,#14HMOV A,20HINC A ;秒自加一CJNE A,#3CH,GO1 ;秒计数循环MOV 20H,#0 ;复位MOV 30H,#0MOV 31H,#0MOV A,21HINC A ;分钟自加一CJNE A,#3CH,GO2SETB 26HJB 26H,AAAA:LCALL TIMEOUT1CLR 26H ;分钟计数循环MOV 21H,#0H ;复位MOV 32H,#0MOV 33H,#0MOV A,22HINC A ;小时自加一CJNE A,#18H,GO3 ;小时计数循环MOV 22H,#00H ;复位MOV 34H,#0MOV 35H,#0AJMP RET0GO1: MOV 20H,AMOV B,#0AHDIV ABMOV 31H,A ;将A的低4位存入31单元MOV 30H,B ;将A的高4位存入30单元AJMP RET0GO2: MOV 21H,AMOV B,#0AHDIV ABMOV 33H,A ;将A的低4位存入33单元MOV 32H,B ;将A的高4位存入32单元AJMP RET0GO3: MOV 22H,AMOV B,#0AHDIV ABMOV 35H,A ;将A的低4位存入35单元MOV 34H,B ;将A的高4位存入34单元AJMP RET0RET0: POP PSW ;恢复现场POP ACCRETITIMEOUT1:MOV R1,22HINC R1X11: LCALL BZ1LJMP DISPLAY1 ;调用喇叭响应程序LCALL DELAY2LJMP DISPLAY1BZ1: MOV C,25H.1MOV P1.6,CCLR P1.7MOV R7,#0FFH ;喇叭响应时间T21: MOV R6,#0FFHT31: DJNZ R6,T31DJNZ R7,T21SETB P1.7DJNZ R1,X11RETDELAY: MOV R4,#015HDL00: MOV R5,#0FFHDL11: MOV R6,#9HDL12: DJNZ R6,DL12DJNZ R5,DL11DJNZ R4,DL00RET;*********秒表定时**********TIMEA:MOV TH1,#0FCH ;初值MOV TL1,#018HDJNZ R1,RET0MOV R1,#0AHMOV A,27HINC A ;毫秒自加一CJNE A,#60H,GO1A ;毫秒秒计数循环MOV 27H,#0 ;复位MOV 30H,#0MOV 31H,#0MOV A,28HINC A ;秒自加一CJNE A,#3CH,GO2AMOV 28H,#0H ;复位MOV 32H,#0MOV 33H,#0MOV A,29HINC A ;分钟自加一CJNE A,#3CH,GO3A ;分钟计数循环MOV 29H,#00H ;复位MOV 34H,#0MOV 35H,#0AJMP RET0GO1A: MOV 27H,AMOV B,#0AHDIV ABMOV 31H,A ;将A的低4位存入31单元MOV 30H,B ;将A的高4位存入30单元AJMP RET0GO2A: MOV 28H,AMOV B,#0AHDIV ABMOV 33H,A ;将A的低4位存入33单元MOV 32H,B ;将A的高4位存入32单元AJMP RET0GO3A: MOV 29H,ADIV ABMOV 35H,A ;将A的低4位存入35单元MOV 34H,B ;将A的高4位存入34单元AJMP RET0RET0A:RETI;********显示子程序**********DISPLAY1:MOV R0,#30HMOV R3,#0FEHMOV A,R3PLAY1: MOV P2,AMOV A,@R0 ;取要显示的数据MOV DPTR,#DSEG1 ;指向字形段码首地址MOVC A,@A+DPTRCJNE R0,#34H,PAORL A,#80HPA: CJNE R0,#32H,PBPB: CPL A ;查表取字形段码MOV P0,A ;指向P0口LCALL DL1MOV P2,#0FFHMOV A,R3 ;判断是否显示到最低位RL A ;左移一位JNB ACC.6,LD1INC R0 ;缓冲器地址加一MOV R3,ALJMP PLAY1LD1: RET;*********闹钟显示区**********DISPLAY2: PUSH ACC ;保护现场PUSH PSWMOV R0,#36HMOV R3,#0FBHMOV A,R3PLAY2: MOV P2,AMOV A,@R0 ;取要显示的数据MOV DPTR,#DSEG1 ;指向字形段码首地址MOVC A,@A+DPTRCJNE R0,#38H,PPORL A,#80HPP: CPL A ;查表取字形段码MOV P0,A ;指向P0口LCALL DL1 ;调用DL1MOV P2,#0FFHMOV A,R3 ;判断是否显示到最低位RL A ;左移一位JNB ACC.6,LD2INC R0 ;缓冲器地址加一MOV R3,ALJMP PLAY2 ;调用PLAY2LD2: POP PSWPOP ACC ;恢复现场RET;*********延时子程序**********DELAY2: MOV R4,#0FFHLCALL DISPLAY1DL002: MOV R5,#0FFHDL112: MOV R6,#0FFHLCALL DISPLAY1DL132: MOV R3,#0FFHDL122: DJNZ R3,DL122DJNZ R6,DL132DJNZ R5,DL112DJNZ R4,DL002RETDL1: MOV R7,#20HDL: MOV R6,#20HDL6: DJNZ R6,$DJNZ R7,DLRETDSEG1: DB 3FH,06H,5BH,4FH,66H ;七段码表DB 6DH,7DH,07H,7FH,6FHEND。

相关文档
最新文档