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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

在線等,關于一個AD采集DA的單片機程序,值總是固定的一個問題困擾好幾天了

[復制鏈接]
跳轉到指定樓層
樓主
ID:289777 發表于 2018-6-10 17:24 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
100黑幣
AD檢測DA輸出的模擬電壓,然后在數碼管上顯示
我的能顯示,但是數字總是跳變,這是怎么回事,數字不穩定,數字的值跳變明顯
占空比明明我已經固定了,按理說不會發生很大的數字值跳變現象,但是我的依然發生的跳變很大,這是怎么回事
我的程序在下面,很短,麻煩看一下,占空比是Value
周期是Timer1
主函數While 里已經把占空比固定了,為什么數字跳變在數碼管上還是很明顯??


是中斷的問題嗎?但是數碼管的中斷我已經修改好幾了,不管定時是長一點還是短,跳變現象都很明顯,怎么辦?

/**************************************************************************************
*                外部輸入AD實驗              *
實現現象: 具體接線操作請參考視頻
   下載程序后數碼管前4位顯示外部輸入IN3通道檢測的AD值,模擬信號電壓范圍在0-5V
注意事項:                     
***************************************************************************************/
#include "reg52.h"    //此文件中定義了單片機的一些特殊功能寄存器
#include"XPT2046.h"
typedef unsigned int u16;   //對數據類型進行聲明定義
typedef unsigned char u8;
//--定義使用的IO口--//
sbit PWM=P2^1;
bit DIR;
//--定義一個全局變量--//
u16 count,value,timer1;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
u8 disp[4];
u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
/*******************************************************************************
* 函 數 名         : delay
* 函數功能     : 延時函數,i=1時,大約延時10us
*******************************************************************************/
void delay(u16 i)
{
while(i--);
}
/*******************************************************************************
* 函數名         :datapros()
* 函數功能   :數據處理函數
* 輸入           : 無
* 輸出           : 無
*******************************************************************************/
void datapros()
{
u16 temp;
static u8 i;
if(i==50)
{
  i=0;
  temp = Read_AD_Data(0xE4);  //   AIN3 外部輸入
}
i++;
disp[0]=smgduan[temp/1000];//千位
disp[1]=smgduan[temp%1000/100];//百位
disp[2]=smgduan[temp%1000%100/10];//個位
disp[3]=smgduan[temp%1000%100%10];  
}

/*******************************************************************************
* 函數名         :DigDisplay()
* 函數功能   :數碼管顯示函數
* 輸入           : 無
* 輸出           : 無
*******************************************************************************/
void DigDisplay()
{
u8 i;
for(i=0;i<4;i++)
{
  switch(i)  //位選,選擇點亮的數碼管,
  {
   case(0):
    LSA=0;LSB=0;LSC=0; break;//顯示第0位
   case(1):
    LSA=1;LSB=0;LSC=0; break;//顯示第1位
   case(2):
    LSA=0;LSB=1;LSC=0; break;//顯示第2位
   case(3):
    LSA=1;LSB=1;LSC=0; break;//顯示第3位
  }

  P0=disp[ i];//發送數據
  delay(40); //間隔一段時間掃描
  P0=0x00;//消隱
}  
}
  1. /*******************************************************************************
  2. * 函 數 名       : main
  3. * 函數功能   : 主函數
  4. * 輸    入       : 無
  5. * 輸    出      : 無
  6. *******************************************************************************/
  7. void Timer1Init()
  8. {
  9. TMOD|=0X10;//選擇為定時器1模式,工作方式1,僅用TR1打開啟動。
  10. TH1 = 0xFF;
  11. TL1 = 0xff;   //1us
  12.   
  13. ET1=1;//打開定時器1中斷允許
  14. EA=1;//打開總中斷
  15. TR1=1;//打開定時器   
  16. }
  17. void Timer1Init1()
  18. {
  19. TMOD|= 0x01;
  20.    TH0 = 0x0D8;
  21.     TL0 = 0x0F0;
  22.     ET0 = 1;
  23.     TR0 = 1;  
  24. }
  25. void main()
  26. {
  27.     Timer1Init1();
  28. Timer1Init();  //定時器1初始化

  29. while(1)
  30. {   
  31.       
  32.    value=34;
  33.   if(timer1>200)  //PWM周期為1000*1us
  34.   {
  35.    timer1=0;
  36.   }
  37.   if(timer1 <value)
  38.   {
  39.    PWM=1;
  40.   }
  41.   else
  42.   {
  43.    PWM=0;
  44.   }
  45.   
  46. }  
  47. }
  48.     void Time(void) interrupt 1  //3 為定時器1的中斷號  1 定時器0的中斷號 0 外部中斷1 2 外部中斷2  4 串口中斷
  49. {
  50.       TH0 = 0x0D8;
  51.     TL0 = 0x0F0;
  52. count++ ;
  53.        if(count==20)
  54.        {count=0;
  55.    
  56.        datapros();  //數據處理函數
  57.   DigDisplay();//數碼管顯示函數
  58.           }

  59. }
  60. void Time1(void) interrupt 3    //3 為定時器1的中斷號  1 定時器0的中斷號 0 外部中斷1 2 外部中斷2  4 串口中斷
  61. {
  62. TH1 = 0xFF;
  63. TL1 = 0xff;   //1us
  64. timer1++;
  65.       
  66. }
復制代碼

評分

參與人數 1黑幣 +5 收起 理由
yrbneumann5288 + 5 很給力!

查看全部評分

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

使用道具 舉報

沙發
ID:123289 發表于 2018-6-10 18:46 | 只看該作者
你可以用斷點調 試一下,看看究競何處在跳動。
回復

使用道具 舉報

板凳
ID:213173 發表于 2018-6-10 21:14 | 只看該作者
你這個程序根本不可能正常運行!T1中斷周期1us,CPU得到中斷請求到響應中斷需要時間,執行中斷任務也需要時間,這個過程遠遠超過1us,也就是說執行T1中斷任務一次時間已經丟掉好多次中斷請求,何況T0中斷的優先級高于T1中斷,執行T0中斷任務一次也不知丟掉多少次T1中斷請求,那么你的PWM就是極不穩定,怎么可能得到穩定的AD/DA值,甚至主程序根本無法正常運行。根據經驗,普通51單片機在12M晶振條件下中斷周期小于10us主程序就不能正常運行,不信你寫個小程序試試,
回復

使用道具 舉報

地板
ID:289777 發表于 2018-6-10 22:06 | 只看該作者
wulin 發表于 2018-6-10 21:14
你這個程序根本不可能正常運行!T1中斷周期1us,CPU得到中斷請求到響應中斷需要時間,執行中斷任務也需要時 ...

那我定時器中斷1 改成了100us,那么定時器0 數碼管掃描的定時我是往大的方向改還是小的方向改?
定時器1 改成100us,那我的周期timer1 是從1000改到100好還是繼續保持1000呢?
回復

使用道具 舉報

5#
ID:323774 發表于 2018-6-10 22:31 | 只看該作者
樓上說的有道理,51是12MHz時鐘,指令周期是1/12,對應的是1us,主程序無法正常運行
回復

使用道具 舉報

6#
ID:341045 發表于 2018-6-11 01:06 | 只看該作者
T1中斷設置有問題, TH1=0XFF; TL1=0XFF; 也就是一個指令周期就中斷, 都沒空閑在執行外部程序了
回復

使用道具 舉報

7#
ID:213173 發表于 2018-6-11 10:35 | 只看該作者
haohaoxue51 發表于 2018-6-10 22:06
那我定時器中斷1 改成了100us,那么定時器0 數碼管掃描的定時我是往大的方向改還是小的方向改?
定時器1 ...

不是修改T1中斷周期這么簡單,這里有個程序構架的問題,T0中斷任務運行需要約5ms,你改T1中斷周期為100us又有多少實際意義?核心在于你如何調度時間!從你的全部任務看只要開1個定時器,中斷周期100~200us產生PWM為宜,AD轉換放在中斷里,2ms轉換一次,其他任務放在主循環處理。局部程序供參考:void Timer0Init(void)                //100微秒@12.000MHz
{
        TMOD |= 0x02;                        //設置定時器0自動重載模式
        TL0 = 0x9C;                                //設置定時初值
        TH0 = 0x9C;                                //設置定時重載值
        TF0 = 0;                                //清除TF0標志
        TR0 = 1;                                //定時器0開始計時
        EA=1;                                        //開總中斷
        ET0=1;                                        //開定時器0中斷       
}
void timer0() interrupt        1
{
        timer1++;
        timer2++;
        if(timer1>=100)
                timer1=0;               
        if(timer1<value)
                PWM=1;               
        else
                PWM=0;
        if(timer2>=20)
        {
                timer2=0;       
                temp=Read_AD_Data(0xE4);//AD采樣
                flag=1;//2ms標志,供數據處理函數和數碼管函數刷新用
        }
}
void DigDisplay()
{
        static u8 i=0;
        if(flag==1)
        {
                flag=0;//2ms標志清0
                P0=0x00;//消隱
                switch(i)
                {
                        case(0):
                        LSA=0;LSB=0;LSC=0;P0=smgduan[temp/1000];i++; break;//顯示第0位
                        case(1):
                        LSA=1;LSB=0;LSC=0;P0=smgduan[temp%1000/100];i++; break;//顯示第1位
                        case(2):
                        LSA=0;LSB=1;LSC=0;P0=smgduan[temp%1000%100/10];i++; break;//顯示第2位
                        case(3):
                        LSA=1;LSB=1;LSC=0;P0=smgduan[temp%1000%100%10];i=0; break;//顯示第3位
                }                
        }
}

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一级在线视频 | 91在线观看免费视频 | jdav视频在线观看免费 | 久久久噜噜噜久久中文字幕色伊伊 | 97国产精品| 91麻豆精品国产91久久久更新资源速度超快 | 久久亚洲一区 | 国产欧美精品一区二区三区 | 国产成人免费视频网站高清观看视频 | 久久九七| 亚洲精品中文字幕在线 | 精品在线观看入口 | 久久精品在线播放 | 91精品国产综合久久久久蜜臀 | 午夜久久av| 国产精品免费观看视频 | 91精品久久久久久久久久 | 亚洲一区二区在线播放 | 国产精品一码二码三码在线 | 久久精品99 | 在线午夜| 免费视频99 | 中文字幕影院 | 毛片入口 | 国精产品一品二品国精在线观看 | 草久久 | 综合色影院 | 亚洲三级国产 | 羞羞色在线观看 | 国产视频导航 | 亚洲精品久久久久久国产精华液 | 一区二区三区国产 | 99色综合| 成人在线观看免费 | 高清欧美性猛交xxxx黑人猛交 | 在线a视频网站 | 色婷婷综合久久久中字幕精品久久 | 日韩视频免费在线 | 亚洲国产成人久久综合一区,久久久国产99 | a久久久久久 | 国产在线看片 |