开篇说明:开发板平台是普中的A7开发板,实验代码及相关注意事项以及精度不精确原因在下面代码注释中有说明。
/*******************************************************************************
*实验现象:通过串转并及138译码器控制动态数码管秒表计时
*接 线:P0.0 -> RC, P0.1 -> SC, P0.2 -> SE; P1.0 -> A_138, P1.1 -> B_138,
P1.2 -> C_138; J27 -> J6;
*注意事项:需要注意数码管数字显示前消影,数码管显示时不能用for循环来显示,因为
* for循环显示刷新太快了,而数码管显示最起码要保持1ms。所以在中断函数
* 刷新显示数码管的时候用的是switch而不是for循环。
*特别注意:做秒数定时实验的时候,使用了封装函数或者代码量太多后反而计时不准确,
* 走时会变快,如果使用代码量小的测试代码计时基本正常,具体可以查看最下
* 面的那段测试代码;
******************************************************************************/
#include <reg52.h>
#define DELAY_1_MS
//#define DELAY_500_US
#define BIT_16_LOAD 0X01
#define AUTOLOAD 0X02
#define ON 0x01
#define OFF 0x00
sbit RC = P0^0;
sbit SC = P0^1;
sbit SE = P0^2;
sbit A_138 = P1^0;
sbit B_138 = P1^1;
sbit C_138 = P1^2;
/* 数码管字模 */
unsigned char code byte_buff[] = {
0xFC, 0x60, 0xDA, 0xF2, 0x66, 0xB6, 0xBE, 0xE0, 0xFE, 0xF6};
/* 138译码器真值表 */
unsigned char code ctl_138[] = {
0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1, 0x0};
/* 用来保存时间计算得出的数字 */
unsigned char tmp_buf[8] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
unsigned char pos = 1; /* 记录需要显示多少个数码管 */
unsigned long sec = 0; /* 记录走了多少个秒数 */
unsigned int