找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3141|回復: 4
打印 上一主題 下一主題
收起左側

在實踐中關于單片機晶振與計時器問題的困惑

[復制鏈接]
跳轉到指定樓層
樓主
ID:399129 發(fā)表于 2019-1-19 11:30 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
來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小燈常量,標志計時完成
            
        }
    }
}

貼上實物圖:

index.jpg (104.93 KB, 下載次數(shù): 50)

正在運行中

正在運行中

index2.jpg (105.57 KB, 下載次數(shù): 39)

最小系統(tǒng)

最小系統(tǒng)

index3.jpg (95.98 KB, 下載次數(shù): 32)

整體

整體

index4.jpg (78.37 KB, 下載次數(shù): 30)

計時結束,點亮小燈

計時結束,點亮小燈
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:123289 發(fā)表于 2019-1-19 16:15 | 只看該作者
1、T0有幾種工作模式,分別代表什么意思?(提示:TMOD的B1B0位,你用的是什么模式?)
2、TH0TL0=15B5H=5557,它與65536的差是多少?(好在不是主要問題)
回復

使用道具 舉報

板凳
ID:213173 發(fā)表于 2019-1-19 20:06 | 只看該作者
你的定時器初始化程序錯誤,給你一個示例。
void Timer0Init()                //5毫秒@12.000MHz
{
        AUXR |= 0x80;                //定時器時鐘1T模式
        TMOD &= 0xF0;                //設置定時器模式1
        TMOD |= 0x01;                //設置定時器模式1
        TL0 = 0xA0;                //設置定時初值
        TH0 = 0x15;                //設置定時初值
        TR0 = 1;                        //定時器0開始計時
        EA = 1;                        //開總中斷
        ET0 = 1;                        //開T1中斷
}
回復

使用道具 舉報

地板
ID:399129 發(fā)表于 2019-1-20 00:48 | 只看該作者
yzwzfyz 發(fā)表于 2019-1-19 16:15
1、T0有幾種工作模式,分別代表什么意思?(提示:TMOD的B1B0位,你用的是什么模式?)
2、TH0TL0=15B5H=5 ...

謝謝,我去查查手冊。老師,關于初值我這樣算具體錯在哪里了。
回復

使用道具 舉報

5#
ID:399129 發(fā)表于 2019-1-20 00:49 | 只看該作者
wulin 發(fā)表于 2019-1-19 20:06
你的定時器初始化程序錯誤,給你一個示例。
void Timer0Init()                //5毫秒@12.000MHz
{

謝謝老師,確實是定時器模式這里錯了。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表