北交大单片机结课设计电子时钟实验
- 格式:doc
- 大小:266.00 KB
- 文档页数:20
数字钟实验一实验目的与要求进一步熟悉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:为数据。
单片机电子时钟设计报告一、设计任务本次课程设计的电子时钟电路,是基于单片机STC89C52、时钟芯片和液晶显示,运用C语言编程实现。
电子时钟可以显示日期的年、月、日和时间的时、分、秒,具有复位功能。
二、系统硬件设备及芯片简介数字电子钟系统设计已经成熟,但是目前系统设计时基本都是采用LED作为显示电路,造成硬件电路复杂、功耗高、产品体积庞大等特点;液晶显示模块由于具有低功耗、寿命长、体积小、显示内容丰富、价格低、接口控制方便等优点,因此在各类电子产品中被极广泛地推广和应用。
字符型液晶显示模块是一类专门用于显示字母、数字、符号等点阵式液晶显示模块。
本系统设计采用字符型液品显示模块LCD1602 作为显示器件,这样不仅简化了系统的硬件设计,而且极大地提高了系统的可靠性。
1 LCD1602简介字符型液晶显示模块LCD1602已经是单片机应用设计中最常用的信息显示器件。
LCD1602可以显示两行,每行16个字符,采用+5V电源供电,外围电路配置简单,价格便宜,具有很高的性价比。
2 LCD1602功能介绍2.1 引脚功能LCD1602采用标准14脚(无背光)或16脚(带背光)接口,各引脚功能见表1。
表1 引脚功能2.2 LCD1602读写指令LCD1602读写指令较多且较复杂,具体使用可以查相关资料,下面仅列出最常用的的一些命令:①写指令38H:显示模式设置;②写指令08H:显示关闭;③写指令01H:显示清屏;④写指令06H:显示光标移动设置;⑤写指令0CH:显示开及光标设置。
2.3 LCD1602 读写操作时序LCD1602 读写操作时序总体上来说是比较简单的,掌握其有两种方法:一种是只看时序图,另外一种方法是直接记忆和总结读写时电平高低和变化。
很显然第二种更简单和直接,下面就列出典型读写的时序要求,以方便编写程序。
(1)读状态:输入:RS=L,RW=H,E=H。
输出:D0-D7=状态字。
(2)写指令:输入:RS=L,RW=L,D0-D7=指令码,E=上升沿。
单片机课程设计 电子时钟一、课程目标知识目标:1. 让学生掌握单片机的基本原理,理解电子时钟的工作流程;2. 使学生了解并掌握电子时钟各模块的功能,如时钟芯片、显示模块等;3. 帮助学生掌握C语言编程在单片机开发中的应用。
技能目标:1. 培养学生运用单片机进行电子时钟设计与制作的能力;2. 培养学生分析问题、解决问题的能力,能够针对电子时钟的故障进行排查和修复;3. 提高学生的团队协作能力和沟通能力,能够与他人共同完成课程项目。
情感态度价值观目标:1. 激发学生对单片机及电子制作的兴趣,培养其创新精神和实践能力;2. 培养学生严谨、踏实的科学态度,注重实验操作的规范性和安全性;3. 引导学生关注科技发展,认识到单片机技术在实际应用中的重要性。
分析课程性质、学生特点和教学要求,本课程将目标分解为以下具体学习成果:1. 学生能够独立完成电子时钟的硬件设计和程序编写;2. 学生能够通过调试,使电子时钟正常运行,并进行功能展示;3. 学生能够撰写课程报告,总结电子时钟设计与制作过程中的经验教训;4. 学生能够在课程项目中积极与他人合作,共同解决问题,提高团队协作能力。
二、教学内容1. 单片机基础知识:介绍单片机的组成、工作原理和编程语言,对应教材第1章内容;- 单片机硬件结构- 单片机工作原理- C语言编程基础2. 电子时钟原理及设计:讲解电子时钟的各模块功能及连接方式,对应教材第2章内容;- 时钟芯片原理及应用- 显示模块原理及应用- 硬件电路设计与连接3. 单片机编程实践:教授单片机编程技巧,以实现电子时钟功能,对应教材第3章内容;- 编程环境搭建- 程序结构设计- 代码编写与调试4. 电子时钟制作与调试:指导学生完成电子时钟的组装、编程和调试,对应教材第4章内容;- 硬件电路搭建- 软件编程与下载- 系统调试与优化5. 课程项目与实践:组织学生进行课程项目,提高实际操作能力,对应教材第5章内容;- 项目任务分配- 团队合作与沟通- 成果展示与评价教学内容安排与进度:1. 第1周:单片机基础知识学习;2. 第2周:电子时钟原理及设计;3. 第3周:单片机编程实践;4. 第4周:电子时钟制作与调试;5. 第5周:课程项目与实践。
xxxxxx大学课程设计报告课程设计名称:单片机系统综合课程设计课程设计题目:电子时钟院(系):专业:班级:学号:姓名:指导教师:完成日期:xxxxxx大学课程设计报告目录第1章总体设计方案 (1)1.1设计原理 (1)1.2设计思路 (1)1.3实验环境 (2)第2章详细设计方案 (3)2.1硬件电路设计 (3)2.2主程序设计 (3)2.3功能模块的设计与实现 (4)第3章结果测试及分析 (11)3.1结果测试 (11)3.2结果分析 (11)参考文献 (12)附录 A (13)附录 B (21)附录 C (22)第1章总体设计方案1.1 设计原理根据课程设计任务书的内容,要求实现在MCS51单片机上对数字电子钟的基本功能设计,对当前时间正确显示,并可根据需要对时间进行更改,以完成时间的校对和闹钟的设置。
时钟时间以时、分、秒在6位数码管上显示,小时以24小时计时模式,分秒均为60进位。
用6MHz晶振产生振荡脉冲,定时器进行秒计时。
调整设置时间的过程运用可编程键盘上的按键进行控制,共设有5个按键,首先按键A进入校时模式或E进入闹钟模式,再分别按键B对小时或C分钟进行更改,每按键一次数码管计数显示加一,更改结束后按键D退出设置,时钟正常显示。
闹钟时间到时,蜂鸣器鸣响10秒后时钟正常显示。
1.2 设计思路采用C语言程序设计结合硬件电路设计方法,利用Lab6000实验箱来实现数字电子钟的设计。
1)提出方案根据设计要求,可将本次设计分为3个模块进行:1)时钟显示模块:主要用于时间的正确显示。
2)校时模块:此模块用于时钟的校对,以完成用户更改时间的需求。
3)闹钟模块:用于实现闹钟的时间设置和定点闹铃的功能。
2)方案论证时钟显示模块中,利用可编程定时器中断进行秒计时,将时间显示在6位数码管上。
校时模块主要利用键盘上5个键的控制完成各项功能,并在数码管上动态显示改变结果,完成设置后进入时钟显示模块。
闹钟模块的设置过程与校时模块相似,但设置完成进入时间显示模块后则等待闹铃时间,到规定时间后,通过数码管闪烁及蜂鸣器的鸣响来实现定点闹铃提醒功能。
实验名称:电子时钟20世纪末,电子技术获得飞速发展,在其推动下,现代电子产品几乎渗透到了社会的各个领域,有力的推动社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。
数字钟早已成为人们日常生活中的必需品,广泛用于个人家庭以及办公室等公共场所,给人们的生活、学习、娱乐带来了极大的方便。
由于数字集成电路技术的发展以及采用了先进的石英技术,使得数字钟具有走时准确、性能稳定、携带方便等优点,它还用于计时、自动报时及自动控制等各个领域。
尽管目前市场上已经有现成的集成电路芯片出售,价格便宜、使用方便,但是鉴于数字钟电路的基本组成包含了数字电路的主要组成部分,因此进行数字钟的研究,对我们对单片机的学习有着非常重要的意义。
单片机数字时钟具有编程灵活,便于电子钟功能的扩充,精度高等优点,同时还能用电子钟发出各种控制信号,本设计主要用8051单片机配合LED数码显示管、蜂鸣等器件,采用24小时计时方式,最小显示到分钟,通过LED灯的闪烁体现秒的计数,兼有闹钟的作用,以蜂鸣来体现闹钟时间的到达。
关键字:单片机汇编语言数字时钟实验设计一、实验目的1、学会应用8051定时器时间及时处理;2、学习按键扫描电路的应用;3、掌握LED数码管动态显示的设计方法;4、掌握汇编语言的简单编程。
二、实验任务及设计要求设计要求:利用实验平台上的4个LED数码管,设计带有闹铃功能的数字时钟。
1、在4位数码管上显示当前时间,计时格式为“时时分分”2、由LED闪烁做秒显示3、利用按键可以对时间及闹钟进行设置,并可显示闹铃时间。
当闹铃时间到蜂鸣器发出声响,按停止键可使闹铃声停止。
三、工作原理及设计思路1、综述:我们设计的该系统主要分为时钟计时、校时和闹钟三个模块。
利用单片机定时器完成计时功能,定时器1计时中断程序每隔5ms中断一次并当作一个计数,每中断一次计数加1,当计数200次时,则表示1s到了,秒变量加1,同理60秒时分钟加1,60分钟时小时加1,小时达到24时,全部清零,重新计时。
单片机电子时钟课程设计实验报告(1)单片机电子时钟课程设计实验报告一、实验内容本次实验的主要内容是使用单片机设计一个电子时钟,通过编程控制单片机,实现时钟的显示、报时、闹钟等功能。
二、实验步骤1.硬件设计根据实验要求,搭建电子时钟的硬件电路,包括单片机、时钟模块、显示模块、按键模块等。
2.软件设计通过C语言编写单片机程序,用于实现时钟功能。
3.程序实现(1)时钟显示功能通过读取时钟模块的时间信息,在显示模块上显示当前时间。
(2)报时功能设置定时器,在每个整点时,通过发出对应的蜂鸣声,提示时间到达整点。
(3)闹钟功能设置闹钟时间和闹铃时间,在闹钟时间到达时,发出提示蜂鸣,并在屏幕上显示“闹钟时间到了”。
(4)时间设置功能通过按键模块实现时间的设置,包括设置小时数、分钟数、秒数等。
(5)年月日设置功能通过按键模块实现年月日的设置,包括设置年份、月份、日期等。
三、实验结果经过调试,电子时钟的各项功能都能够正常实现。
在运行过程中,时钟能够准确、稳定地显示当前时间,并在整点时提示时间到达整点。
在设定的闹铃时间到达时,能够发出提示蜂鸣,并在屏幕上显示“闹钟时间到了”。
同时,在需要设置时间和年月日信息时,也能够通过按键进行相应的设置操作。
四、实验感悟通过本次实验,我深刻体会到了单片机在电子设备中的广泛应用以及C 语言在程序设计中的重要性。
通过实验,我不仅掌握了单片机的硬件设计与编程技术,还学会了在设计电子设备时,应重视系统的稳定性与可靠性,并善于寻找调试过程中的问题并解决。
在今后的学习和工作中,我将继续加强对单片机及其应用的学习与掌握,努力提升自己的实践能力,为未来的科研与工作做好充分准备。
《单片机原理与应用》课程设计总结报告题目:单片机电子时钟的设计与实现设计人员:学号:班级:指导老师:日期:题目:单片机电子时钟的设计与实现课程设计的目的和意义课程设计的目的与意义在于让我们将理论与实践相结合。
培养我们综合运用电子课程中的理论知识解决实际性问题的能力。
论知识解决实际性问题的能力。
让我们对电子电路、让我们对电子电路、让我们对电子电路、电子元器件、电子元器件、电子元器件、印制电路板等方面的知识印制电路板等方面的知识进一步加深认识,进一步加深认识,同时在软件编程、同时在软件编程、同时在软件编程、排错调试、排错调试、排错调试、焊接技术、焊接技术、相关仪器设备的使用技能等方面得到较全面的锻炼和提高,为今后能够独立完成某些单片机应用系统的开发和设计打下一个坚实的基础。
坚实的基础。
课程设计的基本任务利用89S51单片机最小系统,综合应用单片机定时器、中断、数码显示、键盘输入、蜂鸣报警等知识,设计一款单片机和简单外设控制的电子时钟。
警等知识,设计一款单片机和简单外设控制的电子时钟。
主要功能要求最基本要求1)1)使用使用6位数码管,前两位显示小时(位数码管,前两位显示小时(2424小时制),中间两位显示分钟,后两位显示秒。
时钟每走1秒,秒数码管加1显示,显示,6060秒后分钟数码管加1显示,显示,6060分钟后小时数码管加1显示。
显示。
2)设计89S51单片机最小系统单片机最小系统3)掌握使用Protel99 Protel99 绘制原理图和布板的过程、方法和技巧。
绘制原理图和布板的过程、方法和技巧。
绘制原理图和布板的过程、方法和技巧。
4)掌握单片机开发软件()掌握单片机开发软件(Keil C51Keil C51或 Wave Wave)的使用和调试。
)的使用和调试。
)的使用和调试。
5)编写并调试单片机定时及其中断程序,以实现电子时钟的功能。
)编写并调试单片机定时及其中断程序,以实现电子时钟的功能。
6)设计八段数码管显示电路并编写驱动程序,输入并调试拆字程序和数码显示程序。
单片机电子时钟课程设计报告一、设计目的。
本课程设计旨在通过单片机技术的应用,设计并制作一个简单的电子时钟。
通过这一设计,学生将能够掌握单片机的基本原理和应用,培养学生的动手能力和创新意识,提高学生的实际操作能力。
二、设计原理。
本电子时钟采用单片机作为控制核心,通过晶振产生的时钟信号来实现时间的计时和显示。
利用数码管来显示小时和分钟,通过按键来调整时间。
同时,通过蜂鸣器发出报时信号,实现基本的闹钟功能。
三、设计方案。
1. 硬件设计。
(1)单片机选择,本设计选用常见的51单片机作为控制核心,具有成本低、易于编程的特点。
(2)时钟电路,采用晶振作为时钟信号源,通过单片机的定时器来实现时间的计时。
(3)显示模块,采用数码管来显示小时和分钟,通过数码管的扫描显示来实现时间的动态显示。
(4)按键输入,设计按键来调整时间,包括调整小时和分钟。
(5)报时功能,通过蜂鸣器来实现基本的报时功能,可以设置闹钟时间。
2. 软件设计。
(1)时钟控制,通过单片机的定时器来实现时间的计时和更新。
(2)显示控制,设计数码管的扫描显示程序,实现时间的动态显示。
(3)按键处理,设计按键扫描程序,实现对时间的调整。
(4)报时功能,设计蜂鸣器的报时程序,实现基本的闹钟功能。
四、设计实现。
1. 硬件实现。
根据上述设计方案,完成了电子时钟的硬件连接和布线,保证各个模块之间的正常通讯和工作。
2. 软件实现。
编写了单片机的程序,实现了时钟的计时、显示和控制功能,保证了电子时钟的正常运行。
五、实验结果。
经过调试,电子时钟能够准确显示当前的时间,并能够通过按键调整时间和设置闹钟功能,报时功能也能够正常工作。
六、总结与展望。
通过本课程设计,学生掌握了单片机的基本原理和应用,培养了动手能力和创新意识。
在今后的学习和工作中,学生将能够更好地应用单片机技术,设计和制作更加复杂的电子产品。
同时,也为学生今后的科研和创新工作奠定了良好的基础。
单片机电子钟实验报告单片机电子钟实验报告引言:单片机是一种集成电路,具有微处理器的功能。
它广泛应用于各种电子设备中,包括电子钟。
在这个实验中,我们通过使用单片机和其他电子元件,成功地制作了一台电子钟。
本报告将详细介绍我们的实验过程、结果和总结。
实验目的:我们的实验目的是设计和制作一台精确可靠的电子钟。
通过这个实验,我们希望了解单片机的基本原理和应用,同时提高我们的电路设计和焊接能力。
实验步骤:1. 准备工作:我们首先收集了所需的材料和工具,包括单片机、晶振、电容、电阻、显示器等。
然后,我们仔细阅读了单片机的技术规格和电路图。
2. 电路设计:根据单片机的技术规格和电路图,我们开始设计电路。
我们确定了电源电压、电路连接方式和元件数值。
然后,我们使用仿真软件验证了我们的设计。
3. 焊接电路板:在确认电路设计无误后,我们开始焊接电路板。
我们小心翼翼地将元件焊接到电路板上,并确保焊接点牢固可靠。
焊接完成后,我们使用万用表对焊接点进行了测试。
4. 编程:接下来,我们使用C语言编写了单片机的程序。
我们根据电路的功能需求,编写了显示时间、闹钟设置、闹钟响铃等功能的代码。
然后,我们使用编程器将程序烧录到单片机中。
5. 调试:在完成编程后,我们对电路进行了调试。
我们逐一测试了各个功能,确保电子钟的正常运行。
我们检查了显示、闹钟和时间设置等功能,并进行了一系列的测试。
实验结果:经过我们的不懈努力,我们成功地制作了一台功能完善的电子钟。
它能够精确显示时间,并具备闹钟功能。
在我们的测试中,电子钟的运行稳定,显示清晰可见。
实验总结:通过这个实验,我们深入了解了单片机的工作原理和应用。
我们学会了电路设计、焊接和编程等技能。
通过实际操作,我们提高了自己的动手能力和问题解决能力。
然而,我们也遇到了一些挑战。
在焊接电路板时,我们需要小心操作,以避免短路或焊接不牢固。
在编程过程中,我们需要仔细调试,以确保程序的正确性。
在未来的学习中,我们将进一步探索单片机的应用领域,并不断提高自己的技术水平。
单片机电子时钟实验报告一、实验目的:1.了解单片机的基本知识和工作原理;2.掌握单片机的时钟生成方法;3.实现一个基本的电子时钟。
二、实验器材:1.STC89C52单片机开发板;2.LCD1602液晶显示屏;3.外部晶体振荡器;4.面包板、杜邦线等。
三、实验原理:单片机是由一个集成电路芯片组成的微型计算机系统。
它具有高度集成和灵活应用的特点,被广泛应用于各种电子设备中。
STC89C52是一种常见的单片机,具有可编程的特点,可以通过编写程序实现各种功能。
为了实现电子时钟功能,我们需要了解单片机的时钟生成方法。
单片机一般内部包含一个振荡器电路,通过外部晶体振荡器提供的时钟信号来控制单片机的工作速度。
具体实现时钟功能需要通过编写程序生成一个固定频率的脉冲信号,并通过控制液晶显示屏显示当前的时间。
四、实验步骤:1.将STC89C52单片机开发板、液晶显示屏、外部晶体振荡器等连接起来,按照电路图进行布线。
2.编写程序,通过设置定时器,生成1毫秒的定时中断信号。
在中断程序中,获取当前的系统时间,并进行相应的显示。
4.观察液晶显示屏,检查是否显示当前的时间,如正常显示,则实验成功。
五、实验结果与分析:经过实验,我们成功实现了一个简单的电子时钟。
液晶显示屏能够正常显示当前的时间,而且精度较高。
实验过程中,我们对单片机的工作原理和编程方法有了更深入的了解。
六、实验心得与体会:通过这次实验,我掌握了单片机的基本知识和工作原理,并实际编写了一个电子时钟程序。
通过实际操作,我对单片机的应用有了更深入的理解,也提高了动手能力和解决问题的能力。
在今后的学习和工作中,我将继续深入学习单片机的原理和应用,不断提高自己的技术水平。
单片机课程设计报告电子时钟单片机课程设计报告电子时钟随着科技的发展,电子产品已经成为人们日常生活不可或缺的一部分,电子时钟也是其中一个重要的产品。
电子时钟主要通过计算机技术来实现时间的显示和调节,而单片机是一种高速度、高可靠性的计算机芯片,通过单片机技术来设计和制作电子时钟,不仅可以提高产品的性能和稳定性,还可以实现更多的功能。
设计目的这个单片机课程设计的目的是通过使用单片机技术来设计一款电子时钟,具体实现以下功能:1. 显示时间:电子时钟能够准确地显示当前的时间,包括小时、分钟、秒钟,同时可以根据需要进行调整。
2. 显示日期:电子时钟也可以显示当前的日期,包括年、月、日。
3. 闹钟功能:电子时钟具有闹钟功能,可以设置闹铃时间,提醒用户特定时间。
4. 睡眠功能:电子时钟还具有睡眠功能,可以设置睡眠时间,使用户在睡眠中就可以关闭闹钟。
设计原理电子时钟的原理是通过单片机技术和电路设计实现。
主要包括三个部分:时钟模块、驱动模块和输入输出模块。
1. 时钟模块电子时钟的时钟模块是最核心的部分,它决定了电子时钟的准确度和稳定性。
一般使用DS1302作为时钟模块,DS1302是一块低功耗时钟芯片,能够提供祥细和稳定的计时功能。
2. 驱动模块驱动模块是电子时钟控制显示的关键部分,通过使用七段LED数字显示器,以及驱动芯片74HC595来控制LED显示器的亮度和显示。
74HC595是一种串行输入并行输出的芯片,可以通过控制引脚来输出对应的电路信号。
3. 输入输出模块输入输出模块是电子时钟中用户进行设置和操作的关键部分,它支持用户与电子时钟进行通信,包括根据用户的操作来控制时钟、日期、闹钟等功能。
例如,用户可以通过按键控制输入模块来实现时钟、日期、闹钟等的选项设置。
设计步骤设计电子时钟的步骤主要包括以下几个方面。
1. 确定电路需求:首先需要明确电子时钟具备哪些特性功能,例如显示日期、时间、使用闹钟等。
2. 电路设计:根据电子时钟设计需求,设计时钟模块、驱动模块和输入输出模块的电路,包括使用电路图工具进行和PCB设计。
单片机电子时钟课程设计报告(一)单片机电子时钟课程设计报告随着科技的不断发展,电子时钟软件的应用越来越广泛。
本文将介绍一个单片机电子时钟的设计过程与实现方法。
一、设计目标本次课程设计我们的目标是设计一款能够进行时间显示的电子时钟。
具体要求如下:1. 时钟实时显示当前时间,包括时、分、秒和星期;2. 描述时钟功能,实现时间的调校、时间格式的调亮和调暗等操作;3. 显示格式清晰美观,操作方便简单,能够长时间稳定地工作。
二、硬件设计1. 硬件搭建:本设计采用单片机AT89C51作为核心CPU。
同时使用16MHz的晶振电路来为微控制器提供准确的时基。
另外,为了实现更好的人机交互,本设计还需要使用LCD液晶显示屏和4个按键。
2. 硬件接口:液晶显示屏需要采用并行接口,并且需要对显示屏背光进行控制。
而4个按键需要分别连接到4个I/O口上,从而实现对电子时钟的各项控制功能。
三、软件设计1. 程序框架:本设计使用Keil编程软件进行程序编写,并采用C语言进行程序设计。
主要的程序框架分为4个部分:数据收集模块、处理模块、显示模块和按键扫描模块。
2. 数据收集模块:数据收集模块采用中断方式,以1秒为间隔进行一次数据收集。
同时还需要对实时时间进行调校和校验。
3. 处理模块:处理模块主要用于完成各种时间处理和格式设置功能,包括对时、分、秒等时间数据进行读取、存储和操控操作。
同时,还要完成处于闹钟和日历两种状态的时间判断和时间更新操作。
4. 显示模块:显示模块主要用于将处理过的时间数据显示在LCD液晶显示屏上,实现时间的实时显示功能。
5. 按键扫描模块:按键扫描模块主要用于检测按键的按下和松开状态,并且根据不同按键的功能实现对时钟的不同控制操作。
四、总结本次设计采用单片机AT89C51作为核心CPU,对硬件和软件进行优化设计,结构合理,功能完善。
最终实现了日期时间的实时显示、闹钟功能、日历功能等多种功能。
同时,本设计能够进行时间调亮和调暗,具有操作方便简单、显示清晰美观等特点。
一、课程设计的内容和要求:1了解单片机的种类,掌握单片机的工作原理;2 掌握利用单片机进行系统设计的方法;3掌握利用protel进行原理图设计和PCB设计的方法;4学会进行单片机硬件调试和软件调试;5 了解单片机系统整个设计开发流程。
二、设计装置功能1、用单片机实现设计要求(1)实现功能:①正常的24小时制的电子表功能显示(时/分/秒)。
②任意时间(时/分/秒)闹钟时刻的设置并在设定时刻响铃。
(2)所使用器件:STC 89C52RC单片机1个、2位共阳极数码管3个、蜂鸣器1个、74LS138一片、74LS47一片、74HC04一片、电阻、电容及其他辅助电子元件。
(3)显示时间与闹钟时刻的设置:单片机的人机操作部分由六个按钮组成。
从电子钟电路板上(从左到右)分别是:①单片机复位键②闹钟开关③小时位累加键④分钟位累加键⑤秒钟位累加键⑥闹钟/时间显示切换键按键说明:复位键——把3个2位数码管显示数字全部清零。
闹钟开关键——按下键,闹钟开关模式切换。
时针位累加键——按下键,则实现时针位的累加00-23(累加循环)。
分针位累加键——按下键,则实现分针位的累加00-59(累加循环)。
秒针位累加键——按下键,则实现秒针位的累加00-59(累加循环)。
闹钟/时间显示切换键——按下键,能够实现数码管闹钟和时间两种显示功能的切换。
三、设计问题分析面对的问题主要是两方面:一个是软件的设计,也就是实现计时定时的控制功能的程序编辑,在电脑上模拟需要实现的功能;另一个是硬件的设计,需要我们自己购买器件、设计并焊接电路板。
而更为重要的一步是将软件、硬件相结合,做好电路后,我们试着把程序写入芯片测试,然而没有获得应该有的显示,接着我们多次检查电路,修改程序,在不断调试中终于实现正确显示。
四、设计思路本次设计的系统以动态显示显示时分秒模块,它能显示正确的时间,而且所显示时间与北京时间相同,基本做到同步,显示清晰明亮,可读性强。
系统主程序开始后,首先是对系统环境初始化,设置好时分秒后系统开始运行;然后可打开闹钟,预设响铃的时刻,计时系统到该时刻后自动响设定铃声。
单片机应用课程设计实验课程题目:电子时钟班级:通信0604姓名电子时钟(一)实验目的学习8051定时器时间计时处理、按键扫描及LED数码管显示的设计方法。
(二)设计任务及要求利用实验平台上4个LED数码管,设计带有闹铃功能的数字时钟,要求:1.在4位数码管上显示当前时间。
显示格式“时时分分”2.由LED闪动做秒显示。
3.利用按键可对时间及闹玲进行设置,并可显示闹铃时间。
当闹玲时间到蜂鸣器发出声响,按停止键使可使闹铃声停止。
(三)工作原理及设计思路利用单片机定时器完成计时功能,定时器0计时中断程序每隔50ms中断一次并当作一个计数,每中断一次计数加1,当计数20次时,则表示1s到了,秒变量加1,同理再判断是否1min钟到了,再判断是否1h到了。
为了将时间在LED数码管上显示,可采用静态显示法和动态显示法,由于静态显示法需要数据锁存器等较多硬件,可采用动态显示法实现LED显示。
其显示电路如图1图1闹铃声由交流蜂鸣器产生,当P1.7输出不同频率的方波,.蜂鸣器便会发出不同的声音。
(四)程序设计分析:1、定时计数的误差分析主要误差来源及补偿:[1]、硬件电路在线路手工焊接时可能存在虚焊,或者有接触不良的情况,以及外界环境的影响,硬件误差影响可能成为最后原因。
[2]、采用11.0592MHz晶振计算定时计数初值时存在小数舍入误差公式:,定时器/计数器采用工作方式1,定时器T0、T1溢出周期为50ms,计算得到N=1945 6=4C00H,TH0=4CH,TL0=00H.若仍采用理论上的12MHz计算初值,则有:N1 =3CB0H,那么用11.0592MHz,N1不变,益出周期约为54.25ms,每次溢出比实际的要慢4.3ms,那么一秒钟要慢85ms,从而影响24h比实际的要慢122 min。
修正后误差处理通软件实现,最终的时钟误差测得值为3-5s。
补偿方法:1)、精确定时计数时可采用12MHz的晶振。
2)、用软件补偿,通用方法如下:MCS-51单片机的中断响应延迟时间,取决于其它中断服务程序是否在进行,或取决于正在执行的是什么样的指令。
电子时钟设计实验报告姓名:学号:班级:指导老师:一、实验基本要求利用定时计数器,设计一个电子时钟,使用前面使用过的显示子程序。
从左到右依次显示时分秒。
有两种方法实现,一种是在中断程序中计数,产生时分秒计数,送显示缓冲区。
另一种是中断程序每一秒清除一个位变量,而主程序通过监视位变量的变化来知道每秒的时间。
进而要求:1.加入时间调整程序,使用两个或三个按钮,调节当前的时间。
类似平常使用的电子表。
可以让正在调整的位闪烁显示。
2.可以加入一个闹钟钟设置,当所定的时间到时,产生断续的蜂鸣声。
可以加入日历的功能。
二、最终实现的功能1、日历(年、月、日)显示与数值的修改2、时钟(时分秒)显示及数值的修改3、闹钟设定及数值的修改、到时响铃4、秒表计时及秒表重置三、设计核心思想程序设计中设置定时器0作为基本时钟,中断每50ms进入一次,每20次中断即1秒,秒加一,在中断服务程序中执行60秒进位、60分进位。
通过独立式键盘,进行各项数值调整、定时器开启和暂停以及重置。
各个功能在分立的子函数中实现,在主函数中进行调用,结构清晰。
四、设计亮点1、按键功能通过“按下时间的长短”丰富在按键消抖结束后,再次判断按键按下的同时,记录按下时间的长短。
短按实现数值的修改、计时暂停及启动,长按实现模式的切换和重置。
2、闹铃设置为一段音乐通过查阅网上资料,将蜂鸣器的响声富有变化,从而实现一段有旋律的音乐。
3、函数独立设计的程序中包含以下函数模块:延时、初始化、时间(日历、闹钟)显示、键盘扫描、秒表显示、定时器0中断函数(时钟)、定时器1中断(秒表)、音乐、闹钟及主函数。
4、各功能的实现采用模块化处理模式1:时钟显示;模式2:日历显示;模式3:秒表显示;模式4:闹钟显示。
五、实验中的问题总结LED数码管显示部分小结:(1)要设置段选(P2.6)和位选(P2.7)。
(2)段选和位选需按照书上讲的逻辑编写。
虽然P0口作为段选,P2口作为位选,但是程序设计中位选时要将值赋给P0口(打开位选→赋位选→关闭位选)。
单片机原理及应用课程设计报告基于单片机的电子时钟设计摘要:单片机是集中央处理器CPU、数据存储器RAM、程序存储器ROM、定时器/计数器T0/T1和多种接口于一体的微控制器。
它体积小、成本低、功能强,特别适用于控制领域,已广泛应用于工业测控、计算机通信、各类仪器仪表和工业自动化中.传统的数字电子时钟采用了较多的分立元器件,不仅占用了很大的空间而且利用率也比很低,随着系统设计复杂度的不断提高,用传统时钟系统设计方法很难满足设计需求.利用单片机设计的电子时钟则可以克服传统电子时钟的弊端.本设计拟实现的基本功能为时钟显示,加入定时及秒表拓展功能。
关键词:单片机;电子时钟;闹钟;秒表;C语言一。
背景:1。
1数字电子钟的背景:20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。
时间对人们来说总是那么宝贵,工作的忙碌性和繁杂性容易使人忘记当前的时间。
忘记了要做的事情,当事情不是很重要的时候,这种遗忘无伤大雅。
但是,一旦重要事情,一时的耽误可能酿成大祸。
目前,单片机正朝着高性能和多品种方向发展趋势将是进一步向着CMOS化、低功耗、小体积、大容量、高性能、低价格和外围电路内装化等几个方面发展。
下面是单片机的主要发展趋势。
单片机应用的重要意义还在于,它从根本上改变了传统的控制系统设计思想和设计方法。
从前必须由模拟电路或数字电路实现的大部分功能,现在已能用单片机通过软件方法来实现了。
这种软件代替硬件的控制技术也称为微控制技术,是传统控制技术的一次革命。
单片机模块中最常见的是数字钟,数字钟是一种用数字电路技术实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更更长的使用寿命,因此得到了广泛的使用。
1.2数字电子钟的意义:数字钟是采用数字电路实现对时,分数字显示的计时装置,广泛用于个人家庭,车站,码头办公室等公共场所,成为人们日常生活中不可少的必需品,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表, 钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。
电子时钟课程设计报告14212129 陶威东一、实验目的51单片机是集成了数码管、LED灯、蜂鸣器、存储器、CPU和计时器的高精度平台,用户可以在上面模拟多种电路,实现对不同功能的需求!通过利用LED灯、数码管、蜂鸣器、内部定时/计数器T0/T1、按键,借用汇编程序实现电子时钟的设计,从而增加对51单片机的理解!二、设计任务及要求利用实验板上4个LED数码管,设计带有闹铃功能的数字时钟,要求:1、在4位数码管上显示当前时间。
显示格式“时时分分”;”2、由LED闪动做秒显示;3、利用按键可对时间及闹玲进行设置,并可显示闹玲时间。
当闹玲时间到蜂鸣器发出声响,按停止键使可使闹玲声停止。
4、使数字时钟的闹钟铃声为音乐。
三、软件设计思路计时功能利用单片机的定时器来完成,由于定时器定时的时长有限,所以要利用中断程序才能定时1秒,若中断程序每隔50ms中断一次并当作一个计数,则每中断一次计数加1,当计数20次时,则表示1s到了,秒变量加1,同理再判断1min是否到了,再判断1h 是否到了。
为了将时间在LED数码管上显示,可采用动态显示法实现LED显示。
闹铃声由交流蜂鸣器产生,所以当闹铃时间和当前时间相等时,可以对蜂鸣器输入方波信号,蜂鸣器就会发出声音。
四、设计分析本实验实际是设计一个电子时钟,可以显示时和分,并且用一个二极管显示秒。
另外,还可以对它进行时间调整,还要有闹铃功能。
实验用JD51开发板完成,本实验的硬件包括显示部分、闹铃部分、开关部分。
原理图JD51上用于显示部分的电路如下图:JD51上有四位共阳LED数码管,其标号分别为LED1—LED4,低电平选通,且任何时候仅有一位输出低电平,显示时对各显示器进行动态扫描,显示器分时轮流工作。
虽然每次只有一个显示器显示,但是由于人的视觉暂留现象我们仍会感觉所有的显示器都在同时显示。
P0口作为输出口控制8个发光二极管的亮灭,控制数码管的显示。
·蜂鸣器蜂鸣器与P2.4口相连。
·开关本实验中的开关是实验仪上的四个逻辑开关,它们分别与P3.2、P3.3、P3.4、P3.5相连。
其总P3.2用于调整时钟或闹钟的时,P3.3用于调整时钟或闹钟的分,P3.5用于控制显示时钟还是显示闹钟,并且同时控制调整时钟还是调整闹钟,按任意键(SW1、SW2、SW4)时停止闹钟。
【软件设计流程及描述】·显示部分显示部分分为时钟显示、闹钟显示和秒显示三部分,主要由时钟显示子程序和闹钟显示子程序构成,闹钟显示与时钟显示编程流程大致相同。
流程图如下:·闹铃部分设计思路及原理:音节由不同频率的方波产生,音节与频率的关系如下表所示。
要产生音频方波,设计利用延时来建立音符表NOTE,表格中的数存R3*20us,其倒数1/(R3*2*10us)对应相应音符的频率。
另外,音乐的节拍是由延时实现的,如果1拍为0.4秒,1/4拍是0.1秒。
只要设定延时时间,就可求得节拍的时间。
延时作为基本延时时间,节拍值只能是它的整数倍。
设计利用T1中断产生10ms延时,取1/4拍为10H*10ms,相应产生所需延时。
闹钟铃声相应的音符和节拍表NOTE和METRE如下:NOTE: DB 7FH,7FH,7FH,60H,65H,72H,72H,72H,7FH,72HDB 60H,72H,60H,72H,60H,72H,7FH,72H,7FH,98H,72H,7FHDB 7FH,7FH,7FH,60H,65H,72H,72H,72H,7FH,72HDB 60H,72H,60H,72H,60H,72H,7FH,72H,7FH,72H,4CH,55H,00HMETRE: DB 80H,20H,20H,20H,20H,20H,20H,20H,20H,80HDB 20H,20H,20H,20H,40H,20H,20H,20H,20H,20H,20H,80HDB 80H,20H,20H,20H,20H,20H,20H,20H,20H,80HDB 20H,20H,20H,20H,40H,20H,20H,20H,20H,20H,20H,40H·开关扫描及处理部分本实验用到了三个开关,其中涉及开关的扫描及处理。
开关4控制数码管当前显示的是时钟还是闹钟;显示时钟时,可通过开关1和开关2调整时钟的时和分;显示闹钟时,也可以通过开关1和开关2调整时和分。
开关4控制闹铃的开和关。
按键调整闹钟与按键调整时钟编程流程基本一致,按键扫描及处理流程图如图:·T0中断服务程序:采用定时器T0计时,中断程序每隔50ms中断一次计数加1,当计数20次时,则表示1s到了,秒变量加1,同理再判断是否1分钟到了,再判断是否1小时到了,再判断是否24小时到了。
程序流程图如下:保护现场设置计数初值1s 到否是数码管小数点亮,延时,再灭秒加1秒等于60吗是秒清零,分加1分等于60吗是分清零,时加1时等于24吗时清零是恢复现场返回否否否否否五、硬件电路(proteus )时钟初始值为0时0分六、源程序代码及注释ORG 0000HAJMP MAIN ;跳转到主程序MAIN执行ORG 000BH ;设置T0中断服务程序AJMP INTT0 ;跳到INTT0执行ORG 001BH ;设置T1中断服务程序LJMP INTT1 ;跳到INTT1执行;**********主程序*********ORG 0300H;MAIN:MOV SP,#80HMOV TMOD,#11H ;设置定时器T0、T1工作于方式1MOV TH0,#3CH ;装入时钟定时初值(50ms)MOV TL0,#0B0HMOV TH1,#0D8H ;装入闹铃定时初值(10ms)MOV TL1,#0F0HMOV R1,#00H ;确保首次默认闹铃工作MOV 20H,#00HMOV 21H,#00HMOV 22H,#00H ;预置时钟分分MOV 23H,#00H ;预置时钟时时MOV 30H,#30H ;预置闹铃分分MOV 31H,#08H ;预置闹铃时时SETB P2.0 ;数码管接P2口,置位数码管,使其全灭SETB P2.1SETB P2.2SETB P2.3CLR P1.6CLR P1.5CLR P1.4 ;LED 5、6、7、8亮,SETB P1.1SETB P1.2SETB P1.3 ;置位发光二极管2、3、4灭SETB EA ;开放总中断SETB ET0 ;允许T0中断SETB TR0 ;开启定时器T0LOOP:LCALL DISPT ;调用时间显示子程序LCALL RING ;调用闹铃处理子程序LCALL KEY ;调用按键扫描子程序JZ LOOP ;无键按下则循环LCALL CASE ;有键按下则转按键处理子程序执行SJMP LOOP ;循环/******T0一秒定时中断程序INTT0******/正常时钟计时INTT0:PUSH PSW ;状态字入栈保护PUSH ACC ;累加器入栈保护MOV TL0,#0B0H ;装入计数初值,12MHZ晶振,形成1S中断MOV TH0,#3CHINC 20HMOV A,20HCJNE A,#20,RETURNCPL P1.6CPL P1.5CPL P1.4CPL P1.3CPL P1.2CPL P1.1 ;一秒到发光二极管轮流亮,用于显示秒MOV 20H,#00H ;一秒到清20HMOV A,21HADD A,#01HDA AMOV 21H,ACJNE A,#60H,RETURNMOV 21H,#00H ;一分到,21H单元清零MOV A,22HADD A,#01HDA AMOV 22H,ACJNE A,#60H,RETURNMOV 22H,#00H ;一小时到,22H单元清零MOV A,23HADD A,#01HDA AMOV 23H,ACJNE A,#24H,RETURNMOV 23H,#00H ;满24,23H单元清零RETURN: POP ACCPOP PSWRETI;/******时间显示子程序******/ DISPT: MOV A,22HANL A,#0FHMOV 2AH,A ;时钟分的低位MOV A,22HANL A,#0F0HSWAP AMOV 2BH,A ;时钟分的高位MOV A,23HANL A,#0FHMOV 2CH,A ;时钟时的低位MOV A,23HANL A,#0F0HSWAP AMOV 2DH,A ;时钟时的高位LED1: SETB P2.3MOV A,2DHMOV DPTR,#TABMOVC A,@A+DPTRCLR P2.0 ;选通数码管1MOV P0,A ;显示时钟时的十位部分 LCALL DELAYLED2: SETB P2.0MOV A,2CHMOV DPTR,#TABMOVC A,@A+DPTRCLR P2.1 ;选通数码管2MOV P0,A ;显示时钟时的个位部分 LCALL DELAYLED3: SETB P2.1MOV A,2BHMOV DPTR,#TABMOVC A,@A+DPTRCLR P2.2 ;选通数码管3MOV P0,A ;显示时钟分的十位部分LCALL DELAYLED4: SETB P2.2MOV A,2AHJB P1.2,TA2TA1: ADD A,#10 ;用于利用数码管的小数点来表示秒TA2: MOV DPTR,#TABMOVC A,@A+DPTRCLR P2.3 ;选通数码管4MOV P0,A ;显示时钟分的个位部分LCALL DELAYRETTAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H;共阳数码管的不带小数点的时间显示码DB 40H,79H,24H,30H,19H,12H,02H,78H,00H,10H;共阳数码管的带小数点的时间显示码;/******按键扫描程序******/ 开关接P3口,判断按键情况KEY: MOV P3,#0FFHMOV A,P3CPL AANL A,#38HJZ RETK ;无键按下则返回LCALL DELAY ;延时消抖MOV A,P3CPL AANL A,#38HJZ RETK ;键盘去抖动MOV R6,A ;将键值存入R6LOOP1: LCALL DISPT;MOV A,P3CPL AANL A,#2CHJNZ LOOP1 ;等待键释放MOV A,R6RETK: RET;/******按键处理子程序******/根据按键情况进行处理CASE: MOV A,R6CLR P1.0CLR P1.7 ;发光二极管LED1亮JB ACC.2,SETH ;转调整时JB ACC.3,SETM ;转调整分JB ACC.5,SETR ;转闹铃设置WAITCASE:LCALL DISPT ;无键按下时等待LCALL KEYJZ WAITCASE;/******时间调整程序******/ 按键调整时间SETT: LCALL DISPTLCALL KEYJZ SETTMOV A,R6JB ACC.2,SETHJB ACC.3,SETMJB ACC.5,KEYGO ;第二次按为确认离开KEYGO: SETB P1.0 ;发光二极管LED1灭RETSETH: MOV A,23H ;调整时钟时,时加1 ADD A,#01HDA A ;十进制调整MOV 23H,ACJNE A,#24H,HD ;判断是否到24,不到继续MOV 23H,#00H ;到24时清零HD: LJMP SETTSETM: MOV A,22H ;分加1ADD A,#01HDA A ;十进制调整MOV 22H,ACJNE A,#60H,MD ;判断是否到1小时,不到继续MOV 22H,#00H ;到1小时则清零MD: LJMP SETT;/******闹铃时间调整按键扫描及处理子程序******/KEYR: MOV P3,#0FFHMOV A,P3CPL AANL A,#2CHJZ RETK ;无键按下则返回LCALL DISPR ;延时消抖MOV A,P3CPL AANL A,#2CHJZ RETK ;键盘去抖动MOV R6,A ;将键值存入R6LJMP LOOPRLOOPR: LCALL DISPRMOV A,P3CPL AANL A,#2CHJNZ LOOPR ;等待键释放MOV A,R6AJMP RETK;/******设置闹铃时间******/SETR: SETB P1.0 ;发光二极管LED1灭CLR P1.7 ;发光二极管LED2亮,改显示状态LCALL DISPRMOV R1,#00H ;设置闹钟时重设R1,用于检测闹铃播放与否MOV 53H,#03H ;重设闹铃次数LCALL KEYR ;闹铃时间调整按键检测JZ SETRMOV A,R6JB ACC.2,SETRHJB ACC.3,SETRMJB ACC.5,KEYGO ;第二次按为确认离开SETRH: MOV A,31H ;闹钟时加1ADD A,#01HDA A ;十进制调整MOV 31H,ACJNE A,#24H,RHD ;判断是否到24,不到继续MOV 31H,#00H ;到24时则清零RHD: LJMP SETRSETRM: MOV A,30H ;闹钟分加1ADD A,#01HDA A ;十进制调整MOV 30H,ACJNE A,#60H,RMD ;判断是否到1小时,不到继续MOV 30H,#00H ;到1小时则清零RMD: LJMP SETR;/******闹钟设置显示子程序******/DISPR: MOV A,30HANL A,#0FH ;屏蔽高四位MOV 3AH,A ;保留低位送3AHMOV A,30HANL A,#0F0H ;屏蔽低四位SWAP A ;高四位与第四位交换MOV 3BH,A ;将保留的高4位送3BHMOV A,31HANL A,#0FHMOV 3CH,A ;低位MOV A,31HANL A,#0F0HSWAP AMOV 3DH,A ;高位LEDR1: SETB P2.3MOV A,3DHMOV DPTR,#TABMOVC A,@A+DPTRCLR P2.0MOV P0,ALCALL DELAYLEDR2: SETB P2.0MOV A,3CHMOV DPTR,#TABMOVC A,@A+DPTRCLR P2.1MOV P0,ALCALL DELAYLEDR3: SETB P2.1MOV A,3BHMOV DPTR,#TABMOVC A,@A+DPTRCLR P2.2MOV P0,ALCALL DELAYLEDR4: SETB P2.2MOV A,3AHMOV DPTR,#TABMOVC A,@A+DPTRCLR P2.3MOV P0,ALCALL DELAYRET;/******延时子程序******/DELAY: MOV R5,#2D1: MOV R4,#250D2: DJNZ R4,D2DJNZ R5,D1RET;/******闹铃检测程序******/RING: MOV A,23H ;比较时CJNE A,31H,RETRMOV A,22H ;比较分CJNE A,30H,RETRLCALL SINGRETR: RET;/******定时器T1中断子程序******/INTT1: PUSH PSW ;状态字入栈保护PUSH ACC ;累加器入栈保护INC 50H ;中断服务程序,中断计数器加1MOV TH1,#0D8H ;装入计数初值,12M晶振,形成10MS中断MOV TL1,#0F0HPOP ACCPOP PSWRETI;/******响铃子程序******/SING: CJNE R1,#01H,SING1 ;判断是否已经闹铃过一次LJMP RETSSING1: SETB ET1MOV 50H,#00H ;中断计数器清0MOV 51H,#00H ;音符指针MOV 52H,#00H ;节拍码指针MOV 53H,#03H ;设置闹钟不退出响铃次数GETNOT: MOV A,51HMOV DPTR,#NOTE ;表头地址送DPTRMOVC A,@A+DPTR ;查表取音符码JZ ENDP ;是00H,则结束MOV R6,A ;存R6INC 51HCJNE A,#0FFH,GETMET ;不为0FFH,转取节拍码LJMP PAUSE ;转休止播放LJMP GETNOT ;取音符码GETMET: MOV A,52HMOV DPTR,#METRE ;取节拍码首地址MOVC A,@A+DPTR ;取节拍代码送R7MOV R7,AINC 52HPLAY: SETB TR1 ;启动计数CPL P2.4LCALL KEYJNZ RETSMOV A,R6MOV R3,A ;音符码存R3LCALL DELAY1MOV A,R7 ;取节拍码放A与中断计数比较CJNE A,50H,PLAY ;断计数器(50H)=R7否,不等继续循环MOV 50H,#00H ;等于,则取下一代码LCALL DISPTLCALL DISPTLCALL DISPTLCALL DISPTCLR TR1LJMP GETNOTRETS: SETB P2.4 ;置位蜂鸣器,否则可能产生啸叫MOV R1,#01H ;表明播放过一次CLR A ;清除A,防止进入按键处理子程序LJMP RETRPAUSE: CLR TR1 ;休止100毫秒MOV R2,#0DHDELAY2: MOV R3,#0FFHLCALL DELAY1DJNZ R2,DELAY2RETENDP: SETB P2.4MOV R2,#0C7H ;歌曲结束,延时1秒后继续END1M: MOV R3,#00HLCALL DELAY1DJNZ R2,END1MDJNZ 53H,SINGRETDELAY1: NOP ;R3为01H时,DELAY延时为20uS DELAY3: MOV R4,#02HDELAY4: DJNZ R4,DELAY4DJNZ R3,DELAY3RETNOTE: DB 7FH,7FH,7FH,60H,65H,72H,72H,72H,7FH,72HDB 60H,72H,60H,72H,60H,72H,7FH,72H,7FH,98H,72H,7FHDB 7FH,7FH,7FH,60H,65H,72H,72H,72H,7FH,72HDB 60H,72H,60H,72H,60H,72H,7FH,72H,7FH,72H,4CH,55H,00H METRE: DB 80H,20H,20H,20H,20H,20H,20H,20H,20H,80HDB 20H,20H,20H,20H,40H,20H,20H,20H,20H,20H,20H,80HDB 80H,20H,20H,20H,20H,20H,20H,20H,20H,80HDB 20H,20H,20H,20H,40H,20H,20H,20H,20H,20H,20H,40HEND七、课程设计体会单片机是一门神奇的课程,就算我上学期学了C语言,但是还是被虐的体无完肤,然而世上无难事,不怕有新人,只要认真看书加上自己查资料,再借鉴往届学长的资料,向他们取取经,一切都还是有可能的。