/**********************************************************************************
* 標題: 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++;
}
使用八位數碼管顯示,實現秒表程序。無鎖存,直接控制。
|