久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機(jī)計數(shù)器程序問題請教

[復(fù)制鏈接]
ID:1005338 發(fā)表于 2022-4-24 21:55 | 顯示全部樓層 |閱讀模式
我用計數(shù)器0對直流減速電機(jī)編碼器計數(shù),編碼器每651個脈沖代表電機(jī)轉(zhuǎn)動一圈,主函數(shù)通過計數(shù)器0的溢出標(biāo)志位TR0變?yōu)?的次數(shù),對電機(jī)的圈數(shù)進(jìn)行累加、顯示,但不知為什么,顯示一直都是零,是計數(shù)器0一直就沒有觸發(fā)中斷?還是程序設(shè)計有問題?求高手指點(diǎn)指點(diǎn),謝謝!
單片機(jī)源程序如下:
#include "reg52.h"

typedef unsigned int u16;        //對系統(tǒng)默認(rèn)數(shù)據(jù)類型進(jìn)行重定義
typedef unsigned char u8;

//定義LED1管腳
sbit LED1=P2^0;

#define SMG_A_DP_PORT        P0        //使用宏定義數(shù)碼管段碼口

//定義數(shù)碼管位選信號控制腳
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;



/*******************************************************************************
* 函 數(shù) 名       : delay_10us
* 函數(shù)功能                 : 延時函數(shù),ten_us=1時,大約延時10us
* 輸    入       : ten_us
* 輸    出             : 無
*******************************************************************************/
void delay_10us(u16 ten_us)
{
        while(ten_us--);      
}

//共陰極數(shù)碼管顯示0~F的段碼數(shù)據(jù)
u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                                0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};


/*******************************************************************************
* 函 數(shù) 名       : smg_display
* 函數(shù)功能                 : 動態(tài)數(shù)碼管顯示
* 輸    入       : 無
* 輸    出             : 無
*******************************************************************************/
void smg_display(u8 dat[])
{
        u8 i=0;

        for(i=0;i<8;i++)
        {
                   switch(i)//位選
                {
                        case 0: LSC=1;LSB=1;LSA=1;SMG_A_DP_PORT=gsmg_code[dat[0]];break;
                        case 1: LSC=1;LSB=1;LSA=0;SMG_A_DP_PORT=gsmg_code[dat[1]];break;
                        case 2: LSC=1;LSB=0;LSA=1;SMG_A_DP_PORT=gsmg_code[dat[2]];break;
                        case 3: LSC=1;LSB=0;LSA=0;SMG_A_DP_PORT=gsmg_code[dat[3]];break;
                        case 4: LSC=0;LSB=1;LSA=1;SMG_A_DP_PORT=gsmg_code[dat[4]];break;
                        case 5: LSC=0;LSB=1;LSA=0;SMG_A_DP_PORT=gsmg_code[dat[5]];break;
                        case 6: LSC=0;LSB=0;LSA=1;SMG_A_DP_PORT=gsmg_code[dat[6]];break;
                        case 7: LSC=0;LSB=0;LSA=0;SMG_A_DP_PORT=gsmg_code[dat[7]];break;
                }
                delay_10us(20);//延時一段時間,等待顯示穩(wěn)定
                SMG_A_DP_PORT=0x00;//消音
        }
}


/*******************************************************************************
* 函 數(shù) 名       : time0_init
* 函數(shù)功能                 : 定時器0中斷配置函數(shù),通過設(shè)置TH和TL即可確定定時時間
* 輸    入       : 無
* 輸    出             : 無
*******************************************************************************/
void counter0_init(void)
{
        TMOD|=0X05;//選擇為計數(shù)器0模式,工作方式1
        TH0=0XFD;        //給計數(shù)器賦初值
        TL0=0X71;      
        ET0=1;//打開計數(shù)器0中斷允許
        EA=1;//打開總中斷
        TR0=1;//打開計數(shù)器
        IT0=0;//下降沿觸發(fā)               
}

/*******************************************************************************
* 函 數(shù) 名       : main
* 函數(shù)功能                 : 主函數(shù)
* 輸    入       : 無
* 輸    出             : 無
*******************************************************************************/
void main()
{      
        u16 roll;
        u8 rollb8[8];

        counter0_init();//計數(shù)器0中斷配置

        while(1)
        {                       
                if(TF0==1)
                {
                        roll++;
                        TF0=0;
                }
                rollb8[3]=roll/10000;                        //讀取萬位數(shù)
                rollb8[4]=roll%10000/1000;                //讀取千位數(shù)
                rollb8[5]=roll%1000/100;                  //讀取百位數(shù)
                rollb8[6]=roll%100/10;                           //讀取十位數(shù)
                rollb8[7]=roll%10;                                     //讀取個位數(shù)
                smg_display(rollb8);                        //調(diào)用數(shù)碼管顯示
                                               
        }               
}

void conter0() interrupt 1 //定時器0中斷函數(shù)
{
        TH0=0XFD;        //給計數(shù)器賦初值
        TL0=0X71;
}
回復(fù)

使用道具 舉報

ID:1005338 發(fā)表于 2022-4-24 22:28 | 顯示全部樓層
調(diào)試后發(fā)現(xiàn),確定是計數(shù)器0溢出后,TF0不會自動置1,這到底是什么原因?
回復(fù)

使用道具 舉報

ID:624769 發(fā)表于 2022-4-24 22:58 來自手機(jī) | 顯示全部樓層
你開了中斷,tf0會自動清0,你要做個標(biāo)志位,在中斷里置1,然后主程序判斷這個標(biāo)志位。
回復(fù)

使用道具 舉報

ID:1005338 發(fā)表于 2022-4-24 23:41 | 顯示全部樓層
188610329 發(fā)表于 2022-4-24 22:58
你開了中斷,tf0會自動清0,你要做個標(biāo)志位,在中斷里置1,然后主程序判斷這個標(biāo)志位。

不好意思,我是初學(xué),沒太理解你的意思,請您再幫忙指點(diǎn)一下:
先開的中斷,然后開始while死循環(huán),等待計數(shù)器溢出,溢出后TF0不就應(yīng)該自動置1嗎?TF0不就是溢出的標(biāo)志位嗎?
回復(fù)

使用道具 舉報

ID:624769 發(fā)表于 2022-4-25 00:07 來自手機(jī) | 顯示全部樓層
niejiangong 發(fā)表于 2022-4-24 23:41
不好意思,我是初學(xué),沒太理解你的意思,請您再幫忙指點(diǎn)一下:
先開的中斷,然后開始while死循環(huán),等待 ...

tf0==1之后,就會立刻執(zhí)行中斷程序,中斷程序會自動清0標(biāo)志tf0,即,你只要開了定時器0的中斷,你就永遠(yuǎn)讀不到tf0==1。tf會等于1一瞬間,但是你永遠(yuǎn)看不到,當(dāng)你去判斷的時候,tf0一定已經(jīng)變0了,明白了么?
回復(fù)

使用道具 舉報

ID:1005338 發(fā)表于 2022-4-25 12:03 | 顯示全部樓層
188610329 發(fā)表于 2022-4-25 00:07
tf0==1之后,就會立刻執(zhí)行中斷程序,中斷程序會自動清0標(biāo)志tf0,即,你只要開了定時器0的中斷,你就永遠(yuǎn) ...

非常感謝您的耐心指點(diǎn)!我還有疑惑:
一、既然開了定時器0的中斷,無法讀到TF0==1,那這個TF0標(biāo)志位不是失去存在的意義了嗎?
二、有沒有什么辦法來利用這個TF0標(biāo)志位呢?
三、如果TF0不能用,通常用哪個寄存器來做標(biāo)志位比較好?是不是需要定義一個全局變量?
回復(fù)

使用道具 舉報

ID:213173 發(fā)表于 2022-4-25 14:35 | 顯示全部樓層
niejiangong 發(fā)表于 2022-4-25 12:03
非常感謝您的耐心指點(diǎn)!我還有疑惑:
一、既然開了定時器0的中斷,無法讀到TF0==1,那這個TF0標(biāo)志位不是 ...

使用定時器分查詢方式和中斷方式。如果用查詢方式,TF0是要軟件清0。使用中斷方式TF0由硬件自動清0。兩者不可以同時使用。在樓主此應(yīng)用中不宜使用查詢方式。因為電機(jī)轉(zhuǎn)速可能超過主循環(huán)周期,就有可能丟失數(shù)據(jù)。給你把程序改了,你試試。
  1. #include "reg52.h"

  2. typedef unsigned int u16;        //對系統(tǒng)默認(rèn)數(shù)據(jù)類型進(jìn)行重定義
  3. typedef unsigned char u8;

  4. //定義LED1管腳
  5. sbit LED1=P2^0;

  6. #define SMG_A_DP_PORT P0        //使用宏定義數(shù)碼管段碼口

  7. //定義數(shù)碼管位選信號控制腳
  8. sbit LSA=P2^2;
  9. sbit LSB=P2^3;
  10. sbit LSC=P2^4;

  11. //共陰極數(shù)碼管顯示0~F的段碼數(shù)據(jù)
  12. u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  13.                   0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
  14. u16 count=0;
  15. u8  rollb8[8];
  16. /*******************************************************************************
  17. * 函 數(shù) 名       : delay_10us
  18. * 函數(shù)功能       : 延時函數(shù),ten_us=1時,大約延時10us
  19. * 輸    入       : ten_us
  20. * 輸    出       : 無
  21. *******************************************************************************/
  22. /*
  23. void delay_10us(u16 ten_us)
  24. {
  25.         while(ten_us--);      
  26. }*/
  27. /*******************************************************************************
  28. * 函 數(shù) 名       : smg_display
  29. * 函數(shù)功能       : 動態(tài)數(shù)碼管顯示
  30. * 輸    入       : 無
  31. * 輸    出       : 無
  32. *******************************************************************************/
  33. void smg_display()
  34. {
  35.         static u8 i=0;
  36.         u8 j=0;
  37.         u16 k;//緩沖變量
  38.         k=count;       
  39.         for(j=0;j<5;j++)
  40.         {
  41.                 rollb8[j]=k%10;//由低位到高位分解保存
  42.                 k/=10;
  43.         }
  44.         SMG_A_DP_PORT=0x00;//段消隱
  45.         P2&=0xe3;//位清除
  46.         P2|=i<<2;//送位碼
  47.         SMG_A_DP_PORT=gsmg_code[rollb8[i]];//送段碼
  48.         i=++i%5;//循環(huán)計數(shù)
  49. }
  50. /*******************************************************************************
  51. * 函 數(shù) 名       : time0_init
  52. * 函數(shù)功能       : 定時器0中斷配置函數(shù),通過設(shè)置TH和TL即可確定定時時間
  53. * 輸    入       : 無
  54. * 輸    出       : 無
  55. *******************************************************************************/
  56. void counter0_init(void)
  57. {
  58.         TMOD|=0X05;//選擇為計數(shù)器0模式,工作方式1
  59.         TH0=0XFD;  //給計數(shù)器賦初值65536-651
  60.         TL0=0X75;      
  61.         TF0=0;
  62.         TR0=1;        //打開計數(shù)器
  63.         ET0=1;        //打開計數(shù)器0中斷允許
  64.         EA=1;        //打開總中斷
  65. //        IT0=0;        //下降沿觸發(fā)               
  66. }
  67. /*******************************************************************************
  68. * 函 數(shù) 名       : main
  69. * 函數(shù)功能       : 主函數(shù)
  70. * 輸    入       : 無
  71. * 輸    出       : 無
  72. *******************************************************************************/
  73. void main()
  74. {      
  75.         counter0_init();//計數(shù)器0中斷配置
  76.         while(1)
  77.         {                       
  78.                 smg_display();
  79.         }
  80. }

  81. void conter0() interrupt 1 //定時器0中斷函數(shù)
  82. {
  83.         TH0=0xfd;        //給計數(shù)器賦初值
  84.         TL0=0x75;
  85.         count++;
  86.         if(count>50000)//限制最大數(shù)
  87.                 count=0;
  88. }
復(fù)制代碼




回復(fù)

使用道具 舉報

ID:624769 發(fā)表于 2022-4-25 14:52 來自手機(jī) | 顯示全部樓層
niejiangong 發(fā)表于 2022-4-25 12:03
非常感謝您的耐心指點(diǎn)!我還有疑惑:
一、既然開了定時器0的中斷,無法讀到TF0==1,那這個TF0標(biāo)志位不是 ...

1)  tf0標(biāo)志,是定時器中斷觸發(fā)的重要標(biāo)志,怎么會沒有意義?
2) 你不開中斷(et0=0),就能讀到tf0==1了。
3) 在板凳的回復(fù)已經(jīng)說了,聲明一個全局標(biāo)志位,在中斷里置1,主程序里面判斷這個標(biāo)志來取代判斷tf0。
回復(fù)

使用道具 舉報

ID:1005338 發(fā)表于 2022-4-25 17:21 | 顯示全部樓層
wulin 發(fā)表于 2022-4-25 14:35
使用定時器分查詢方式和中斷方式。如果用查詢方式,TF0是要軟件清0。使用中斷方式TF0由硬件自動清0。兩者 ...

我試了一下,完全正確!水平太高了。
回復(fù)

使用道具 舉報

ID:149451 發(fā)表于 2022-4-26 17:18 | 顯示全部樓層
wulin 發(fā)表于 2022-4-25 14:35
使用定時器分查詢方式和中斷方式。如果用查詢方式,TF0是要軟件清0。使用中斷方式TF0由硬件自動清0。兩者 ...

菜鳥暈了,求指點(diǎn)。
樓主說是“對直流減速電機(jī)編碼器計數(shù)”,那么旋轉(zhuǎn)編碼端子沒定義,是因為用了“TMOD|=0X05;//選擇為計數(shù)器0模式,工作方式1”,編碼器端子自然要接入P3.2,不用在程序里表明了?
回復(fù)

使用道具 舉報

ID:161164 發(fā)表于 2022-4-27 11:52 | 顯示全部樓層
w1179benp 發(fā)表于 2022-4-26 17:18
菜鳥暈了,求指點(diǎn)。
樓主說是“對直流減速電機(jī)編碼器計數(shù)”,那么旋轉(zhuǎn)編碼端子沒定義,是因為用了“TMOD ...

P3.4才對 2022-04-27_115125.png

回復(fù)

使用道具 舉報

ID:1005338 發(fā)表于 2022-5-22 12:56 | 顯示全部樓層
w1179benp 發(fā)表于 2022-4-26 17:18
菜鳥暈了,求指點(diǎn)。
樓主說是“對直流減速電機(jī)編碼器計數(shù)”,那么旋轉(zhuǎn)編碼端子沒定義,是因為用了“TMOD ...

編碼器的端子直接接入P3.4,不用表明
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日韩久久久久久 | 国产精品性做久久久久久 | 日本成人久久 | 精品免费国产 | 四虎影音| 国产精品久久久久久久久图文区 | 欧美aaa | 天堂va在线观看 | 狠狠久 | 欧美一级黑人aaaaaaa做受 | 福利片在线观看 | 久久精品国产一区二区三区不卡 | 久久青草av | 一区欧美 | 国产日韩久久 | 久久久精彩视频 | 九九热这里只有精品6 | 精国产品一区二区三区 | 国产 欧美 日韩 一区 | 欧美1区2区 | 亚洲综合在线视频 | 久久精品久久综合 | 亚洲精品久久久久久一区二区 | 久久婷婷国产香蕉 | 国产精品美女久久久久aⅴ国产馆 | 久久精品小视频 | 91精品无人区卡一卡二卡三 | 欧美亚洲一区二区三区 | 毛片免费看的 | 一区二区三区四区国产 | 999热在线视频 | 91精品久久久久久久久久入口 | 亚洲一区视频在线 | 国产视频第一页 | 国内激情av片| 亚洲福利在线观看 | 亚洲一区二区av | 精品国产91| 一区二区三区四区不卡视频 | 精品二区视频 | 日韩视频免费看 |