標(biāo)題: 單片機(jī)計(jì)數(shù)器的問(wèn)題,累計(jì)達(dá)到1000后,led顯示加一 有程序看不懂,詳細(xì)在文章里面 [打印本頁(yè)]

作者: carrots    時(shí)間: 2022-1-4 09:17
標(biāo)題: 單片機(jī)計(jì)數(shù)器的問(wèn)題,累計(jì)達(dá)到1000后,led顯示加一 有程序看不懂,詳細(xì)在文章里面
案例:基于CD4511的兩位數(shù)顯示脈沖計(jì)數(shù)器
計(jì)數(shù)器T0,工作方式0,對(duì)外部脈沖進(jìn)行計(jì)數(shù),當(dāng)外部脈沖數(shù)量達(dá)到1000后,LED顯示加一。
我就不太懂那個(gè)程序“外部脈沖數(shù)量達(dá)到1000后,LED顯示加一”,是怎么加到1000的。
是這段程序嗎?
void Counter0(void){
if(TF0==1){
TF0=0;
/*計(jì)數(shù)器初值設(shè)置*/
TH0=0xe0;
TL0=0x18;
counter++;
if(counter>=99){
counter=0;
}
}
}


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

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

}


總程序如下:(心態(tài)崩了看不懂,求大佬指點(diǎn))
  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;//全局變量,用于保存計(jì)數(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.         /*計(jì)數(shù)器初值設(shè)置*/
  20.         TH0=0xe0;//初始值設(shè)置,7192轉(zhuǎn)為13位后的高8位
  21.         TL0=0x18;//初始值設(shè)置,7192轉(zhuǎn)為13位后的低8位
  22.         /*關(guān)閉計(jì)數(shù)器中斷*/
  23.         EA=0;
  24.         ET0=0;
  25.         /*啟動(dòng)計(jì)數(shù)器*/
  26.         TR0=1;//啟動(dòng)T0

  27. }

  28. void Counter0(void){
  29.         if(TF0==1){
  30.                 TF0=0;
  31.                 /*計(jì)數(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兩個(gè)變量
  43.         x=BCD%10;//取i的個(gè)位字符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ù)制代碼






作者: 溫xyz    時(shí)間: 2022-1-4 13:50
void Counter_Init(void){
        TMOD=0x04;//工作方式的設(shè)置
        /*計(jì)數(shù)器初值設(shè)置*/
        TH0=0x1c;//初始值設(shè)置,7192轉(zhuǎn)為13位后的高8位
        TL0=0x18;//初始值設(shè)置,7192轉(zhuǎn)為13位后的低8位
        /*關(guān)閉計(jì)數(shù)器中斷*/
        EA=0;
        ET0=0;
        /*啟動(dòng)計(jì)數(shù)器*/
        TR0=1;//啟動(dòng)T0

}

這紅色地方錯(cuò)了。原理是計(jì)數(shù)到1000,TF0=1,counter就加1。13位的計(jì)數(shù)器計(jì)數(shù)范圍為8192,計(jì)數(shù)1000,需要預(yù)置7192,十六進(jìn)為0x1C18。
作者: datouyuan    時(shí)間: 2022-1-4 14:08
樓主是對(duì)定時(shí)器的工作模式0不理解,百度搜索下。
我簡(jiǎn)單說(shuō)下:
T0的值(TH0*32+TL0%32),當(dāng)定時(shí)器用時(shí),每經(jīng)過(guò)一個(gè)時(shí)鐘,該值加1.當(dāng)計(jì)數(shù)器用時(shí),每收到一個(gè)脈沖,該值加1.當(dāng)值等于8192時(shí),產(chǎn)生中斷,TF0自動(dòng)置1.

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

7192+1000=8192,所以是脈沖數(shù)量到1000,產(chǎn)生中斷。
假如定時(shí)器初值為(8192-100),那么是脈沖數(shù)量到100,產(chǎn)生中斷。
假如定時(shí)器初值為0,那么是脈沖數(shù)量到8192,產(chǎn)生中斷。
作者: datouyuan    時(shí)間: 2022-1-4 14:15
溫xyz 發(fā)表于 2022-1-4 13:50
void Counter_Init(void){
        TMOD=0x04;//工作方式的設(shè)置
        /*計(jì)數(shù)器初值設(shè)置*/

紅色地方?jīng)]錯(cuò),13位和16位計(jì)算方法不同。
請(qǐng)參考3樓帖子。
作者: carrots    時(shí)間: 2022-1-4 15:42
datouyuan 發(fā)表于 2022-1-4 14:08
樓主是對(duì)定時(shí)器的工作模式0不理解,百度搜索下。
我簡(jiǎn)單說(shuō)下:
T0的值(TH0*32+TL0%32),當(dāng)定時(shí)器用時(shí),每 ...

好的謝謝您,我再理解理解
作者: glinfei    時(shí)間: 2022-1-4 17:24
真是不懂13位的時(shí)候,為啥這么設(shè)計(jì)呢:TH的高8位,TL的低5位的計(jì)數(shù)值
作者: 188610329    時(shí)間: 2022-1-4 20:04
glinfei 發(fā)表于 2022-1-4 17:24
真是不懂13位的時(shí)候,為啥這么設(shè)計(jì)呢:TH的高8位,TL的低5位的計(jì)數(shù)值

好處是, 32個(gè)周期之后, TH就會(huì)加1,對(duì)于不開中斷,判斷時(shí)間間隔來(lái)講,只要讀取TH,就能得到一個(gè)比較好的時(shí)間間隔寬度,在單片機(jī)速度比較慢,比較追求效率的時(shí)代,13位定時(shí)器有著得天獨(dú)厚的優(yōu)勢(shì)。
作者: glinfei    時(shí)間: 2022-1-5 08:41
188610329 發(fā)表于 2022-1-4 20:04
好處是, 32個(gè)周期之后, TH就會(huì)加1,對(duì)于不開中斷,判斷時(shí)間間隔來(lái)講,只要讀取TH,就能得到一個(gè)比較好 ...

原來(lái)是這樣,還想著是原始芯片某種設(shè)計(jì)限制造成的。
作者: datouyuan    時(shí)間: 2022-1-6 10:13
glinfei 發(fā)表于 2022-1-4 17:24
真是不懂13位的時(shí)候,為啥這么設(shè)計(jì)呢:TH的高8位,TL的低5位的計(jì)數(shù)值

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





歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1