从给定的C51程序代码来看,这是一个典型的基于单片机(如8051系列)的秒表实现程序,主要涉及了定时器、LCD显示控制、按键检测以及时间计算等关键知识点。 ### 一、定时器使用 在本程序中,定时器0被配置为模式1(通过`TMOD=0x01;`设置),这是一个16位自动重装载的定时器。通过调整`TH0`和`TL0`寄存器的值来设定定时器的计数周期,这里设定为1毫秒(`TH0=(65536-1000)/256; TL0=(65536-1000)%256;`)。每当定时器计数溢出时,就会触发中断服务函数`timer0()`,从而实现秒表的时间增量更新。 ### 二、LCD显示控制 程序中使用了一种常见的4位数据线驱动的LCD显示屏,通过`write_com()`和`write_date()`函数分别发送命令和数据到LCD控制器,实现屏幕上的内容更新。`write_fmh()`和`write_fmh1()`函数则专门用于格式化时间和写入LCD,前者用于两位数的时间显示,后者用于三位数的时间显示。 ### 三、按键检测 程序中定义了三个按键`s1`, `s2`, 和`s3`,分别对应于启动、复位和停止功能。`keyscan()`函数负责检测这些按键的状态,通过延时消抖(`delay(5);`)确保按键检测的准确性。当检测到`s1`按下时,会启动定时器开始计时;当检测到`s2`按下时,则将秒表的时间归零并停止计时。 ### 四、时间计算与更新 程序中的时间由`hmiao`, `miao`, `fen`三个变量表示,分别对应毫秒、秒、分钟。每当定时器中断发生时,`hmiao`增加1,每达到1000次中断即1秒时,`hmiao`会被重置为0,同时`miao`增加1。类似地,当`miao`达到59时,`fen`增加1,而`miao`被重置为0,实现了时间的递增更新。 ### 五、程序结构与初始化 `main()`函数作为程序的入口,首先调用`inint()`函数进行系统初始化,包括设置定时器、LCD显示初始化以及按键状态的初始化。之后,程序进入无限循环,在循环体中调用`keyscan()`检测按键,调用`disply()`更新LCD显示,并在每次中断后更新时间变量。 ### 六、总结 此C51程序通过巧妙利用定时器、LCD显示控制、按键检测以及时间计算等功能,实现了基本的秒表功能。其结构清晰,逻辑严谨,适合C51初学者学习和参考,有助于理解单片机程序设计的基本原理和技巧。对于希望深入学习单片机应用开发的学习者而言,本程序提供了一个很好的实践案例,尤其是对定时器中断、外部设备控制等方面提供了具体的应用示例。
#define uchar unsigned char
#define uint unsigned int
sbit RS=P2^0;
sbit RW=P2^1;
sbit E=P2^2;
/*sbit lcden=P2^0;
sbit lcdrs=P2^1;
sbit lcdrw=P2^2;
*/
sbit s1=P1^0;//star
sbit s2=P1^1;//rst
sbit s3=P1^2;//stop
uchar a, s1num,fen,miao;
uint hmiao;
void disply1();
uchar code table[]=" 00:00:000";
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com)
RS=0;
RW=0;
E=0;
P0=com;
delay(1);
E=1;
delay(1);
E=0;
}
void write_date(uchar date)
{
RS=1;
RW=0;
E=0;
P0=date;
delay(1);
E=1;
delay(1);
E=0;
}
void inint()
{
uchar num;
E=0;
write_com(0x38);
write_com(0x0c);
剩余6页未读,继续阅读
- 粉丝: 0
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助