欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3937|回復: 9
打印 上一主題 下一主題
收起左側

51單片機用定時器后數碼管亂跳,麻煩各位大佬指點

[復制鏈接]
跳轉到指定樓層
樓主
ID:842537 發表于 2020-12-13 14:09 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
代碼如下,沒用定時器數碼管正常顯示溫度,用定時器后亂跳(定時器用來調節占空比調速,做的是一個溫控風扇,部分函數省略)
麻煩各位大佬指點,萬分感謝

#include "reg52.h"                         
#include"temp.h"       

typedef unsigned int u16;
typedef unsigned char u8;

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit IN1=P3^0;
sbit IN2=P3^1;
sbit ENA=P3^2;


u8 DisplayData[8];
u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uint n;
uchar time;
uint flag=100;
bit flag1s=0;

void delay(u16 i)//延時函數,i=1時,大約延時10us
{
        while(i--);       
}



void datapros(int temp) //溫度讀取處理         
{
           float tp;  
        if(temp< 0)                                //當溫度值為負數
          {
                DisplayData[0] = 0x40;           //   第一位數碼管顯示負號
                //因為讀取的溫度是實際溫度的補碼,所以減1,再取反求出原碼
                temp=temp-1;
                temp=~temp;
                tp=temp;
                temp=tp*0.0625*100+0.5;       
                //留兩個小數點就*100,+0.5是四舍五入
          }
        else
          {                       
                DisplayData[0] = 0x00;
                tp=temp;//如果溫度為正,讀取的溫度為其本身               
                temp=tp*0.0625*100+0.5;       
        }
        DisplayData[1] = smgduan[temp % 10000 / 1000];
        DisplayData[2] = smgduan[temp % 1000 / 100]|0x80;//顯示小數點
        DisplayData[3] = smgduan[temp %  100 / 10];
        DisplayData[4] = smgduan[temp %  10 / 1];

        if(temp>1400){
        n=100;}
        else{n=50;}
       
}


/*******************************************************************************
* 函數名         :DigDisplay()
* 函數功能                 :數碼管顯示函數
* 輸入           : 無
* 輸出                  : 無
*******************************************************************************/
void DigDisplay()
{
        u8 i;
        for(i=0;i<6;i++)
        {
                switch(i)         //位選,選擇點亮的數碼管,
                {
                        case(0):
                                LSA=1;LSB=1;LSC=1; break;//顯示第0位
                        case(1):
                                LSA=0;LSB=1;LSC=1; break;//顯示第1位
                        case(2):
                                LSA=1;LSB=0;LSC=1; break;//顯示第2位
                        case(3):
                                LSA=0;LSB=0;LSC=1; break;//顯示第3位
                        case(4):
                                LSA=1;LSB=1;LSC=0; break;//顯示第4位
                        case(5):
                                LSA=0;LSB=1;LSC=0; break;//顯示第5位
                }
                P0=DisplayData[i];//發送數據
          delay(100); //間隔一段時間掃描       
                P0=0x00;//消隱
        }               
}



void interrupt_init()
{
  TMOD=0x01;
        TH0=0xfc;
        TL0=0x18;
        ET0=1;
        TR0=1;
        EA=1;
       
}
void main()//主函數
{
interrupt_init();
        while(1)
        {
                datapros(Ds18b20ReadTemp());         //數據處理函數
                DigDisplay();    //數碼管顯示函數

                       
        }               
}

void Timer0() interrupt 1
{
        TR0=0;
TH0=0xfc;
        TL0=0x18;
        TR0=1;
        time++;
        if(time=flag)
        {
        time=0;       
        }
        if(time<=n)
        {
        ENA=1;
        IN1=1;
                IN2=0;
        }


}

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

使用道具 舉報

沙發
ID:275826 發表于 2020-12-13 17:56 | 只看該作者
讀溫度的順序被中斷打亂了
回復

使用道具 舉報

板凳
ID:258566 發表于 2020-12-13 18:01 | 只看該作者
void DigDisplay()
{
        u8 i;
        for (i = 0; i < 6; i++)
        {
                P0 = 0x00;        //消隱
                switch (i)        //位選,選擇點亮的數碼管,
                {
                        case (0):
                                LSA = 1;
                                LSB = 1;
                                LSC = 1;
                                break;        //顯示第0位
                        case (1):
                                LSA = 0;
                                LSB = 1;
                                LSC = 1;
                                break;        //顯示第1位
                        case (2):
                                LSA = 1;
                                LSB = 0;
                                LSC = 1;
                                break;        //顯示第2位
                        case (3):
                                LSA = 0;
                                LSB = 0;
                                LSC = 1;
                                break;        //顯示第3位
                        case (4):
                                LSA = 1;
                                LSB = 1;
                                LSC = 0;
                                break;        //顯示第4位
                        case (5):
                                LSA = 0;
                                LSB = 1;
                                LSC = 0;
                                break;        //顯示第5位
                }
                P0 = DisplayData[ i];        //發送數據
                delay(100);        //間隔一段時間掃描      
               
        }
}
回復

使用道具 舉報

地板
ID:275826 發表于 2020-12-13 19:42 | 只看該作者
三樓修改顯示程序是沒有用的
回復

使用道具 舉報

5#
ID:57657 發表于 2020-12-13 20:07 | 只看該作者
讀溫度前把中斷關了,然后打開。
ET0=0;datapros(Ds18b20ReadTemp());ET0=1;
回復

使用道具 舉報

6#
ID:859752 發表于 2020-12-13 21:23 | 只看該作者
中斷錯了
回復

使用道具 舉報

7#
ID:213173 發表于 2020-12-13 22:43 | 只看該作者
樓主程序中斷處理不當,中斷干擾讀取溫度和數碼管動態掃描,反過來溫度不正常又影響占空比。給你改了,你試試。 溫控.zip (63.96 KB, 下載次數: 23)

回復

使用道具 舉報

8#
ID:258566 發表于 2020-12-14 06:39 來自觸屏版 | 只看該作者
顯示有問題,雖然時鐘速度快看不出來區別,但是邏輯應該是更改位碼前把段碼顯示關閉。
回復

使用道具 舉報

9#
ID:65956 發表于 2020-12-14 08:25 | 只看該作者
給提供個建議,顯示可以用定時器定時刷新,這樣能保證顯示不受其它函數計算等的影響,主函數才是去作溫度讀取與計算的事,因為定時器運行是優先于主函數里其它函數的運行
回復

使用道具 舉報

10#
ID:847958 發表于 2020-12-14 11:16 | 只看該作者
讀溫度的順序被中斷打亂了
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表