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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STC12C2052AD單片機芯片中關于AD轉換的相關內容

[復制鏈接]
跳轉到指定樓層
樓主
ID:695961 發表于 2020-3-1 16:55 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
使用芯片自帶的AD轉換器,按芯片說明書中提供的典型線路圖連接方案。發現使用查詢方式AD轉換沒有問題,獲取的輸出轉換電壓和實際輸入電壓,大約相差正負0.2V左右。但是使用中斷方式,僅在芯片上電觸發一次,然后就不動了。代碼也檢查了N多遍,真心看不出還有什么問題。請問各位大神遇到過這種問題嗎?該芯片測得的直流電壓會相差這么多嗎?誰用過這款芯片?

單片機代碼如下:
  1. #include <intrins.h>
  2. #include <STC12C2052AD.H>
  3. #include "UART.H"

  4. volatile uint8 COMMAND;

  5. #define ADC_POWER     0x80                // 1000 0000
  6. #define ADC_FLAG      0x10                // 0001        0000
  7. #define ADC_START     0x08                // 0000 1000

  8. #define ADC_SPEEDLL   0x00                // 0000 0000
  9. #define ADC_SPEEDL          0x20                // 0010 0000
  10. #define ADC_SPEEDH    0x40                // 0100 0000
  11. #define ADC_SPEEDHH   0x60                // 0110 0000

  12. // 延時函數
  13. void Delay(uint16 n)
  14. {
  15.         uint16 x;
  16.         while(n--)
  17.         {
  18.                 x = 5000;
  19.                 while(x--);
  20.         }
  21. }

  22. // AD中斷(這里出現問題,上電觸發一次,然后就不再觸發)
  23. void AdcISR() interrupt 5
  24. {
  25.         ADC_CONTR &= ~ADC_FLAG;
  26.         PutChar(ADC_DATA);
  27.         
  28.         // 開始下一次轉換
  29.         ADC_CONTR = ADC_POWER | ADC_SPEEDLL | 6 | ADC_START;
  30.         Delay(10);
  31. }

  32. // 初始化AD
  33. void InitAdc()
  34. {
  35.         P1 = P1M0 = P1M1 = 0xFF;                                // 將所有P1口全部設置為開漏(Open Drain)
  36.         ADC_DATA = 0;
  37.         
  38.         // 清空DA轉換的結果
  39.         //ADC_CONTR = ADC_POWER | ADC_SPEEDHH;        
  40.         ADC_CONTR = ADC_POWER | ADC_SPEEDLL | 6 | ADC_START;
  41.         Delay(10);
  42. }

  43. // 查詢方式獲取AD的值
  44. uint8 GetAdcResult()
  45. {
  46.         ADC_CONTR = ADC_POWER | ADC_SPEEDHH | 6 | ADC_START;
  47.         _nop_();
  48.         _nop_();
  49.         _nop_();
  50.         _nop_();
  51.         while(!(ADC_CONTR & ADC_FLAG));
  52.         
  53.         // 清空位
  54.         ADC_CONTR &= ~ADC_FLAG;
  55.         
  56.         // 返回轉換結果
  57.         return ADC_DATA;
  58. }

  59. // 軟件延時500ms
  60. void Delay500ms()                //@11.0592MHz
  61. {
  62.         unsigned char i, j, k;

  63.         i = 22;
  64.         j = 3;
  65.         k = 227;
  66.         do
  67.         {
  68.                 do
  69.                 {
  70.                         while (--k);
  71.                 } while (--j);
  72.         } while (--i);
  73. }


  74. void main()
  75. {
  76.         InitUART();                // 初始化串口
  77.         InitAdc();                // 初始化ADC
  78.         
  79.         
  80.         // 中斷方式使用AD,使用查詢方式時,注釋下面兩行
  81.         AUXR |= 0x10;
  82.         IE = 0xB0;                // 芯片說明書上給出的是0xA0,會將串口通訊的中斷屏蔽,這里我改為了0xB0
  83.         
  84.         while(1)
  85.         {
  86.                 ;
  87.                
  88.                 // 查詢方式使用AD,中斷方式注釋下面兩行
  89. //                Delay500ms();
  90. //                PutChar(GetAdcResult());
  91.         }
  92. }
復制代碼



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

使用道具 舉報

沙發
ID:213173 發表于 2020-3-1 17:56 | 只看該作者
沒有看到開總中斷和開ADC中斷
回復

使用道具 舉報

板凳
ID:695961 發表于 2020-3-1 18:03 | 只看該作者
剛剛發完帖后,又仔細的檢查了一下代碼。發現這個問題可能是中斷造成的。因為我在中斷響應程序中調用了將數據發送到串口的操作,這種操作會觸發串口發送數據完成的中斷。

我將中斷程序改為如下:

  1. void AdcISR() interrupt 5
  2. {
  3.         ADC_CONTR &= ~ADC_FLAG;
  4.        
  5.         PutChar(0xFF);
  6.         PutChar(0xFE);
  7.         PutChar(ADC_DATA);
  8.        
  9.         // 開始下一次轉換
  10.         ADC_CONTR = ADC_POWER | ADC_SPEEDLL | 6 | ADC_START;
  11. }
復制代碼


在串口調試工具中發現接收窗僅打印了一個FF,然后就不動了。

查詢手冊發現,雖然沒有設置串口優先級寄存器的情況下,同級的串口中斷的優先級比AD優先執行,但是串口中斷并不會打斷AD中斷的執行。所以程序就停止在了putchar中,因為putchar會等待串口中斷執行完成將TI設置為0才往下執行。

所以,在主函數中將串口中斷的優先級提高一級就可以正常工作了。

  1. void main()
  2. {
  3.         // 中斷方式使用AD,使用查詢方式時,注釋下面兩行
  4.         PS = 1;
  5.         AUXR |= 0x10;
  6.         IE = 0xB0;                // 芯片說明書上給出的是0xA0,會將串口通訊的中斷屏蔽,這里我改為了0xB0
  7.         //PADC_SPI = 1;        // 高優先級
  8.        
  9.         InitUART();                // 初始化串口
  10.         InitAdc();                // 初始化ADC
  11.        
  12.         while(1)
  13.         {
  14.                 ;
  15.                
  16.                 // 查詢方式使用AD,中斷方式注釋下面兩行
  17. //                Delay500ms();
  18. //                PutChar(GetAdcResult());
  19.         }
  20. }
復制代碼
回復

使用道具 舉報

地板
ID:695961 發表于 2020-3-1 18:06 | 只看該作者
wulin 發表于 2020-3-1 17:56
沒有看到開總中斷和開ADC中斷

謝謝您,我的問題已經解決了。開AD中斷是

AUXR |= 0x10;
IE = 0xB0;

開總中斷在是InitUART中做了。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 三级av免费 | 视频在线观看一区二区 | 欧美在线视频一区 | 在线毛片网 | 午夜影院污 | 91性高湖久久久久久久久_久久99 | 国产美女精品视频 | 久久这里只有精品首页 | 亚洲 欧美 另类 综合 偷拍 | 日韩一区二区三区在线观看 | 美女天天操 | 国产精品色综合 | 看一级黄色毛片 | 精品综合 | 香蕉久久久久久 | 成人精品鲁一区一区二区 | 亚洲黄色一区二区三区 | 国内精品99 | 国产美女高潮 | 中文字幕在线观看 | 91久久精品一区二区二区 | 国产精品久久精品 | 欧美一区二区在线播放 | 欧美福利 | 99视频| 免费在线a视频 | 婷婷久久精品一区二区 | 国产成人精品综合 | 久久一区| 国产成人精品一区二区三区四区 | 九九九精品视频 | 三级视频在线观看 | 亚洲精品日本 | 久久国产精品免费 | 国产三区在线观看视频 | 欧美视频成人 | 欧美综合久久久 | 三级视频在线观看 | 日韩电影一区二区三区 | 中文字幕av在线播放 | 欧美久久天堂 |