/**********************************************************************************
* 标题: 8数码管实现秒表控制8数码管实现秒表控制 *
* 淘宝梦飞电子工作室 *
* *
***********************************************************************************
* 按键start 开始计时
* 按键stop 停止
* 按键reset 复位
* 最多计时60分钟
***********************************************************************************/
#include <reg51.h>
#include <intrins.h>
sbit start=P1^0;
sbit stop=P1^1;
sbit reset=P1^2;
unsigned char CNT=0;
//此表为 LED 的字模, 共阴数码管 0-9 -
unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //段码控制
//此表为8个数码管位选控制, 共阴数码管 1-8个 -
unsigned char code dispbit[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F}; //位选控制 查表的方法控制
/************主函数**********************/
main()
{
unsigned char ms_10,sec,min;
unsigned int LedOut[10]; //变量定义
unsigned char i,j;
ms_10=0;
sec=0;
min=0;
//定时器及中断初始化
TMOD=0x02; //定时器0,选择工作方式2-8位自动重装
TH0=0x9C; /*采用定时器计时,12MHz晶振下,计数初值=256-100=156 (0x9C)*/
TL0=0x9C; //定时100us
ET0=1; //定时器0开中断
EA=1; //开总中断
TR0=0;//计时器不工作
while(1)
{
if(!start) TR0=1; //计时器工作
if(!stop) {TR0=0;}
if(!reset) {TR0=0; CNT=0; ms_10=0; sec=0; min=0; break;}
if(CNT>99)
{CNT=0;
ms_10++;//每过100*100us=0.01秒,ms_10累加一次
if(ms_10>99)
{
ms_10=0;
sec++;
if(sec>59)
{
sec=0;
min++;
if(min>59) min=0;
}
}
}
//将计数值Time 转化为时间,存储到Ledout中;
LedOut[0]=Disp_Tab[min/10%10];//分
LedOut[1]=Disp_Tab[min%10];//分
LedOut[2]=0x40;
LedOut[3]=Disp_Tab[sec/10%10]; //秒
LedOut[4]=Disp_Tab[sec%10]; //秒
LedOut[5]=0x40;
LedOut[6]=Disp_Tab[ms_10/10%10]; //0.01秒
LedOut[7]=Disp_Tab[ms_10%10]; //0.01秒
//输出到数码管上
for( i=0; i<9; i++)
{
P0 = LedOut;
P2 = dispbit; //使用查表法进行位选
for(j=0;j<100;j++);
}
}
}
void Timer0(void) interrupt 1
{
CNT++;
}
使用八位数码管显示,实现秒表程序。无锁存,直接控制。
|