北交大单片机结课设计电子时钟实验
单片机课程设计电子钟实验.

数字钟实验一实验目的与要求进一步熟悉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:波形发生器(采用PWM方式、显示频率) 4:单片机控制手机发短信系统(通过串口) 5:单片机多通信系统(多于2点) ; 6:单片机与PC组成数据采集与显示系统(PC 通过串口通信,并采用VB编程) 。
15
扩展题与自选题
题目应该是51单片机应用类; 可根据自己的实际能力,选择 51 单片机 完成课程设计; 选题须老师认可。
16
课程设计基本要求
学生每人任选其中的一个题目。也可经教师 同意自行选择51单片机应用方面的题目; 根据课程设计题目,收集相关资料,进行系 统总体方案设计,选择最优方案; 完成所选方案的硬件、软件设计,并调试通 过; 写出课程设计报告;
5
2.LCD字符型液晶显示器控制
设计任务及要求 在JD51开发板上扩展一块LCD点阵字符型液晶 显示器,要求: 1. 用按键输入与显示数字; 2. 实现显示实时时钟。 3. 利用按键可对闹铃进行设置,并可显示闹铃时 间。当闹铃时间到蜂鸣器发出声响,按停止键 使可使闹铃声停止。 4. 使所显示内容滚动。 工作原理及设计思路 在JD51上有一标准的LCD液晶显示器接口,采 用DS1602液晶显示器。
12
8.红外接收与控制
利用JD51平台完成单片机接收红外数据, 实现红外遥控。 要求:
通过红外遥控器发送控制命令,单片机 通过1838红外接收头红外数据,并执行 相应操作。 了解红外遥控器、红外接收器的工作原 理。
13
单片机课程设计电子时钟

单片机课程设计 电子时钟一、课程目标知识目标: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)单片机电子时钟课程设计实验报告一、实验内容本次实验的主要内容是使用单片机设计一个电子时钟,通过编程控制单片机,实现时钟的显示、报时、闹钟等功能。
二、实验步骤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、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
电子时钟课程设计报告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语言,但是还是被虐的体无完肤,然而世上无难事,不怕有新人,只要认真看书加上自己查资料,再借鉴往届学长的资料,向他们取取经,一切都还是有可能的。