|
來51hei論壇有些時間了,想自己動手做點什么,就焊了個stc11f02e單片機的最小系統(tǒng),使用外接12Mhz晶振。但是在實際應用時有些困惑。使用11f02e的1T工作模式,晶振使用12Mhz的,寫了個5分鐘的倒計時程序,外接數(shù)碼管顯示。
1T工作模式:
12Mhz晶振
一個機器周期為1/12000000s
定時器最大值為:65536
工作60000次
60000/12000000 = 0.005s
TH0 = (65536-60000)/255 = 0x15;
TL0 = (65536-60000)%255 = 0xb5
1s = 1/0.005 = 200(次)
計算出循環(huán)200次為1秒,但是實際測出來需要循環(huán)1600次才是1秒。不知道時哪里出錯了,請老師指正。
由于沒有畫電路圖,直接焊的洞洞板,如果分析需要我待會兒手繪一張電路圖。
附上源碼:
#include <stc11f02e.h>
unsigned char code ledTable[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char ledBuffer[] = {0xff,0xff,0xff,0xff};
unsigned char p = 0; //顯示位數(shù)指示標志
unsigned int time = 300; //倒計時300秒
sbit A1 = P3^2; //數(shù)碼管第一位
sbit A2 = P3^3; //數(shù)碼管第二位
sbit A3 = P3^4; //數(shù)碼管第三位
sbit A4 = P3^5; //數(shù)碼管第四位
sbit led = P3^7; //計時完成時點亮小燈
void init();
void display();
void delay();
unsigned cnt = 0;
void main(void)
{
init();
while(1)
{
if((time/600) == 0)
{
ledBuffer[0] = 0xff; //小于10分鐘,首位不亮
}
else
{
ledBuffer[0] = ledTable[(time/60)/10];
}
ledBuffer[1] = ledTable[(time/60)%10] & 0x7f; //小數(shù)點
ledBuffer[2] = ledTable[(time%60)/10];
ledBuffer[3] = ledTable[(time%60)%10];
display();
}
}
void init()
{
AUXR |= 0x80; //1T工作模式
TMOD &= 0xf0; //選擇計時模式
EA = 1;
ET0 = 1;
TF0 = 0;
TR0 = 1;
TL0 = 0xb5;
TH0 = 0x15;
led = 0; //led燈默認關閉
}
void display()
{
P1 = 0xff;
switch(p)
{
case(0):A1=0;A2=1;A3=1;A4=1;P1=ledBuffer[0];p++;break;
case(1):A1=1;A2=0;A3=1;A4=1;P1=ledBuffer[1];p++;break;
case(2):A1=1;A2=1;A3=0;A4=1;P1=ledBuffer[2];p++;break;
case(3):A1=1;A2=1;A3=1;A4=0;P1=ledBuffer[3];p=0;break;
default:break;
}
delay();
}
void delay() //給led燈一個過渡時間
{
unsigned char i,j;
for(i=0;i<110;i++)
{
for(j=0;j<10;j++);
}
}
void timeUp() interrupt 1
{
TL0 = 0xb5;
TH0 = 0x15;
cnt++;
if(cnt==1600) //經(jīng)實測1600個循環(huán)才等于1秒
{
cnt = 0; //經(jīng)過1s秒置零
time--; //時間減少1秒
if(time==0) //如果計時完成
{
TR0 = 0; //計數(shù)器運行標志位置零,停止計時
time = 0; //及時完成顯示函數(shù)顯示0.00
delay(); //給點亮led燈一個過渡時間,減小瞬間電流
led = 1; //led小燈常量,標志計時完成
}
}
}
貼上實物圖:
|
|