2928.E基于单片机设计的数字钟 电子设计(代码请联系本人 ) 项目开发总结报告( ).doc
项目设计总结报告 引言用单片机来设计数字钟, 软件实现各种功能比较方便. 但因软件的执行需要一定的时间, 所以就会出现误差. 对比实际的时钟, 查找出误差的来源, 并作出调整误差的方法, 使得误差尽可能地小, 使得系统可以达到实际数字钟的允许误差范围内。.1编写目的基于单片机设计的数字钟精确度较高, 因为在程序的执行过程中, 任何指令都不影响定时器的正常计数。从而, 使数字钟的精度仅仅取决于单片机的产生机器周期电路和定时器硬件电路的精确度另外, 程序较为简洁, 具有可靠性和较好的可读性。如果我们想将它应用于实时控制之中, 只要对上述程序和硬件电路稍加修改, 便可以得到实时控制的实用系统, 从而应用到实际工作与生产中去。1.2背景说明:数字电子钟的设计方法有多种, 例如, 可用中小规模集成电路组成电子钟, 也可以利用专用的电子钟芯片配以显示电路及其所需要的外围电路组成电子钟还可以利用单片机来实现电子钟等等。这些方法都各有特点, 其中, 利用单片机实现的电子钟具有编程灵活, 便于电子钟功能的扩充, 精确度高等特点。1.3定义单片机:将微处理器(CPU)、存储器、I/O接口电路和相应实时控制器件集成在一块芯片上,称其为单片微型计算机,简称单片机。 片内程序存储器普遍采用了Flash技术,使得在线编程ISP和在应用中编程技术IAP得以实现。 这两项技术是通过计算机的并口或串口对单片机进行程序下载编程的,使单片机系统远程调试、升级成为现实。IAP还可以实现单片机在应用中的再编程,为仪器仪表的智能化升级提供了重要的技术手段。1.4参考资料1,胡汉才 单片机原理及其接口技术 北京 清华大学出版社,2,单片机仿真微机接口使用手册 无锡达爱思科教仪器厂结论系统的功能完全符合设计任务的要求, 经过大量的测试数据显示, 系统的可靠性已经完全达到了实际电子钟的设计要求. 同时系统具有很强的扩展性: 添加A öD 转换器可更改成数值仪表,而添加Dö转换器则可以设计成波形发生器, 同时扩充串口的功能可以道到很好的计算机控制系统. 系统扩展图如图4.图4系统功能扩展原理图 通过焊接电路模拟板,使单片机的功能实现,数字钟的定时,调时和闹钟。现将程序付下:功能说明:在上节介绍的简单单片机时钟基础上,硬件不变,而是通过软件扩展了时钟功能,使之成为带定时闹铃的时钟。程序清单0;-1 ;文件名称:SZ02.ASM2 ;程序功能:带定时闹铃时钟3 ;-4 ;* 时 钟(含插入闹铃)程序部分 *5 6; 程序初始化 7 ; 定义存放计时单元地址8 ;.9 ALB EQU 20H.0 ;闹铃设置标志10 ;. 11 BUF EQU 30H ;3033H 连续4字节存放显示器数据12 HOUR EQU 34H ;存放小时变量13 MIN EQU 35H ;存放分钟变量14 SEC EQU 36H ;存放秒钟变量15 DEDA EQU 37H ;存放5 ms 计数值16 ;.17 HH EQU 38H ;闹铃设置小时变量18 MM EQU 39H ;闹铃设置分钟变量19 ;.20 ;按键输入引脚定义21 K1 EQU P2.4 ;按键1引脚定义22 K2 EQU P2.5 ;按键2引脚定义23 K3 EQU P2.6 ;按键3引脚定义24 K4 EQU P2.7 ;按键4引脚定义25 26 ;压电喇叭和指示灯引脚定义 27 SPK EQU P3.4 ;压电喇叭控制信号28 WLED EQU P1.0 ;工作指示灯引脚定义29 30 ;程序开始执行地址 31 ORG 0H ;程序代码由地址0开始执行32 JMP MAIN33 ORG 0BH ;定时器 0 中断地址设置34 JMP TO_SRV3536 ; 主 程 序 37 38 ;主程序 39 MAIN: ;开始40 ;.41 CLR ALB ;清除闹铃标志 42 ;.43 ACALL BZ ;压电喇叭连续两次鸣响一声44 ACALL BZ 45 ACALL LED_BL ;LED 闪动,表示程序开始执行46 ACALL INIT ;初始变化量47 ACALL INIT_TIMER ;设置定时器48 49 ;加载显示器初值数据50 MOV A, #0C0H 51 MOV P0, A 52 53 ;无穷循环54 LOOP: ;无穷循环55 ACALL CONV ;转换 时时 分分 数据56 ;.57 ACALL TIME_PRO ;检查闹铃时间 58 ;.59 ACALL DISP ;扫描显示 60 61 JB K1, M1 ;未按下K1键则继续扫描62 ACALL LED_BL ;LED闪动63 ACALL SET_TIME ;设置目前时间64 JMP LOOP ;继续循环执行65 66 ;设置闹铃时间 67 M1:JB K2,M2 ;未按下K2键则继续扫描68 ;.69 ACALL LED_BL 70 ACALL SET_ATIME ;设置闹铃时间71 ;.72 JMP LOOP ;继续循环执行73 74 M2:JB K3, M3 ;未按下K3键则继续扫描 75 JMP LOOP ;继续循环执行76 77 M3:JB K4, M4 ;未按下K4键则继续扫描78 ;.79 CPL ALB 80 JNB ALB,M3181 82 ;闹铃启动连续3次发出响声83 ACALL BZ84 ACALL BZ85 ACALL BZ86 ;.87 JMP LOOP ;继续循环执行88 ;.89 M31:90 ACALL BZ ;闹铃停止,发出一声响91 JMP LOOP ;继续循环执行92 ;.93 M4:94 JMP LOOP ;继续循环执行9596; 实现走时功能的子程序 9798 ;使用定时器0模式0计时99 INIT_TIMER: ;初始化定时器,使用定时器0模式1计时100 MOV TMOD,#00000000B ;设置定时器0工作模式为0101 MOV IE, #10000010B ;启用定时器0中断产生102 MOV TL0, #(8192-4900)MOD 32 ;加载低字节103 MOV TH0, #(8192-4900)/32 ;加载高字节104 SETB TR0 ;启动定时器0开始计时105 RET106 ;107 ;中断服务程序108 TO_SRV: ;定时器0计时中断程序每隔5ms中断一次109 PUSH ACC ;将累加器放入堆栈110 MOV TL0, #(8192-4900)MOD 32 ;加载低字节111 MOV TH0, #(8192-4900)/32 ;加载高字节112 INC DEDA ;5ms计数值加1 113 ;秒输出114 MOV A, DEDA115 CJNE A,#200,TT1 ;是否1s到了116 MOV DEDA, #0 ;计数值清除为0117 CPL WLED ;LED灯亮灭变换118 INC SEC ;秒计数加1119 MOV A, SEC120 CJNE A, #60, TT1 ;是否1min到了121 ;分输出122 INC MIN ;分计数加1123 MOV SEC, #0 ;秒计数清除为0124 MOV A, MIN125 CJNE A, #60, TT1 ;是否1h到了126 ;时输出127 INC HOUR ;小时计数加1128 MOV MIN, #0 ;分计数清除为0129 MOV A, HOUR130 CJNE A,#24, TT1 ;是否24h到了131 MOV SEC, #0 ;秒钟变量清除为0132 MOV MIN, #0 ;分钟变量清除为0133 MOV HOUR, #0 ;小时变量清除为0134 TT1:135 POP ACC ;将累加器由堆栈取出136 RETI137138 ; 实现显示功能的子程序 139140 ;转换 时时:分分 数据141 CONV:142 ;转换小时数据143 MOV A, HOUR144 MOV B, #10145 DIV AB146 MOV DPTR,#TABLE ;查表转换147 MOVC A, A+DPTR148 MOV BUF, A149 MOV A, B150 MOVC A, A+DPTR151 MOV BUF+1, A152 ;转换分钟数据153 MOV A, MIN154 MOV B, #10155 DIV AB156 MOV DPTR,#TABLE ;查表转换157 MOVC A, A+DPTR158 MOV BUF+2, A159 MOV A, B160 MOVC A, A+DPTR161 MOV BUF+3, A162 RET163 164 ;字型数据编码表165 TABLE:166 DB 0C0H,0F9H,0A4H,0B0H167 DB 99H,92H,82H,0F8H168 DB 80H,90H,88H,83H169 DB 0C6H,0A1H,86H,8EH170 171 ;172 ;扫描显示173 DISP:174 MOV R0, #BUF ;指向显示器显示缓冲区起始地址175 MOV R2, #4 ;循环执行4次176 MOV ACC, #11110111b;加载扫描信号初值11110111B177 S1:178 PUSH ACC179 MOV A, R0 ;取出显示器数据180 MOV P0, A ;由P0送出一位显示器数据181 POP ACC182 MOV P2, ACC ;由P2送出扫描输出信号 183 MOV R5, #2 ;延迟一会儿184 ACALL DELAY185 ;改变扫描码 EX:XXXX1011 186 RR A ;累加器向右移动一位187 INC R0 ;显示器显示缓冲区地址加1188 DJNZ R2, S1 ;循环判断是否继续执行189 RET190 191 ; 实现调整时间子程序 192193 ;设置目前时间194 SET_TIME:195 CLR TR0 ;定时器动作暂停196 MOV SEC, #0 ;秒钟变量清除为0197 L0:198 ACALL DISP ;扫描显示199 200 JB K2, L1 ;未按下K2键则继续扫描201 JNB K2, $ ;有按下则等待放开来202 ;K2小时调整 203 INC HOUR ;小时计数加1204 MOV A, HOUR205 CJNE A,#24, L11 ;是否24H到了206 MOV HOUR, #0 ;小时变量清除为0207 L11:208 ACALL CONV ;转换显示数据209 ACALL DISP ;扫描显示210 JMP L0 ;继续程序执行211 212 L1:JB K3, L2 ;未按下K3键则继续扫描213 JNB K3,$ ;有按下则等待放开来214 ;K3分钟调整.215 INC MIN ;分钟计数加1216 MOV A, MIN217 CJNE A,#60, L21 ;是否60 min到了218 MOV MIN, #0 ;分钟变量清除为0219 L21:220 ACALL CONV ;转换显示数据221 ACALL DISP ;扫描显示222 JMP L0 ;继续程序执行223 224 L2: JB K4,L0 ;未按下K4键则继续扫描225 JNB K4, $ ;有按下则等待放开来226 ACALL BZ ;压电喇叭鸣响一声227 ;K4设置完成228 ACALL LED_BL ;LED闪动229 SETB TR0 ;启动定时器230 RET 231232 ;喇叭和指示灯等其它子程序 233234 ;计时单元清零235 INIT: 236 MOV DEDA, #0 ;5ms计数值清除为0237 MOV SEC, #0 ;秒钟变量清除为0238 MOV MIN, #0 ;分钟变量清除为0239 MOV HOUR, #0 ;小时变量清除为0240 RET241 ;242 ;压电喇叭243 BZ: ;压电喇叭鸣响一声244 MOV R6, #250245 B1: ACALL DEX246 CPL SPK247 DJNZ R6,B1248 MOV R5, #50 249 ACALL DELAY250 RET251 252 ;253 ;工作指示254 LED_BL: ;工作指示灯闪烁255 MOV R4,#6256 LE1:CPL WLED ;位反向257 MOV R5,#25 258 ACALL DELAY259 DJNZ R4, LE1 ;延迟50ms260 RET261 ;262 ;延时子程序263 DELAY: ;总延迟时间 2ms×R5264 MOV R6,#10 265 D1:MOV R7,#100266 DJNZ R7,$267 DJNZ R6,D1268 DJNZ R5,DELAY269 RET 270 ;271 ; 压电喇叭短暂延时子程序272 DEX: MOV R7,#180 ;短暂延时273 DE1: NOP274 DJNZ R7, DE1275 RET276278;* 增加定时闹铃程序部分 *279 280; 设置闹铃时间 281 ;设置闹铃时间282 SET_ATIME:283 ACALL CONVA ;加载闹铃时间数据284 N0:285 ACALL DISP286 ;287 JB K2, N1 ;未按下K2键则继续扫描288 JNB K2, $ ;有按下则等待放开来289 ;K2调整小时290 INC HH ;小时数加1291 MOV A, HH292 CJNE A, #24,N11 ;是否24h到了293 MOV HH,#0 ;小时请为0294 N11:295 ACALL CONVA ;加载闹铃时间数据296 ACALL DISP ;扫描显示297 JMP N0 ;继续按键扫描298 ;299 N1: JB K3, N2 ;未按下K3键则继续扫描300 JNB K3, $ ;有按下则等待放开来301 ;K3调整分钟302 INC MM ;调整分钟数303 MOV A,MM ;分钟数加1304 CJNE A, #60,N21 ;是否60min到了305 MOV MM, #0 ;分钟数请为0306 N21:307 ACALL CONVA ;加载闹铃时间数据308 ACALL DISP ;扫描显示309 JMP N0 ;继续按键扫描310 ;311 N2: JB K4, N0 ;未按下K4键则继续扫描312 JNB K4, $ ;等K4键放开313 ;K4设置完成.314 ACALL LED_BL ;LED闪动315 ACALL CONV ;加载现在时间数据316 RET317318; 加载闹铃时间数据 319320 ;转换 时时:分分 数据321 CONVA:322 ;转换小时数据323 MOV A, HH324 MOV B, #10325 DIV AB326 ;327 MOV DPTR,#TABLE ;查表转换328 MOVC A, A+DPTR329 MOV BUF, A330 ;331 MOV A, B332 MOVC A, A+DPTR333 MOV BUF+1, A334 ;转换分钟数据335 MOV A, MM336 MOV B, #10337 DIV AB338 ;339 MOV DPTR,#TABLE ;查表转换340 MOVC A, A+DPTR341 MOV BUF+2, A342 ;343 MOV A, B344 MOVC A, A+DPTR346 MOV BUF+3, A346 RET347 348 ; 检查闹铃时间处理 349350 ;检查是否启动闹铃351 TIME_PRO: 352 JB ALB, TI3353 RET354;355356 ;检查闹铃时间是否到了357 TI3:358 MOV A, HOUR359 MOV B,HH360 CJNE A, B, BK ;检查闹铃小时时间361 ;362 MOV A, MIN363 MOV B,MM364 CJNE A, B, BK ;检查闹铃分钟时间365 ;366 ACALL TIME_OUT ;执行检查闹铃时间到了处理367 BK:368 RET369370 ; 执行闹铃时间处理 371372 TIME_OUT: ;所设置的闹铃数据到了373 X1: ACALL LED_BL ;LED闪动374 ACALL BZ ;压电喇叭发出哗的一声375 ;按下K4键停止闹铃 376 JB K4, X1 ;等待是否按下K4键377 JNB K4,$ ;若有按下键则等待按键放开来378 ACALL LED_BL ;LED闪动379 CLR ALB ;清除闹铃位380 RET381;382 END