51单片机利用定时器和1602液晶显示实现一个计时器
说明
1.平台:windows10 64位教育版
2.工具:普中科技HC6800-ES V2.0 、keil uVision 2
3.注意:芯片STC89C52,8位1602液晶显示
4.实现效果:
通电之后,1602开始显示计时,按下第一个按键进入设置,按下第二个按键设置时分秒的各个位置,按下第三个按键在对应的时分秒的位置数字加1,按下第四个按键在对应的时分秒的位置数字减1
原理
笔者参考的是郭天祥的《新概念51单片机C语言教程》和网上的普中科技的单片机的使用教程,具体使用教程,在哔哩哔哩上面搜“普中科技51单片机”也有。要找到能用的代码,网上是很多的,不过笔者是自己在明白原理之后,自己编写程序实现的,自己独立思考的过程很重要。
以下是普中科技的使用教程:详细的代码里面也有
流程
我是按照一个一个功能的实现来把代码加进去的,利用单片机上面的独立模块就可以实现独立测试。
1.按键检测
这里我用到的是4个独立按键,实现的功能是第一个按键按下进入时间设置,第二个按键按下设置时分秒,第三个按键按下对应的位置加1,第四个按键按下对应位置减1,注意,这里的其他独立按键起作用的前提是第一个按键要先按下进入设置,否则按键无效。
以下是代码:
I/O口声明
sbit key1 = P3^0; //第二个按键
sbit key2 = P3^1; //第一个按键
sbit key3 = P3^2; //第三个按键
sbit key4 = P3^3; //第四个按键
按键检测函数
void keyscan()
{
if (key1 == 0)
{
delay10ms();
if (key1 == 0)
{
//要实现的功能
while(!key1); //等待按键松开
}
}
if (key2 == 0)
{
delay10ms();
if (key2 == 0)
{
//要实现的功能
while(!key2);
}
}
if (key3 == 0)
{
delay10ms();
if (key3 == 0)
{
//要实现的功能
while(!key3);
}
}
if (key4 == 0)
{
delay10ms();
if (key4 == 0)
{
//要实现的功能
while(!key4);
}
}
}
//延时10ms以消除按键抖动
void delay10ms()
{
unsigned char a,b,c;
for(c = 1;c > 0; c--)
for(b = 38;b > 0; b--)
for(a = 130;a>0;a--);
}
2.定时器中断
采用的是定时器0,工作方式2
以下是代码:
TMOD = 0x02; //定时器0,工作方式2
TH0 = 0x9c; //装入初值,高4位
TL0 = 0x9c; //装入初值,低4位
EA = 1; //打开总中断
ET0 = 1; //打开定时器中断
TR0 = 1; //启动定时器
void Timer() interrupt 1
{
TH0 = 0x9c; //重装初值
TL0 = 0x9c;
num++; //num = 10000时为1s
}
3.1602液晶显示
这里使用是8位的1602液晶,如果有人用的是4位的,详细代码在之前的普中科技的官方教程里面有。
以下是代码:
I/O口声明
sbit LED_RS = P2^6