poYBAGL92pSAKwL_AAEDVFbYA1k371.png

今日做一个简单1602应用案例—-设计一个秒表。要求:具有秒表启动和复位功能按键,秒表计时时间实时显示在LCD1602。

1.系统的硬件电路原理图:

poYBAGL92pSAKwL_AAEDVFbYA1k371.png

2.系统的程序设计

2.1 头文件、全局变量和函数的声明

#include “LCD_1602.h”
#include
unsigned char Disp_Buffer[10];//这个可以稍微设置大一点,不影         响结果显示,显示的时候遇到字符串结束标志就结束
//定义二个位变量,分别对应按键开始按键和停止复位按键
sbit key_set=P3^2;
sbit key_reset=P3^3;
unsigned char TIme_count=0;
unsigned int TIme_S=0;
void TImer_inial();//定时器初始化
void delay(unsigned int i);//延时函数
void start();//启动秒表
void stop();//停止复位秒表
void second_cal_show();//秒的计算与显示
2.2 主程序

主程序主要完成显示屏的初始化和初始化显示、定时器的初始化,注意定时初始化的时候不启动。启动有开始按键控制,不按下开始键不启动定时器。初始化完了,在while循环中调用start();确定是否启动定时器,调用stop();根据按键状态确定是否停止秒表并复位;调用second_cal_show(); 进行秒的计算和显示。

void main()
{

InitLcd1602();
LcdShowStr(0, 0, “Current : 0 S”);
LcdShowStr(0, 1, “Last    : 0 S”);
TImer_inial();
while(1)
{
start();
stop();
second_cal_show();
}
}
2.3 子程序

2.3.1 初始定时器:定时器T0工作在模式1,定时器定时时间0.02秒。
void timer_inial()
{
TMOD = 0X01;//
TH0=0XB8;//定时0.02s
TL0=0X00;
}

2.3.2 延时函数:软件延时,主要用按键软件消抖

//延时函数
void delay(unsigned int i)
{
unsigned int k;
for(k=0;k

2.3.3 启动函数:检测按键是否按下,按键如果按下则启动定时器T0,并从0开始计数。

void start()
{
if(0==key_set)
{
delay(1200);//10ms消抖
if(0==key_set)//再次检测按键是否按下
{
while(!key_set);//等待按键释放
TR0=1;
time_S=0;
time_count=0;

}

}

}

2.3.4 停止复位函数:检测停止按键是否按下,按键如果按下则停止定时器T0,并更新LCD显示屏信息。

void stop()
{
if(0==key_reset)
{
delay(1200);//10ms消抖
if(0==key_reset)//再次检测按键是否按下
{
while(!key_reset);//等待按键释放
TR0=0;
LcdWriteCmd(0x01);  //清屏
LcdShowStr(0, 0, “Current : 0 S”);
LcdShowStr(0, 1, “Last    : 0 S”);
LcdShowStr(10, 1, Disp_Buffer);
}

}

}

2.3.5 秒处理及显示函数:定时器T0每溢出一次,time_count值加1,加50次为秒,秒变量time_S的值加1,然后更新显示屏显示信息。

void second_cal_show()
{
if(TF0==1)
{
TF0=0;
TH0=0XB8;
TL0=0X00;
time_count++;
if(time_count>=50)//50次一秒
{
time_count=0;
time_S++;
sprintf(Disp_Buffer,”%d S”,time_S);
LcdShowStr(10, 0, Disp_Buffer);
}

}
}

以上是全部代码,编译情况如下:

poYBAGL92q6AJAoxAAD9k2Tv1fg166.png

Loading

发表回复