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

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

QQ登錄

只需一步,快速開始

搜索
查看: 2024|回復(fù): 3
收起左側(cè)

STC12C2052AD單片機(jī)芯片中關(guān)于AD轉(zhuǎn)換的相關(guān)內(nèi)容

[復(fù)制鏈接]
ID:695961 發(fā)表于 2020-3-1 16:55 | 顯示全部樓層 |閱讀模式
使用芯片自帶的AD轉(zhuǎn)換器,按芯片說明書中提供的典型線路圖連接方案。發(fā)現(xiàn)使用查詢方式AD轉(zhuǎn)換沒有問題,獲取的輸出轉(zhuǎn)換電壓和實(shí)際輸入電壓,大約相差正負(fù)0.2V左右。但是使用中斷方式,僅在芯片上電觸發(fā)一次,然后就不動(dòng)了。代碼也檢查了N多遍,真心看不出還有什么問題。請(qǐng)問各位大神遇到過這種問題嗎?該芯片測(cè)得的直流電壓會(huì)相差這么多嗎?誰用過這款芯片?

單片機(jī)代碼如下:
  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. // 延時(shí)函數(shù)
  13. void Delay(uint16 n)
  14. {
  15.         uint16 x;
  16.         while(n--)
  17.         {
  18.                 x = 5000;
  19.                 while(x--);
  20.         }
  21. }

  22. // AD中斷(這里出現(xiàn)問題,上電觸發(fā)一次,然后就不再觸發(fā))
  23. void AdcISR() interrupt 5
  24. {
  25.         ADC_CONTR &= ~ADC_FLAG;
  26.         PutChar(ADC_DATA);
  27.         
  28.         // 開始下一次轉(zhuǎn)換
  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口全部設(shè)置為開漏(Open Drain)
  36.         ADC_DATA = 0;
  37.         
  38.         // 清空DA轉(zhuǎn)換的結(jié)果
  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.         // 返回轉(zhuǎn)換結(jié)果
  57.         return ADC_DATA;
  58. }

  59. // 軟件延時(shí)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,使用查詢方式時(shí),注釋下面兩行
  81.         AUXR |= 0x10;
  82.         IE = 0xB0;                // 芯片說明書上給出的是0xA0,會(huì)將串口通訊的中斷屏蔽,這里我改為了0xB0
  83.         
  84.         while(1)
  85.         {
  86.                 ;
  87.                
  88.                 // 查詢方式使用AD,中斷方式注釋下面兩行
  89. //                Delay500ms();
  90. //                PutChar(GetAdcResult());
  91.         }
  92. }
復(fù)制代碼



回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 2020-3-1 17:56 | 顯示全部樓層
沒有看到開總中斷和開ADC中斷
回復(fù)

使用道具 舉報(bào)

ID:695961 發(fā)表于 2020-3-1 18:03 | 顯示全部樓層
剛剛發(fā)完帖后,又仔細(xì)的檢查了一下代碼。發(fā)現(xiàn)這個(gè)問題可能是中斷造成的。因?yàn)槲以谥袛囗憫?yīng)程序中調(diào)用了將數(shù)據(jù)發(fā)送到串口的操作,這種操作會(huì)觸發(fā)串口發(fā)送數(shù)據(jù)完成的中斷。

我將中斷程序改為如下:

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


在串口調(diào)試工具中發(fā)現(xiàn)接收窗僅打印了一個(gè)FF,然后就不動(dòng)了。

查詢手冊(cè)發(fā)現(xiàn),雖然沒有設(shè)置串口優(yōu)先級(jí)寄存器的情況下,同級(jí)的串口中斷的優(yōu)先級(jí)比AD優(yōu)先執(zhí)行,但是串口中斷并不會(huì)打斷AD中斷的執(zhí)行。所以程序就停止在了putchar中,因?yàn)閜utchar會(huì)等待串口中斷執(zhí)行完成將TI設(shè)置為0才往下執(zhí)行。

所以,在主函數(shù)中將串口中斷的優(yōu)先級(jí)提高一級(jí)就可以正常工作了。

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

使用道具 舉報(bào)

ID:695961 發(fā)表于 2020-3-1 18:06 | 顯示全部樓層
wulin 發(fā)表于 2020-3-1 17:56
沒有看到開總中斷和開ADC中斷

謝謝您,我的問題已經(jīng)解決了。開AD中斷是

AUXR |= 0x10;
IE = 0xB0;

開總中斷在是InitUART中做了。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表