51单片机教程-第十集:习题练习与积累(二)
10.1.5秒表程序 做了一个秒表程序给同学们做参考,程序中涉及到的知识点我们几乎都讲过了,涉及到了...
10.1.5 秒表程序
做了一个秒表程序给同学们做参考,程序中涉及到的知识点我们几乎都讲过了,涉及到了定时器、数码管、中断、按键等多个知识点。此程序是多知识点同时应用到一个程序中的小综合,因此需要大家完全消化掉。这种小综合也是将来做大项目程序的一个基础,因此还是老规矩,大家边抄边理解,理解透彻后独立写出来就算此关通过。#include
sbit KEY1 = P2^4;
sbit KEY2 = P2^5;
sbit KEY3 = P2^6;
sbit KEY4 = P2^7;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
unsigned char code LedChar[] = { //数码管显示字符转换表
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};
unsigned char LedBuff[6] = { //数码管显示缓冲区
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
};
unsigned char KeySta[4] = { //按键状态缓冲区
1, 1, 1, 1
};
bit StopwatchRunning = 0; //秒表运行标志
bit StopwatchRefresh = 1; //秒表计数刷新标志
unsigned char DecimalPart = 0; //秒表的小数部分
unsigned int IntegerPart = 0; //秒表的整数部分
unsigned char T0RH = 0; //T0重载值的高字节
unsigned char T0RL = 0; //T0重载值的低字节
void ConfigTimer0(unsigned int ms);
void StopwatchDisplay();
void KeyAction();
void main ()
{
P2 = 0xFE; //选择第4行按键以进行扫描
P0 = 0xFF; //P0口初始化
ADDR3 = 1; //选择数码管
ENLED = 0; //LED总使能
EA = 1; //开总中断
ConfigTimer0(2); //配置T0定时2ms
while(1)
{
KeyAction();
StopwatchDisplay();
}
}
void ConfigTimer0(unsigned int ms) //T0配置函数
{
unsigned long tmp;
tmp = 11059200 / 12; //定时器计数频率
tmp = (tmp * ms) / 1000; //计算所需的计数值
tmp = 65536 - tmp; //计算定时器重载值
tmp = tmp + 19; //修正中断响应延时造成的误差,运行30分钟修正值
T0RH = (unsigned char)(tmp >> 8); //定时器重载值拆分为高低字节
T0RL = (unsigned char)tmp;
TMOD &= 0xF0; //清零T0的控制位
TMOD |= 0x01; //配置T0为模式1
TH0 = T0RH; //加载T0重载值
TL0 = T0RL;
ET0 = 1; //使能T0中断
TR0 = 1; //启动T0
}
void StopwatchDisplay() //秒表计数显示函数
{
unsigned char i;
unsigned char buff[6];
if (StopwatchRefresh)
{
StopwatchRefresh = 0;
i = DecimalPart % 10; //小数部分转换到低2位
buff[0] = LedChar;
i = DecimalPart / 10;
buff[1] = LedChar;
buff[2] = IntegerPart % 10; //整数部分转换到高4位
buff[3] = (IntegerPart / 10) % 10;
buff[4] = (IntegerPart / 100) % 10;
buff[5] = (IntegerPart / 1000) % 10;
for (i=5; i>=3; i--) //高位的0转换为空字符
{
if (buff == 0)
buff = 0xFF;
else
break;
}
for ( ; i>=2; i--) //有效数字位转换显示字符
{
buff = LedChar[buff];
}
buff[2] &= 0x7F; //点亮小数点
for (i=0; i
关注 EHome电子之家
微信扫一扫关注公众号