#include <REGX51.H>

sfr P2M1 = 0x95; //--- 新增的功能寄存器地址声明 ---
sfr P2M0 = 0x96;
sfr P0M1 = 0x93;
sfr P0M0 = 0x94;

unsigned char code LEDSEG[] = //--- 显示0~9,A~F笔段代码表 ---
{
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00,0x40,
};

unsigned char code LEDDIG[] = //--- 数码管显示的位选通段代码表 ---
{
0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,
};

unsigned char LEDBuffer[8]; //--- 定义的显示缓冲区 ---
unsigned char LEDPointer; //--- 定义的扫描计数变量 ---
unsigned int sCount; //--- 定义的秒计数器变量 ---
unsigned char HighCnt; //--- 定义的高字节的计数值 ---
unsigned char sFlag; //--- 定义的1秒时间到标志 ---

void main(void)
{
unsigned char i;
unsigned long temp;

P2M1 = 0x00; //--- 配置P2端口的P2.0~P2.7为推挽输出模式 ---
P2M0 = 0xFF;
P0M1 = 0x00; //--- 配置P5端口的P0.0~P0.7为推挽输出模式 ---
P0M0 = 0xFF;

TMOD = 0x51; //--- 配置T0为定时模式,工作于16位装载的方式0 ---
//--- 配置T1为计数模式,工作于方式1 ---
TH0 = (65536 - 50000) / 256; //--- 初始化T0定时1mS ---
TL0 = (65536 - 50000) % 256;
TR0 = 1; //--- 启动T0工作 ---
ET0 = 1; //--- 使能T0中断 ---
TH1 = 0; //--- 初始化T1的计数寄存器TH1和TL1 ---
TL1 = 0;
PT1 = 1; //--- 定时器1为高优先级 ---
ET1 = 1; //--- 使能T1中断 ---
EA = 1; //--- CPU开中断 ---

for(i=0;i<sizeof(LEDBuffer);i++)
LEDBuffer[i] = 0; //--- 清显示缓冲区 ---

while(1)
{
if(1 == sFlag) //--- 定时1秒时间到 ---
{
sFlag = 0; //--- 清定时1秒时间到标志 ---
temp = (unsigned long)HighCnt * 65536 + (unsigned long)TH1 * 256 + TL1;
i = 0;
while(temp)
{
LEDBuffer[i] = temp % 10; //--- 将频率值各个位数字分开 ---
temp /= 10; //--- 送到显示缓冲区 ---
i ++;
}
HighCnt = 0; //--- 重新初始化相关变量 ---
TH1 = 0;
TL1 = 0;
TR1 = 1; //--- 重新启动T1工作 ---
}
}
}
//--------------------------------------------------------------------------------------
//--- 定时器T0溢出中断服务程序 ---
void T0_ISR(void) interrupt 1
{
TH0 = (65536 - 50000) / 256; //--- 初始化T0定时1mS ---
TL0 = (65536 - 50000) % 256;

P2 = LEDSEG[LEDBuffer[LEDPointer]]; //--- 显示数字 ---
P0 = LEDDIG[LEDPointer]; //--- 数码管的位选段选择 ---
LEDPointer++; //--- 动态扫描计数变量加1 ---
if(sizeof(LEDBuffer) == LEDPointer)LEDPointer = 0;//--- 所有数码管扫描完,计数归0 ---
sCount ++; //--- 秒计数变量加1 ---
if(20 == sCount) //--- 定时1秒时间到 ---
{
TR1 = 0; //--- T1停止工作 ---
sCount = 0; //--- 秒计数变量清0
sFlag = 1; //--- 置定时1秒时间到标志 ---
}
}
//--------------------------------------------------------------------------------------
//--- 定时器T1溢出中断服务程序 ---
void T1_ISR(void) interrupt 3
{
HighCnt ++; //--- 计满65536个脉冲,高字节加1 ---
}

posted on 2015-07-25 09:39  ChunJian-YANG  阅读(956)  评论(0)    收藏  举报