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电子之家


微信扫一扫关注公众号

0 个评论

要回复文章请先登录注册