找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3394|回復(fù): 7
收起左側(cè)

關(guān)于8051單片機(jī)芯片的計(jì)數(shù)器設(shè)置問題

[復(fù)制鏈接]
ID:648939 發(fā)表于 2019-12-11 12:49 | 顯示全部樓層 |閱讀模式
中斷采用外部脈沖計(jì)數(shù),計(jì)數(shù)器1工作,我想設(shè)置收到脈沖400次后進(jìn)入中斷,運(yùn)行后發(fā)現(xiàn)最大只能設(shè)置255次,求幫忙解決。
代碼如下:
void Timer1Init()
{
        TMOD=0x60;  //設(shè)置定時(shí)器1,采用的是計(jì)數(shù)器0,工作模式1(M1=0,M0=1)                             
        TL1 =1;                //設(shè)置定時(shí)初值
        TH1 =1;     //設(shè)置定時(shí)重載值
        TF1 = 0;                        //清除TF1標(biāo)志
        TR1 = 1;                        //定時(shí)器1開始計(jì)數(shù)
        EA=1;                        //開總中斷
        ET1=1;                        //開定時(shí)器1中斷   

}

回復(fù)

使用道具 舉報(bào)

ID:94031 發(fā)表于 2019-12-11 14:02 | 顯示全部樓層
你設(shè)置的是8位計(jì)數(shù)器,最大255,你可以設(shè)置16位計(jì)數(shù)器 TMOD=0x50;
回復(fù)

使用道具 舉報(bào)

ID:275826 發(fā)表于 2019-12-11 14:07 | 顯示全部樓層
TMOD=0x60;改成TMOD=0x50;吧
回復(fù)

使用道具 舉報(bào)

ID:235200 發(fā)表于 2019-12-11 14:10 | 顯示全部樓層
TL1 =1;                //設(shè)置定時(shí)初值
TH1 =1;     //設(shè)置定時(shí)重載值
這兩條的初值應(yīng)為0
要計(jì)數(shù)400次,要把TH1高8位和TL1低8位兩個(gè)8位寄存器的數(shù)據(jù)轉(zhuǎn)變?yōu)?6位的數(shù)據(jù)
如轉(zhuǎn)換結(jié)果存放count =(TH1<<8)+TL1,再用count來判斷是否400次
回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 2019-12-11 15:15 | 顯示全部樓層
定時(shí)器被你設(shè)置為8位重裝,脈沖400次后進(jìn)入中斷的初值也不對。所以最大只能設(shè)置255。示例如下:
  1. #include <reg51.h>

  2. sbit LED=P1^0;

  3. void InitTimer1(void)
  4. {
  5.         TMOD = 0x50;
  6.         TH1 = 0xFE;
  7.         TL1 = 0x70;
  8.         EA = 1;
  9.         ET1 = 1;
  10.         TR1 = 1;
  11. }

  12. void main(void)
  13. {
  14.         InitTimer1();
  15.         while(1);
  16. }

  17. void Timer1Interrupt(void) interrupt 3
  18. {
  19.         TH1 = 0xFE;
  20.         TL1 = 0x70;
  21.         LED=~LED;
  22. }
復(fù)制代碼

回復(fù)

使用道具 舉報(bào)

ID:648939 發(fā)表于 2019-12-11 16:48 | 顯示全部樓層
我現(xiàn)在設(shè)置成0x40可以計(jì)數(shù)到幾百了,就是不知道計(jì)數(shù)中斷的規(guī)則,設(shè)什么數(shù)字出什么結(jié)果。
void Timer1Init()
{
                TMOD=0x40;  //設(shè)置定時(shí)器1,采用的是計(jì)數(shù)器0,工作模式1(M1=0,M0=1)                             
        TL1 =8191;                //設(shè)置定時(shí)初值
        TH1 =8180;     //設(shè)置定時(shí)重載值
                TF1 = 0;                        //清除TF1標(biāo)志
        TR1 = 1;                        //定時(shí)器1開始計(jì)數(shù)
        EA=1;                        //開總中斷
        ET1=1;                        //開定時(shí)器1中斷   

}
回復(fù)

使用道具 舉報(bào)

ID:7485 發(fā)表于 2019-12-11 18:23 | 顯示全部樓層
計(jì)數(shù)器計(jì)到65535就滿了,再加1就會溢出,就會產(chǎn)生中斷。65536減去你設(shè)定的初值就是你需要的次數(shù)。如65536-400就是你需要的初值。16進(jìn)制就是FE6F,F(xiàn)E(254)是TH的初值,6F(111)是TL的初值。
回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 2019-12-12 09:00 | 顯示全部樓層
t20ily 發(fā)表于 2019-12-11 16:48
我現(xiàn)在設(shè)置成0x40可以計(jì)數(shù)到幾百了,就是不知道計(jì)數(shù)中斷的規(guī)則,設(shè)什么數(shù)字出什么結(jié)果。
void Timer1Init( ...

你這樣設(shè)置TMOD=0x40;定時(shí)器是13位。參見5樓完整程序的回帖。
unsigned int X;//計(jì)數(shù)范圍0~65535
void InitTimer1(void)
{
        TMOD = 0x50;//T1模式1,外部計(jì)數(shù) 0101 0000
        TH1 = (65536-X)/256;//X=計(jì)數(shù)值
        TL1 = (65536-X)%256;//X=計(jì)數(shù)值
        EA = 1;
        ET1 = 1;
        TR1 = 1;
}
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表