找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2229|回復(fù): 9
打印 上一主題 下一主題
收起左側(cè)

單片機計數(shù)器的問題,累計達到1000后,led顯示加一 有程序看不懂,詳細在文章里面

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:974245 發(fā)表于 2022-1-4 09:17 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
案例:基于CD4511的兩位數(shù)顯示脈沖計數(shù)器
計數(shù)器T0,工作方式0,對外部脈沖進行計數(shù),當外部脈沖數(shù)量達到1000后,LED顯示加一。
我就不太懂那個程序“外部脈沖數(shù)量達到1000后,LED顯示加一”,是怎么加到1000的。
是這段程序嗎?
void Counter0(void){
if(TF0==1){
TF0=0;
/*計數(shù)器初值設(shè)置*/
TH0=0xe0;
TL0=0x18;
counter++;
if(counter>=99){
counter=0;
}
}
}


還有這個也看不懂,返回函數(shù)是什么?
//顯示函數(shù)
void disply(unsigned char BCD){
unsigned char x,y;//定義x,y兩個變量
x=BCD%10;//取i的個位字符BCD編碼放于x中
y=BCD/10;//取i的十位字符BCD編碼放于y中

y<<=4;//x左移4位
data_buf=y|x;//返回各位與十位的組合BCD編碼并送至P2口顯示

}


總程序如下:(心態(tài)崩了看不懂,求大佬指點)
  1. #include <reg51.h>
  2. void Counter0(void);
  3. void Counter_Init(void);
  4. void disply(unsigned char BCD);
  5. sfr data_buf=0xA0;//顯示數(shù)據(jù)端口
  6. unsigned char counter;//全局變量,用于保存計數(shù)值
  7. void main()
  8. {
  9.         counter=0;
  10.         Counter_Init();
  11.         while(1){
  12.                 Counter0();
  13.                 disply(counter);
  14.         }
  15.         
  16. }

  17. void Counter_Init(void){
  18.         TMOD=0x04;//工作方式的設(shè)置
  19.         /*計數(shù)器初值設(shè)置*/
  20.         TH0=0xe0;//初始值設(shè)置,7192轉(zhuǎn)為13位后的高8位
  21.         TL0=0x18;//初始值設(shè)置,7192轉(zhuǎn)為13位后的低8位
  22.         /*關(guān)閉計數(shù)器中斷*/
  23.         EA=0;
  24.         ET0=0;
  25.         /*啟動計數(shù)器*/
  26.         TR0=1;//啟動T0

  27. }

  28. void Counter0(void){
  29.         if(TF0==1){
  30.                 TF0=0;
  31.                 /*計數(shù)器初值設(shè)置*/
  32.                 TH0=0xe0;
  33.                 TL0=0x18;
  34.                 counter++;
  35.                 if(counter>=99){
  36.                         counter=0;
  37.                 }
  38.         }
  39. }

  40. //顯示函數(shù)
  41. void disply(unsigned char BCD){
  42.         unsigned char x,y;//定義x,y兩個變量
  43.         x=BCD%10;//取i的個位字符BCD編碼放于x中
  44.         y=BCD/10;//取i的十位字符BCD編碼放于y中
  45.         
  46.         y<<=4;//x左移4位
  47.         data_buf=y|x;//返回各位與十位的組合BCD編碼并送至P2口顯示
  48.         
  49. }
復(fù)制代碼





分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:8222 發(fā)表于 2022-1-4 13:50 | 只看該作者
void Counter_Init(void){
        TMOD=0x04;//工作方式的設(shè)置
        /*計數(shù)器初值設(shè)置*/
        TH0=0x1c;//初始值設(shè)置,7192轉(zhuǎn)為13位后的高8位
        TL0=0x18;//初始值設(shè)置,7192轉(zhuǎn)為13位后的低8位
        /*關(guān)閉計數(shù)器中斷*/
        EA=0;
        ET0=0;
        /*啟動計數(shù)器*/
        TR0=1;//啟動T0

}

這紅色地方錯了。原理是計數(shù)到1000,TF0=1,counter就加1。13位的計數(shù)器計數(shù)范圍為8192,計數(shù)1000,需要預(yù)置7192,十六進為0x1C18。
回復(fù)

使用道具 舉報

板凳
ID:887371 發(fā)表于 2022-1-4 14:08 | 只看該作者
樓主是對定時器的工作模式0不理解,百度搜索下。
我簡單說下:
T0的值(TH0*32+TL0%32),當定時器用時,每經(jīng)過一個時鐘,該值加1.當計數(shù)器用時,每收到一個脈沖,該值加1.當值等于8192時,產(chǎn)生中斷,TF0自動置1.

樓主程序中
  1. TH0=0xe0;//TH0=7192/32;
  2. TL0=0x18;//TL0=7192%32;
復(fù)制代碼

7192+1000=8192,所以是脈沖數(shù)量到1000,產(chǎn)生中斷。
假如定時器初值為(8192-100),那么是脈沖數(shù)量到100,產(chǎn)生中斷。
假如定時器初值為0,那么是脈沖數(shù)量到8192,產(chǎn)生中斷。
回復(fù)

使用道具 舉報

地板
ID:887371 發(fā)表于 2022-1-4 14:15 | 只看該作者
溫xyz 發(fā)表于 2022-1-4 13:50
void Counter_Init(void){
        TMOD=0x04;//工作方式的設(shè)置
        /*計數(shù)器初值設(shè)置*/

紅色地方?jīng)]錯,13位和16位計算方法不同。
請參考3樓帖子。
回復(fù)

使用道具 舉報

5#
ID:974245 發(fā)表于 2022-1-4 15:42 | 只看該作者
datouyuan 發(fā)表于 2022-1-4 14:08
樓主是對定時器的工作模式0不理解,百度搜索下。
我簡單說下:
T0的值(TH0*32+TL0%32),當定時器用時,每 ...

好的謝謝您,我再理解理解
回復(fù)

使用道具 舉報

6#
ID:844772 發(fā)表于 2022-1-4 17:24 | 只看該作者
真是不懂13位的時候,為啥這么設(shè)計呢:TH的高8位,TL的低5位的計數(shù)值
回復(fù)

使用道具 舉報

7#
ID:624769 發(fā)表于 2022-1-4 20:04 | 只看該作者
glinfei 發(fā)表于 2022-1-4 17:24
真是不懂13位的時候,為啥這么設(shè)計呢:TH的高8位,TL的低5位的計數(shù)值

好處是, 32個周期之后, TH就會加1,對于不開中斷,判斷時間間隔來講,只要讀取TH,就能得到一個比較好的時間間隔寬度,在單片機速度比較慢,比較追求效率的時代,13位定時器有著得天獨厚的優(yōu)勢。
回復(fù)

使用道具 舉報

8#
ID:844772 發(fā)表于 2022-1-5 08:41 | 只看該作者
188610329 發(fā)表于 2022-1-4 20:04
好處是, 32個周期之后, TH就會加1,對于不開中斷,判斷時間間隔來講,只要讀取TH,就能得到一個比較好 ...

原來是這樣,還想著是原始芯片某種設(shè)計限制造成的。
回復(fù)

使用道具 舉報

9#
ID:887371 發(fā)表于 2022-1-6 10:13 | 只看該作者
glinfei 發(fā)表于 2022-1-4 17:24
真是不懂13位的時候,為啥這么設(shè)計呢:TH的高8位,TL的低5位的計數(shù)值

單片機的AD也是類似設(shè)計。
高8位AD占用一個字節(jié),10位AD的低2位,12位AD的低4位占用一個字節(jié)。
如需要8位精度只需讀高8位,提高了效率。
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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