AT89C51单片机LED倒计时器设计与实现

3 下载量 18 浏览量 更新于2024-06-24 收藏 1.71MB DOC 举报
本篇文档是关于重庆大学城市科技学院电气学院的一份课程设计论文,研究的主题是AT89C51单片机LED数字倒计时器的设计。设计的主要目的是让学生深入理解并掌握51单片机的基本应用,包括最小系统设计、按键电路设计和LED数码管的使用,以及C51编程技术。 设计要求非常具体,目标是构建一个基于AT89C51的倒计时器,具备以下功能:LED数码管显示倒计时时间,支持多闹钟设置,当达到预设时间时发出报警声。用户可以通过按键K1、K2、K3和K4分别设定小时、分钟、秒钟和退出倒计时。倒计时范围设定在24:00:00至00:00:60之间,设定后会自动重置为所设值。 设计实现分为以下几个部分: 1. **设计原理**: - 系统方案采用了单片机AT89C51为核心,利用其P0口连接LED数码管进行显示,P1口连接按键进行操作。 - 功能模块划分明确,包含显示电路、按键电路、复位电路、晶振电路和报警电路,每个模块都有特定的功能。 - 工作原理是通过软件编程控制LED数码管的显示,通过按键输入来调整时间和启动倒计时,复位电路则负责清零计数和控制倒计时的暂停或继续。 2. **系统设计**: - 显示模块:使用LED数码管显示剩余时间,采用软件译码方式,避免硬件译码器。 - 晶振模块:确保单片机稳定运行的基础频率。 - 复位电路:实现计数器的初始化和暂停/继续功能。 - 按键模块:通过按键K1-K4进行时间设置和倒计时控制。 - 报警模块:在倒计时结束时触发2秒报警声。 3. **系统实现**: - 提供了实物图,展示了整个电路的布局。 - 分析部分详细阐述了各个组件的连接方式和功能实现过程。 通过这份设计,学生不仅锻炼了他们的硬件设计技能,还提升了软件编程能力,尤其是在C51语言上的实践。整个设计项目旨在提升学生的实际操作能力和理论知识的应用能力。
2023-02-27 上传
单片机电子时钟设计报告 实现功能:显示时、分、秒,刚打开电源时,显示的数据为12:00:00,然后电路会 自动开始计时。电路中有时、分、秒各自单独的调整按钮,时间调整按钮每按一次,相 应的显示时间加1。 所需材料:89C51单片机,多位数码管,数码管显示译码器74LS48,3线8线译码器74LS13 8,3个按钮, 100Ω、22KΩ电阻若干,12MHZ晶振一个,30pf无极电容2个,10uf有极电容一个,敷铜板。 电路设计:用P1端口的P1.0~P1.3来作为数码管显示数据的输出引脚,用P1.4~P1.6引 脚作为3线8线译码器的控制输入引脚,用P0端口的P0.0~P0.2来分别作为时、分、秒的时 间调整按钮。当按下按钮时,相应的输入引脚上就会有低电平输入单片机。3线8线译码 器的控制端,Y0、Y1、Y2、Y3、Y4、Y5分别控制了数码管的显示控制线。电路如下图1- 1 图1-1 流程图: 程序设计: ORG 00H 主程序起始地址 JMP START 主程序START ORG 0BH 定时器T0中断起始地址 JMP TIM0 定时器T0中断子程序TIM0 START: MOV SP,#70H 设置堆栈指针 MOV 28H,#00 设置显示位数扫描指针初值为0 MOV 2AH,#12H 设置时钟显示寄存器初值为12H MOV 2BH,#00 设置分钟显示寄存器初值为00H MOV 2CH,#00 设置秒钟显示寄存器初值为00H MOV TMOD,#01H 设置定时器T0工作在方式1 MOV TH0,#0F0H 定时4ms的初值,即0F060H MOV TL0,#60H 初值的低位 MOV IE,#82H 定时器T0中断允许 MOV R4,#250 保证后面实现中断250次,即1秒的延时 SETB TR0 启动定时器T0 LOOP: JB P0.0,N2 若没有按键,就转去下一步检查分 CALL DELAY 延时5ms,消除抖动 MOV A,2CH 将秒寄存器的值载入累加器A ADD A,#01H A的内容加1 DA A 十进制调整 MOV 2CH,A A的 值存入秒寄存器 CJNE A,#60H,N1 看是否已经是60秒,若不是就继续检查 MOV 2CH,#00 已经是60秒,就清空秒寄存器的值 N1: JNB P0.0,$ 秒按键还没有放开就循环等待 CALL DELAY 延时5ms,消除抖动 N2: JB P0.1,N4 若分没有按键,就转去下一步检查分 CALL DELAY 延时5ms,消除抖动 MOV A,2BH 将分寄存器的值载入累加器A ADD A,#01H A的内容加1 DA A 十进制调整 MOV 2BH,A A的值存入寄存器 CJNE A,#60H,N3 看是否已经是60分,若不是就继续检查 MOV 2BH,#00H 已经是60分,就清空寄存器的值 N3: JNB P0.1,$ 分按键还没有放开就循环等待 CALL DELAY 延时5ms,消除抖动 N4: JB P0.2,LOOP 若时没有按键,就转回去继续检查看是否有按键 CALL DELAY 延时5ms,消除抖动 MOV A,2AH 将时寄存器的值载入累加器A ADD A,#01H A的内容加1 DA A 十进制调整 MOV 2AH,A A的值存入时寄存器 CJNE A,#24H,N5 看是否已经是24时,若不是就继续检查 MOV 2AH,#00H 已经是24时,就清空是寄存器的值 N5: JNB P0.2,$ 时钟按键还没有放开就循环等待 CALL DELAY 延时5ms,消除抖动 JMP LOOP 返回重新检查看是否有按键 ******定时器T0中断子程序******* TIM0: MOV TH0,#0F0H 定时初值重设 MOV TL0,#60H PUSH ACC 将累加器A的值暂存于堆栈 PUSH PSW 将PSW的值暂存于堆栈 DJNZ R4,X2 计时中断不满1s就退出继续中断 MOV R4,#250 计时1s CALL CLOCK 调用计时器子程序CLOCK CALL DISP 调用显示子程序DISP X2: CALL SCAN 调用扫描子程序SCAN POP PSW 到堆栈取回PSW的值 POP ACC 到堆栈取回累加器ACC的值 RETI 返回主程序 ******扫描子程序******* SCAN: MOV R0,#28H INC @R0 显示位数扫描值加1 CJNE @R0,#6,X3 扫描位数不为6就准备控制输出 MOV @R0,#0 扫描位数为6,就令其置为0 X3: MOV A,@R0 扫描位数载入A ADD A,#20H A加上20H(显示寄存器地址)=各时间显示区地址 MOV R1,A 各时间显示区地址存入A MOV A,