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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

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

關(guān)于51單片機(jī)計(jì)脈沖程序問(wèn)題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:216579 發(fā)表于 2024-6-28 15:54 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
#include <reg51.h>
#include <intrins.h>
#include "display.h"
sbit LED=P1^0;
void Timer0Init(void);
void EX0_Init();
void EX1_Init();
void display_Service();
unsigned int numCnt=0;                //用于存放要顯示的脈沖數(shù)
unsigned char flag;
unsigned char temp0;
unsigned char temp1;
unsigned char temp2;
unsigned char temp3;
void main()
{
                Timer0Init();
                EX0_Init();
                EX1_Init();
                EA=1;   //中斷總開(kāi)關(guān)
        
        while(1)               
        {

   }
}
void display_Service()
{
        temp0=numCnt/1000;
        temp1=numCnt/100%10;
        temp2=numCnt/10%10;
        temp3=numCnt%10;
        if(numCnt<1000)
                LEDBuf[0]=12;
        else
                LEDBuf[0]=temp0;
        if(numCnt<100)
                LEDBuf[1]=12;
                else
                LEDBuf[1]=temp1;
                        if(numCnt<10)
                LEDBuf[2]=12;
                else
                LEDBuf[2]=temp2;
                LEDBuf[3]=temp3;
               
}
void EX0_Init()
{
        IT0=1;
        EX0=1;
}
void EX1_Init()
{
        IT1=1;
        EX1=1;
}
void Timer0Init(void)                //1毫秒@12.000MHz
{
        
        TMOD &= 0xF0;                //設(shè)置定時(shí)器模式
        TMOD |= 0x01;                //設(shè)置定時(shí)器模式
        TL0 = 0x18;                //設(shè)置定時(shí)初值
        TH0 = 0xFC;                //設(shè)置定時(shí)初值
        TF0 = 0;                //清除TF0標(biāo)志
        ET0=1;   //中斷定時(shí)器0的開(kāi)關(guān)

        TR0 = 1;                //定時(shí)器0開(kāi)始計(jì)時(shí)
}

// void Timer1Init(void)                //50毫秒@12.000MHz
// {
//         TMOD &= 0x0F;                //設(shè)置定時(shí)器模式
//         TMOD |= 0x10;                //設(shè)置定時(shí)器模式
//         TL1 = 0xB0;                //設(shè)置定時(shí)初值
//         TH1 = 0x3C;                //設(shè)置定時(shí)初值
//         ET1=1;
//         TF1 = 0;                //清除TF1標(biāo)志
//         TR1 = 1;                //定時(shí)器1開(kāi)始計(jì)時(shí)
// }

/*******************************************
1、中斷服務(wù)函數(shù)一定是一個(gè)沒(méi)有返回值函數(shù)
2、中斷服務(wù)函數(shù)一定是沒(méi)有參數(shù)的函數(shù)
3、中斷服務(wù)函數(shù)函數(shù)名后要跟關(guān)鍵字 interrupt n
4、interrupt n 0-4   8*n+0003H   0003H   INT0
000BH T0 0013H INT1  001BH TI  0023H ES
5、中服務(wù)函數(shù)不能被主程序或其他程序調(diào)用
6、n 后面跟 using m(0-3)工作寄存器組
*******************************************/
void timer0_ISR(void) interrupt 1
{
        TR0=0;   //定時(shí)器0關(guān)閉
        Display();
        TL0 = 0x18;                //重新定時(shí)初值
        TH0 = 0xFC;                //設(shè)置定時(shí)初值
        TR0=1; //定時(shí)器0開(kāi)始計(jì)時(shí)
}
void EX0_ISR() interrupt 0
{
        EX0=0;
        numCnt++;
        if(numCnt>=9999)
                numCnt=0;
        EX0=1;

}
void EX1_ISR() interrupt 2
{
        EX1=0;
        flag=1;
        display_Service();
        numCnt=0;                          //實(shí)現(xiàn)數(shù)碼管清零操作
        EX1=1;
}



問(wèn)題一:程序跑的頻率比較低,超過(guò)5K的信號(hào)無(wú)顯示
問(wèn)題二:跑出來(lái)計(jì)的脈沖數(shù)不準(zhǔn)確

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

使用道具 舉報(bào)

沙發(fā)
ID:866313 發(fā)表于 2024-6-29 08:10 | 只看該作者
您的代碼遇到了性能和脈沖計(jì)數(shù)準(zhǔn)確性的問(wèn)題,這是由于中斷和定時(shí)器處理方式所致。以下是一些洞察和建議,以解決這些問(wèn)題:
問(wèn)題分析
  • 低頻問(wèn)題:
    • 主要問(wèn)題是,您的定時(shí)器中斷服務(wù)例程(ISR)每1毫秒被調(diào)用一次。如果ISR內(nèi)的處理時(shí)間過(guò)長(zhǎng),可能會(huì)錯(cuò)過(guò)一些脈沖,如果它們的發(fā)生頻率高于ISR執(zhí)行時(shí)間。

  • 脈沖計(jì)數(shù)準(zhǔn)確性:
    • 脈沖計(jì)數(shù)不準(zhǔn)確可能源于多個(gè)因素,包括中斷服務(wù)例程的觸發(fā)時(shí)間以及在ISRs中禁用中斷。這可能導(dǎo)致如果在中斷被禁用的同時(shí)新脈沖到達(dá),就會(huì)錯(cuò)過(guò)脈沖。


解決步驟1. 優(yōu)化ISR執(zhí)行時(shí)間
盡量減少I(mǎi)SR中的代碼,以確保它能夠盡快執(zhí)行。例如,在timer0_ISR中不要調(diào)用顯示函數(shù),而是在主循環(huán)中設(shè)置一個(gè)標(biāo)志并處理顯示更新。
bit displayUpdateFlag = 0;

void timer0_ISR(void) interrupt 1
{
     TR0 = 0;  // 停止Timer0
     displayUpdateFlag = 1;
     TL0 = 0x18; // 重置Timer0初始值
     TH0 = 0xFC;
     TR0 = 1;  // 重新啟動(dòng)Timer0
}
在主循環(huán)中檢查這個(gè)標(biāo)志,并在需要時(shí)調(diào)用顯示更新函數(shù):
void main()
{
     Timer0Init();
     EX0_Init();
     EX1_Init();
     EA = 1;  // 啟用全局中斷

     while (1)
     {
         if (displayUpdateFlag)
         {
             displayUpdateFlag = 0;
             display_Service();
         }
     }
}2. 確保脈沖計(jì)數(shù)準(zhǔn)確
盡可能短暫地禁用和重新啟用你的ISRs中的中斷,以防錯(cuò)過(guò)脈沖。
void EX0_ISR() interrupt 0
{
     numCnt++;
     if (numCnt >= 9999)
         numCnt = 0;
}
注意,在其ISR中無(wú)需禁用EX0,因?yàn)檫M(jìn)入ISR時(shí)中斷標(biāo)志會(huì)自動(dòng)清除。這減少了中斷被禁用的時(shí)間。
3. 高效使用Timer0
定時(shí)器ISR應(yīng)僅負(fù)責(zé)基于時(shí)間的任務(wù),而不是處理復(fù)雜操作如更新顯示。
最終代碼調(diào)整
以下是根據(jù)上述建議修改后的代碼:
#include <reg51.h>
#include "display.h"

sbit LED = P1^0;

void Timer0Init(void);
void EX0_Init();
void EX1_Init();
void display_Service();

unsigned int numCnt = 0; // 用于存儲(chǔ)要顯示的脈沖數(shù)量
bit displayUpdateFlag = 0;
unsigned char temp0, temp1, temp2, temp3;

void main()
{
     Timer0Init();
     EX0_Init();
     EX1_Init();
     EA = 1; // 啟用全局中斷

     while (1)
     {
         if (displayUpdateFlag)
         {
             displayUpdateFlag = 0;
             display_Service();
         }
     }
}

void display_Service()
{
     temp0 = numCnt / 1000;
     temp1 = (numCnt / 100) % 10;
     temp2 = (numCnt / 10) % 10;
     temp3 = numCnt % 10;

     LEDBuf[1] = (numCnt < 1000)? 12 : temp0;
     LEDBuf[2] = (numCnt < 100)? 12 : temp1;
     LEDBuf[3] = (numCnt < 10)? 12 : temp2;
     LEDBuf[4] = temp3;
}

void EX0_Init()
{
     IT0 = 1; // 邊緣觸發(fā)中斷
     EX0 = 1; // 啟用EX0
}

void EX1_Init()
{
     IT1 = 1; // 邊緣觸發(fā)中斷
     EX1 = 1; // 啟用EX1
}

void Timer0Init(void) // 1ms @ 12.000MHz
{
     TMOD &= 0xF0; // 設(shè)置定時(shí)器模式
     TMOD |= 0x01; // 設(shè)置定時(shí)器模式
     TL0 = 0x18; // 設(shè)置初始定時(shí)器值
     TH0 = 0xFC; // 設(shè)置初始定時(shí)器值
     TF0 = 0; // 清除TF0標(biāo)志
     ET0 = 1; // 啟用Timer0中斷
     TR0 = 1; // 啟動(dòng)Timer0
}

void timer0_ISR(void) interrupt 1
{
     TR0 = 0; // 停止Timer0
     displayUpdateFlag = 1; // 設(shè)置標(biāo)志以更新顯示
     TL0 = 0x18; // 重置Timer0初始值
     TH0 = 0xFC;
     TR0 = 1; // 重新啟動(dòng)Timer0
}

void EX0_ISR() interrupt 0
{
     numCnt++;
     if (numCnt >= 9999)
         numCnt = 0;
}

void EX1_ISR() interrupt 2
{
     flag = 1;
     display_Service();
     numCnt = 0; // 清除計(jì)數(shù)以重置顯示
}
這應(yīng)該提高了嵌入式系統(tǒng)的性能和準(zhǔn)確性,確保它能處理更高頻率的信號(hào)并更準(zhǔn)確地計(jì)數(shù)脈沖。

回復(fù)

使用道具 舉報(bào)

板凳
ID:232693 發(fā)表于 2024-6-29 09:47 | 只看該作者
如果要調(diào)整占空比,那就調(diào)整PWM4DUTY和占空比那高位的重載值 ,有一點(diǎn)要注意就是占空比的值不能大于TMR4的重載值,不然就是一直有效電平了。如果把TM34RH=0,PWM4DUTY=占空比了嗎?   如果要調(diào)整頻率,那就是調(diào)整分頻比和TMR4重載值。 TMR3 重載值=100,向下計(jì)數(shù)的話,是不是我頻率是1us,這里就是100us?但是我要調(diào)成紅外發(fā)射頻率38KHz,也就是TMR3=26us的話,又和上面的注意事項(xiàng)沖突了。
回復(fù)

使用道具 舉報(bào)

地板
ID:1109793 發(fā)表于 2024-6-29 10:35 | 只看該作者
不知道你的準(zhǔn)確意圖,看起來(lái)脈沖是接外中斷0,外中斷1是清零。如果不清零就一直在0-9999之間循環(huán)。顯示一直在更新,是啥意思,如果脈沖速度很快,可能都看不清了。超過(guò)5K的信號(hào)無(wú)顯示是說(shuō)的頻率,還是計(jì)數(shù)值達(dá)到5000以后就不顯示了?脈沖的頻率是多少?外中斷采集脈沖比較容易受到干擾,使計(jì)數(shù)值變大。但是你使用的是外中斷0,是最高優(yōu)先,大概率不會(huì)有丟脈沖的情況。
回復(fù)

使用道具 舉報(bào)

5#
ID:161164 發(fā)表于 2024-6-29 14:51 | 只看該作者
一:不要用外部中斷,用定時(shí)器的計(jì)數(shù)模式
二: 同上
回復(fù)

使用道具 舉報(bào)

6#
ID:216579 發(fā)表于 2024-6-29 17:00 | 只看該作者
xiaobendan001 發(fā)表于 2024-6-29 10:35
不知道你的準(zhǔn)確意圖,看起來(lái)脈沖是接外中斷0,外中斷1是清零。如果不清零就一直在0-9999之間循環(huán)。顯示一直 ...

程序的主要原理就是測(cè)編碼器轉(zhuǎn)一圈測(cè)試實(shí)際的脈沖數(shù),有個(gè)零位是起始到終止的總脈沖數(shù),然后在顯示函數(shù)里顯示,可能顯示函數(shù)放到中斷了造成顯示過(guò)快,是不是要把顯示函數(shù)放到MAIN函數(shù)下面?
回復(fù)

使用道具 舉報(bào)

7#
ID:1109793 發(fā)表于 2024-6-29 18:14 | 只看該作者
guhuawei19 發(fā)表于 2024-6-29 17:00
程序的主要原理就是測(cè)編碼器轉(zhuǎn)一圈測(cè)試實(shí)際的脈沖數(shù),有個(gè)零位是起始到終止的總脈沖數(shù),然后在顯示函數(shù)里 ...

你的顯示數(shù)據(jù)只在外中斷1里面更新一次的,就是計(jì)數(shù)過(guò)程看不到,清零時(shí)才能看到?
回復(fù)

使用道具 舉報(bào)

8#
ID:1109793 發(fā)表于 2024-6-30 07:37 | 只看該作者
ZCF03 發(fā)表于 2024-6-29 19:08
不知道你的準(zhǔn)確意圖,看起來(lái)脈沖是接外中斷0,外中斷1是清零。如果不清零就一直在0-9999之間循環(huán)。顯示一直 ...

干嘛要抄啊,賺個(gè)積分不容易。刪除幾個(gè)字比較容易是吧
回復(fù)

使用道具 舉報(bào)

9#
ID:216579 發(fā)表于 2024-7-1 07:56 | 只看該作者
xiaobendan001 發(fā)表于 2024-6-29 18:14
你的顯示數(shù)據(jù)只在外中斷1里面更新一次的,就是計(jì)數(shù)過(guò)程看不到,清零時(shí)才能看到?

不需要一直更新顯示,只需要讀出最后的脈沖數(shù),然后顯示在數(shù)碼管上,比如500脈沖只要顯示500,不需要顯示增加的過(guò)程
回復(fù)

使用道具 舉報(bào)

10#
ID:216579 發(fā)表于 2024-7-1 09:51 | 只看該作者
xiaobendan001 發(fā)表于 2024-6-29 10:35
不知道你的準(zhǔn)確意圖,看起來(lái)脈沖是接外中斷0,外中斷1是清零。如果不清零就一直在0-9999之間循環(huán)。顯示一直 ...

while(1)               
        {
        if(flag==1)
        {
        DelayXms(100);
                 display_Service();
       
        }
改成這樣能否正常顯示
回復(fù)

使用道具 舉報(bào)

11#
ID:1109793 發(fā)表于 2024-7-1 11:41 | 只看該作者
DelayXms(100);的意圖是什么啊?
回復(fù)

使用道具 舉報(bào)

12#
ID:1109793 發(fā)表于 2024-7-1 13:03 | 只看該作者
guhuawei19 發(fā)表于 2024-7-1 07:56
不需要一直更新顯示,只需要讀出最后的脈沖數(shù),然后顯示在數(shù)碼管上,比如500脈沖只要顯示500,不需要顯示 ...

這意思是外中斷1是接在編碼器的Z相了?
回復(fù)

使用道具 舉報(bào)

13#
ID:216579 發(fā)表于 2024-7-1 16:26 | 只看該作者
xiaobendan001 發(fā)表于 2024-7-1 11:41
DelayXms(100);的意圖是什么啊?

不加延時(shí)的話,進(jìn)一次中斷就顯示一次速度太快了吧?會(huì)顯示不清楚吧
回復(fù)

使用道具 舉報(bào)

14#
ID:216579 發(fā)表于 2024-7-1 16:27 | 只看該作者
xiaobendan001 發(fā)表于 2024-7-1 13:03
這意思是外中斷1是接在編碼器的Z相了?

是的,中斷1接到Z相
回復(fù)

使用道具 舉報(bào)

15#
ID:1109793 發(fā)表于 2024-7-2 07:16 | 只看該作者
guhuawei19 發(fā)表于 2024-7-1 16:26
不加延時(shí)的話,進(jìn)一次中斷就顯示一次速度太快了吧?會(huì)顯示不清楚吧

無(wú)論調(diào)用多少次顯示,都只是在Z相信號(hào)到來(lái)時(shí)的瞬間才更新顯示,其余時(shí)間都是在現(xiàn)實(shí)之前的內(nèi)容,所以從視覺(jué)上是看不到的。
比如我在研究TM1650的時(shí)候,顯示在主循環(huán),顯示內(nèi)容是定時(shí)器,1秒變一次,主循環(huán)在1秒里面不知道循環(huán)了多少次了,顯示依舊穩(wěn)定的很。
可惜1650的按鍵掃描太慢了,做不了編碼器。
回復(fù)

使用道具 舉報(bào)

16#
ID:216579 發(fā)表于 2024-7-2 10:45 | 只看該作者
xiaobendan001 發(fā)表于 2024-7-2 07:16
無(wú)論調(diào)用多少次顯示,都只是在Z相信號(hào)到來(lái)時(shí)的瞬間才更新顯示,其余時(shí)間都是在現(xiàn)實(shí)之前的內(nèi)容,所以從視 ...

那使用脈沖計(jì)數(shù)呢
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久久毛片 | 爱综合 | 亚洲一区二区三区四区五区中文 | 亚洲精品9999 | 综合色播 | 国产精品视频网 | 日韩一区二区三区在线观看 | av中文在线| 欧美日韩亚洲视频 | 成人1区2区 | 91色站 | 免费的av网站| 91精品国产日韩91久久久久久 | 久久久久久亚洲精品 | 日韩一区二区三区在线 | 夜夜骑天天干 | 在线视频一区二区 | 国产一区久久精品 | 成人午夜影院 | 国产精品久久久久久吹潮 | 成人在线电影在线观看 | 日韩精品一区二区三区中文字幕 | 欧美一卡二卡在线 | 一区二区三区在线播放视频 | www日本在线播放 | 免费成人高清在线视频 | 日本成人中文字幕在线观看 | 免费黄色av | 欧美中文一区 | 欧美日韩一区二区三区在线观看 | 福利精品在线观看 | 看一级黄色毛片 | 国产亚洲精品久久yy50 | 这里只有精品999 | www.亚洲 | 国产精品观看 | 99riav3国产精品视频 | 免费中文字幕 | 亚洲精品久久久蜜桃 | 国产美女一区二区 | 91九色网站 |