logo资料库

单片机秒表课设.docx

第1页 / 共10页
第2页 / 共10页
第3页 / 共10页
第4页 / 共10页
第5页 / 共10页
第6页 / 共10页
第7页 / 共10页
第8页 / 共10页
资料共10页,剩余部分请下载后查看
题目:秒表 要求: a.用 8051 单片机设计秒表,用 2 位显示秒、2 位显示 1/100 秒; b.按开始键时,开始计时,显示秒、1/100 秒;再次按开始键停止计时显示秒、1/100 秒; c.按复位键时,显示全零。 附加功能: 添加一个计时指示灯,开始计时时灯亮,停止计时时灯灭。 单片机的简单介绍: AT89C51 是一种低功耗、高性能的片内含有 4KB 快闪可编程/擦除只读存储器 (FPEROM-Flash Programmable and Eraseable Read Only Memory)的 8 位 CMOS 微控制器, 使用高密度、非易 失存储技术制造,并且与 80C51 引脚和指令系统完全兼容。 主要性能: 与 MCS-51 微控制器产品系列兼容。 片内有 4KB 可在线重复编程的快闪擦写存储器 存储数据保存时间为 10 年 宽工作电压范围:Vcc 可为 2.7V 到 6V 全静态工作:可从 0Hz 至 16MHz 程序存储器具有 3 级加密保护 128*8 位内部 RAM 32 条可编程 I/O 线 两个 16 位定时 器/计数器 中断结构具有 5 个中断源和 2 个优先级 可编程全双工串行通道 空闲状态维持低功 耗和掉电状态保存存储内容 设计说明: 晶振电路为 6MHz,机器周期为 2us,定时器每 100us 中断一次,在中断服务程序中,对中断次数进 行比较,100us 计数 100 次就是 1/100 s.然后再对 1/100 s 进行计数 100 次得到秒,并送入显示 缓冲区。当启动外部中断 0(开始键)时,开始计数,显示秒、1/100 秒;再次启动外部中断 0(开 始键)时,暂停计数,显示秒、1/100 秒。当启动外部中断 1(复位键)时,秒和 1/100 秒都显示 “00.00”. 把单片机系统区域中的 P3.2/INTO*用导线连接到按键“开始/暂停”端口上;按键为启动、暂停键 在外部中断 0 中通过控制 TRO 来实现开始与暂停的功能,即每进一次中断取反一次 TR0. 把单片机系统区域中的 P3.2/INT1*用导线连接到按键“清零”端口上,按键为复位键.没进一次外 部中断 1,将储存秒和毫秒地址里的内容清零,并且关闭 TRO 停止计数。 实验箱模拟 p1 口接 LED 灯实现开始/暂停指示功能。
硬件原理图: 实验箱显示部分原理图:
主程序流程图: 开始 制定时器模式及常数 设置初始常数 暂停定时器 读取秒值 转换成显示数据 显示数据送缓冲 读取毫秒值 转换成显示数据 显示数据送缓冲 调用显示子程序
T0 中断服务程序框图 中断入口 保护现场 100 次计数值减 1 计 数 值 为 设置下次 100 次计数值 ms 加 1,送出显示 是 到 ms=100? 否 ms 清零,second 加 1,送出显 示 否 否 否 second=99? second 清零 恢复现场 中断返回
外部中断 0 流程图: 中断入口 保护现场 将 TR0 取反实现 开始\暂停 取反 p1 点亮/熄灭指示灯 外部中断 1 流程图: 恢复现场 中断返回 中断入口 保护现场 将秒毫,秒清零 并关闭 TRO 停止数 恢复现场 中断返回
仿真后寄存器截图: 程序代码: ORG 0000H AJMP start ORG 0003H AJMP X0_INT ORG 000BH AJMP T0Int ORG 0013H AJMP X1_INT
OUTBIT OUTSEG IN equ 08002h equ 08004h equ 08001h ; 位控制口 ; 段控制口 ; 键盘读入口 LEDBuf second ms C1us equ equ equ 60h 41h 42h equ 43h ; 显示缓冲 ;秒 ;毫秒 Tick T1us equ 100 equ 256-50 T0Int: push push PSW ACC mov jnz dec a, C1us+1 Goon C1us Goon: dec C1us+1 mov orl jnz mov mov inc mov cjne mov inc mov cjne a, C1us a, C1us+1 Exit C1us, #high(Tick) C1us+1, #low(Tick) ; ms a, ms a, #100, Exit ms, #0 second a, second a, #99, Exit mov second,#0 Exit: ACC PSW pop pop reti Delay: mov DelayLoop: r7, #0 ; 延时子程序
r7, DelayLoop r6, DelayLoop djnz djnz ret LEDMAP: ; 八段管显示码 db db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h DisplayLED: mov mov mov Loop: r0, #LEDBuf r1, #6 r2, #00100000b ; 从左边开始显示 ; 共 6 个八段管 ; 关所有八段管 ; 显示一位八段管 ; 显示下一位 mov mov movx dptr, #OUTBIT a, #0 @dptr, a mov a, @r0 mov movx mov mov movx dptr, #OUTSEG @dptr,a dptr, #OUTBIT a, r2 @dptr, a mov call r6, #1 Delay mov rr mov a, r2 a r2, a inc r0 djnz r1, Loop ; =============================================== ToLED: dptr, #LEDMap a, @a+dptr mov movc ret start: jnb p1.0 ,start mov TMOD, #02h ; 模式 2, 定时器
分享到:
收藏