单片机汇编语言实现数字时钟程序设计与仿真

需积分: 9 0 下载量 132 浏览量 更新于2024-09-15 收藏 5KB TXT 举报
"这篇资源是关于使用汇编语言编写的一款在单片机上运行的数字时钟程序,可以在Protus平台上进行仿真。程序文件名为'ShuZiZhong.c',作者通过设置中断、定时器和键盘输入等功能,实现了时间显示、调整以及蜂鸣器提示等操作。" 在该程序中,开发者运用了单片机技术,通过汇编语言编写了一个数字时钟程序。程序的主要功能包括实时显示时间(小时、分钟和秒)以及提供时间调整功能。以下是关键知识点的详细说明: 1. **单片机**: 单片机是一种集成电路芯片,包含微处理器、内存和外围接口,常用于嵌入式系统中。在这个例子中,单片机被用来控制数字时钟的运行。 2. **数字时钟**: 数字时钟是用数字形式表示时间的设备,这里的数字时钟是通过LED显示时间。LED(Light Emitting Diode,发光二极管)用于显示小时、分钟和秒。 3. **汇编语言**: 汇编语言是一种低级编程语言,与机器代码密切相关,可以直接转换为机器指令执行。在这个程序中,开发者使用汇编语言来控制单片机的各种硬件操作,如定时器、中断和I/O口。 4. **Protus仿真**: Protus是一款电子电路模拟软件,支持多种微控制器的仿真,包括单片机。在这里,开发者可以利用Protus来测试和验证数字时钟程序的正确性。 5. **定时器**: 定时器在单片机中用于产生时间间隔,程序中使用了TIMER0,通过设置TMOD寄存器和TH0寄存器配置定时器工作模式和初值,以实现毫秒级的时间周期。 6. **中断**: 中断是单片机处理外部事件的一种机制。在这个程序中,可能包含按键中断,用于用户对时间的修改。 7. **键盘输入**: 程序定义了四个键盘输入引脚(KEY1, KEY2, KEY3, KEY4),可能用于用户输入时间值或执行特定操作。 8. **扫描函数`: `scan()``: 这个函数可能用于检测键盘输入,通过循环扫描各个按键状态来识别用户操作。 9. **时间调整函数`: `Modifytime()``: 这个函数允许用户修改当前显示的时间。 10. **蜂鸣器提示`: `BEEP`**: 程序中设置了蜂鸣器引脚,可以用于发出声音提示,如在时间调整时给出反馈。 11. **延时函数`: `delay10ms()` 和 `dely250()``: 这些函数通过循环延迟实现不同时间长度的延时,对于控制时钟显示的刷新频率和响应用户输入的延迟至关重要。 12. **变量定义**: 包括`hour`, `min`, `sec`存储当前时间,`temp`, `b`, `c`用于辅助计算,`i`, `j`, `k`, `ID`用于循环控制,`t`和`flag`可能用于计数和标志位,`fla`为一个位变量,`count`可能用于计数按键次数。 这个程序通过精心设计的硬件接口、定时器设置和中断处理,实现了数字时钟的功能,同时也具备了用户交互和时间调整的能力。
2014-11-08 上传
#include<reg52 h> #define uchar unsigned char #define uint unsigned int int a b c temp; sbit DS P3^3; 18B20端口设置 uchar code table[] { 0x3F "0" 0x06 "1" 0x5B "2" 0x4F "3" 0x66 "4" 0x6D "5" 0x7D "6" 0x07 "7" 0x7F "8" 0x6F "9" }; void dsdelay int num 延时10约为53us 时钟为11 0592M { while num ; } void delay uint z 延时函数 { uint x y; for x z;x>0;x for y 110;y>0;y ; } int init 18B20初始化 { uchar x 0; DS 1; dsdelay 8 ; 延时44us DS 0; dsdelay 110 ; 延时约500us DS 1; dsdelay 14 ; 稍微延时 读取x x DS; dsdelay 20 ; } uchar readchar 从18B20中读取1个字节 { uchar i 0; uchar dat; for i 8;i>0;i { DS 0; dat>> 1; DS 1; if DS dat| 0x80; dsdelay 4 ; } return dat ; } void writechar uchar dat 向18B20中写数据 { uchar i 0; for i 8;i>0;i { DS 0; DS dat&0x1; dsdelay 5 ; DS 1; dat>> 1; } } uint readtemp 读取温度值 { uchar a; uchar b; uint t; float tt; a 0; b 0; t 0; tt 0; init ; writechar 0xcc ; 跳过读序号列号的操作 writechar 0x44 ; 启动温度转换 init ; writechar 0xcc ; 跳过读序号列号的操作 writechar 0xbe ; 读取温度寄存器 a readchar ; 读高8位 b readchar ; 读高8位 t b; t<< 8; t t|a; 两字节合成一个整型变量 tt t 0 0625; 得到真实十进制温度值 因为DS18B20可以精确到0 0625度 所以读回数据的最低位代表的是0 0625度 t tt 10+0 5; 放大十倍 这样做的目的将小数点后第一位也转换为可显示数字 同时进行一个四舍五入操作 return t ; } void display 数码管显示温度值 { P1 0xf0; 位选 P2 table[a]; 段选 delay 3 ; P1 0xf1; P2 table[b]; delay 3 ; P1 0xf2; P2 0x08; delay 3 ; P1 0xf3; P2 table[c]; } void main 主函数 { int m; m 0; while 1 { if m 0 消除85现象 { delay 500 ; temp readtemp ; delay 500 ; delay 200 ; m 1; } else { temp readtemp ; a temp 100; b temp0 10; c temp; display ; } } }">#include<reg52 h> #define uchar unsigned char #define uint unsigned int int a b c temp; sbit DS P3^3; 18B20端口设置 uchar code table[] { 0x3F "0" 0x06 "1" 0x5B "2" 0x4F " [更多]