江科大STC51定时器闹钟改编项目:秒表
实现功能:
显示:分:秒:毫秒
按下按键K1秒表开始计时
按下按键K2秒表暂停计数,可再次开启计时
按下按键K3秒表归零,回到初始状态。
使用外设:LCD1602,按键K1,2,3
内部功能:定时器,延时函数
主函数代码
#include <REGX52.H>
#include "Timer0.h"
#include "delay.h"
#include "LCD1602.h"
#include "key.h"
unsigned int msec;
unsigned char sec, min;
unsigned char start,stop, clear;
void main()
{
LCD_Init();
Timer0_Init();
LCD_ShowString(1, 1, "StopWatch");
LCD_ShowChar(2, 3, ':');
LCD_ShowChar(2, 6, ':');
while(1)
{
unsigned char keynum=key();
if(keynum) //只有按下按键,才会改变start,stop,clear变量的状态,否则维持不变
{
if(keynum==1) //按下D1,秒表开始计数,并且允许再次暂停
{
start=1;
stop=0;
clear=0;
}
else if (keynum==2) //按下D2,秒表暂停计数,并且允许再次开始计数
{
stop=1;
start=0;
}
else if(keynum==3) //按下D3,秒表暂停计数,并清零。回到初始状态:显示00:00:00
{
clear=1;
start=0;
stop=0;
msec=sec=min=0;
}
}
LCD_ShowNum(2, 1, min, 2);
LCD_ShowNum(2, 4, sec, 2);
LCD_ShowNum(2, 7, msec/10, 2);
}
}
void Timer0_Routine() interrupt 1 //在中断函数里不要执行过长的任务
{
TL0= 0x18;
TH0= 0xFC;
if(start==1&&stop==0&&clear==0) //秒表按下,开始计数
{
msec++;
if(msec>=1000)
{
msec=0;
sec++;
if(sec>=60)
{
sec=0;
min++;
if(min>=60)min=0;
}
}
}
}
clear变量可要可不要
定时器C文件
#include <REGX52.H>
void Timer0_Init() //定时器初始化,将定时器中断时间定位1ms
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x18; //设置定时初值
TH0 = 0xFC; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0=1;
EA=1;
PT0=0;
}
//定时器中断函数模板
//void Timer0_Routine() interrupt 1
//{
// static unsigned int T0Count;
// TL0= 0x18;
// TH0= 0xFC;
// T0Count++;
//
// if(T0Count>=1000)
// {
// T0Count=0;
// }
//}
延时函数C文件
延时时间为1ms
void delay(unsigned int xms) //@12.000MHz
{
unsigned char i, j;
while(xms)
{
i = 2;
j = 239;
do
{
while (--j);
}while (--i);
xms--;
}
}
按键C文件
防抖,读取按下按键松开瞬间
#include <REGX52.H>
#include "delay.h"
unsigned char key()
{
unsigned char keynumber=0;
if(P3_1==0)
{
delay(20);
while(P2_1==0);
delay(20);
keynumber=1;
}
if(P3_0==0)
{
delay(20);
while(P2_1==0);
delay(20);
keynumber=2;
}
if(P3_2==0)
{
delay(20);
while(P2_1==0);
delay(20);
keynumber=3;
}
if(P3_3==0)
{
delay(20);
while(P2_1==0);
delay(20);
keynumber=4;
}
return keynumber;
}
LCD1602C文件在哔站搜江协科技评论找。
手机摄像头一对准单片机,LED灯就闪烁,然后LCD屏的秒表也自动归零了,不知道原因。。。