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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4890|回復: 12
收起左側

用stc15w204s單片機的p1.3腳能模擬adc檢測嗎,定時器0我用在其它地方用了,

[復制鏈接]
ID:803579 發表于 2020-8-6 12:22 | 顯示全部樓層 |閱讀模式
各位大佬,用stc15w204s的p1.3腳能模擬adc檢測嗎,定時器0我用在其它地方用了,剩下的管腳我也一樣用了,請求大家能給我一套可以直接調試的程序,官方的我沒看懂,謝謝大家
回復

使用道具 舉報

ID:89217 發表于 2020-8-6 15:44 | 顯示全部樓層
檢測電平咯,,
回復

使用道具 舉報

ID:803579 發表于 2020-8-6 16:00 | 顯示全部樓層

這款單片機是沒有adc的,不曉得怎么檢測,能給程序作參考嗎
回復

使用道具 舉報

ID:803579 發表于 2020-8-6 16:02 | 顯示全部樓層
啊h啊 發表于 2020-8-6 16:00
這款單片機是沒有adc的,不曉得怎么檢測,能給程序作參考嗎

我所有的管腳都使用了,定時器0和2也在其它地方用了,只剩下一個p1.3的管腳
回復

使用道具 舉報

ID:401564 發表于 2020-8-6 17:28 | 顯示全部樓層
這個單片機是沒有ADC的
但凡是用STC的,基本就不是什么批量產品,肯定是有改動的空間的,直接換一個有ADC功能的單片機就可以了
不要用官方推薦的那種沒有ADC功能單片機使用RC電路來實現ADC,那會亂的
直接換單片機最實用
回復

使用道具 舉報

ID:807591 發表于 2020-8-6 17:39 | 顯示全部樓層
都不看說明書的?這個型號沒有ADC,,要模擬adc基本上很難
回復

使用道具 舉報

ID:155507 發表于 2020-8-6 17:52 來自觸屏版 | 顯示全部樓層
巧婦難為無米之炊
回復

使用道具 舉報

ID:155507 發表于 2020-8-6 20:16 | 顯示全部樓層
你可以參考這個



  1. /*---------------------------------------------------------------------*/
  2. /* --- STC MCU International Limited ----------------------------------*/
  3. /* --- STC 1T Series MCU Demo Programme -------------------------------*/
  4. /* --- Mobile: (86)13922805190 ----------------------------------------*/
  5. /* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
  6. /* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
  7. /* --- QQ:  800003751 -------------------------------------------------*/
  8. /* 如果要在程序中使用此代碼,請在程序中注明使用了宏晶科技的資料及程序   */
  9. /*---------------------------------------------------------------------*/



  10. /****************************
  11. 本示例在Keil開發環境下請選擇Intel的8052芯片型號進行編譯

  12. 本例程MCU的工作頻率為22.1184MHz.

  13. 使用MCU自帶的比較器進行ADC轉換, 并通過串口輸出結果. 用定時器0產生10us中斷查詢比較器的狀態.

  14. 使用比較器做ADC, 原理圖如下.
  15. 做ADC的原理是基于電荷平衡的計數式ADC.
  16. 電壓從Vin輸入, 通過100K+104濾波, 進入比較器的P5.5正輸入端, 經過比較器的比較, 將結果輸出到P1.5再通過100K+104濾波后送比較器P5.4負輸入端,跟輸入電壓平衡.
  17. 設置兩個變量: 計數周期(量程)adc_duty 和 比較結果高電平的計數值 adc, adc嚴格比例于輸入電壓.
  18. ADC的基準就是P1.5的高電平. 如果高電平準確,比較器的放大倍數足夠大,則ADC結果會很準確.
  19. 當比較結果為高電平,則P1.5輸出1, 并且adc+1.
  20. 當比較結果為低電平,則P1.5輸出0.
  21. 每一次比較都判斷計數周期是否完成,完成則adc里的值就是ADC結果.
  22. 電荷平衡計數式ADC的性能類似數字萬用表用的雙積分ADC, 當計數周期為20ms的倍數時,具有很強的抗工頻干擾能力,很好的線性和精度.
  23. 原理可以參考ADD3501(3 1/2位數字萬用表)或ADD3701(3 3/4位數字萬用表), 也可以參考AD7740 VFC電路.

  24. 例: 比較一次的時間間隔為10us, 量程為10000, 則做1次ADC的時間為100ms. 比較器的響應時間越短, 則完成ADC就越快.

  25. 由于要求每次比較時間間隔都要相等,所以用C編程最好在定時器中斷里進行, 定時器設置為自動重裝, 高優先級中斷, 其它中斷均低優先級.
  26. 用匯編的話, 保證比較輸出電平處理的時間要相等.


  27.                                          100K
  28.                             /| P5.5       ___
  29.                     P1.2   /+|---------o-|___|- ------- Vin
  30.                      .----<  | P5.4    |
  31.                      |     \-|---.     |
  32.                      |      \|   |     |
  33.                      |           |     |
  34.                      |    ___    |     |
  35.                      '---|___|---o     |
  36.                         100K     |     |
  37.                                 ---   ---
  38.                                 ---   ---
  39.                             104  |     |  104
  40.                                  |     |
  41.                                 ===   ===
  42.                                 GND   GND



  43. ******************************/

  44. #define MAIN_Fosc                22118400L        //定義主時鐘
  45. #define        BaudRate1                9600ul                //定義波特率
  46. #define        ADC_SCALE                50000                //ADC滿量程, 根據需要設置

  47. #include        "STC15Fxxxx.H"


  48. /*************        本地常量聲明        **************/

  49. //CMPCR1
  50. #define        CMPEN        0x80        //1: 允許比較器, 0: 禁止,關閉比較器電源
  51. #define        CMPIF        0x40        //比較器中斷標志, 包括上升沿或下降沿中斷, 軟件清0
  52. #define        PIE                0x20        //1: 比較結果由0變1, 產生上升沿中斷
  53. #define        NIE                0x10        //1: 比較結果由1變0, 產生下降沿中斷
  54. #define        PIS                0x08        //輸入正極性選擇, 0: 選擇內部P5.5做正輸入,           1: 由ADCIS[2:0]所選擇的ADC輸入端做正輸入.
  55. #define        NIS                0x04        //輸入負極性選擇, 0: 選擇內部BandGap電壓BGv做負輸入, 1: 選擇外部P5.4做輸入.
  56. #define        CMPOE        0x02        //1: 允許比較結果輸出到P1.2, 0: 禁止.
  57. #define        CMPRES        0x01        //比較結果, 1: CMP+電平高于CMP-,  0: CMP+電平低于CMP-,  只讀

  58. //CMPCR2
  59. #define        INVCMPO        0x80        //1: 比較器輸出取反,  0: 不取反
  60. #define        DISFLT        0x40        //1: 關閉0.1uF濾波,   0: 允許
  61. #define        LCDTY        0x00        //0~63, 比較結果變化延時周期數

  62. #define        TIM_16BitAutoReload                        0
  63. #define        TIM_16Bit                                        1
  64. #define        TIM_8BitAutoReload                        2
  65. #define        TIM_16BitAutoReloadNoMask        3

  66. #define        Pin0                0x01        //IO引腳 Px.0
  67. #define        Pin1                0x02        //IO引腳 Px.1
  68. #define        Pin2                0x04        //IO引腳 Px.2
  69. #define        Pin3                0x08        //IO引腳 Px.3
  70. #define        Pin4                0x10        //IO引腳 Px.4
  71. #define        Pin5                0x20        //IO引腳 Px.5
  72. #define        Pin6                0x40        //IO引腳 Px.6
  73. #define        Pin7                0x80        //IO引腳 Px.7
  74. #define        PinAll                0xFF        //IO所有引腳

  75. /*************        本地變量聲明        **************/
  76. //sbit        P_ADC        = P1^2;        //P1.2 比較器轉IO輸出端
  77. sbit        P_ADC        = P1^4;        //P1.2 比較器轉IO輸出端
  78. u16                adc;                        //ADC中間值, 用戶層不可見
  79. u16                adc_duty;                //ADC計數周期, 用戶層不可見
  80. u16                adc_value;                //ADC值, 用戶層使用
  81. bit                adc_ok;                        //ADC結束標志, 為1則adc_value的值可用. 此標志給用戶層查詢,并且清0


  82. /*************        本地函數聲明        **************/
  83. void        TxString(u8 *puts);






  84. void main(void)
  85. {
  86.         u8        i;
  87.         u8        tmp[5];


  88. //IO口初始化
  89. //        P1n_push_pull(Pin2);                //P1.2設置為push-pull output
  90.         P1n_push_pull(Pin4);                //P1.2設置為push-pull output
  91.         P5n_pure_input(Pin4+Pin5);        //P5.4 P5.5設置為高阻輸入


  92. //比較器初始化
  93.         CMPCR1 = 0;
  94.         CMPCR2 = 20;                //比較結果變化延時周期數, 0~63
  95.         CMPCR1 |= CMPEN;        //允許比較器                ENABLE,DISABLE
  96. //        CMPCR1 |= PIE;                //允許上升沿中斷        ENABLE,DISABLE
  97. //        CMPCR1 |= NIE;                //允許下降沿中斷        ENABLE,DISABLE
  98. //        CMPCR1 |= PIS;                //輸入正極性選擇, 0: 選擇內部P5.5做正輸入,           1: 由ADCIS[2:0]所選擇的ADC輸入端做正輸入.
  99.         CMPCR1 |= NIS;                //輸入負極性選擇, 0: 選擇內部BandGap電壓BGv做負輸入, 1: 選擇外部P5.4做輸入
  100. //        CMPCR1 |= CMPOE;        //允許比較結果輸出到P1.2,   ENABLE,DISABLE
  101. //        CMPCR2 |= INVCMPO;        //比較器輸出取反,         ENABLE,DISABLE
  102.         CMPCR2 |= DISFLT;        //內部0.1uF濾波,          ENABLE,DISABLE


  103. //定時器0 初始化
  104.         TMOD &= ~0x0f;
  105.         Timer0_16bitAutoReload();        //設置為16位自動重裝模式
  106.         Timer0_1T();        //設置為1T模式
  107.         ET0 = 1;                //允許中斷
  108.         PT0 = 1;                //高優先級中斷
  109.         TH0 = (u8)((65536 - MAIN_Fosc / 100000ul)>>8);                //重裝值        100KHZ, 10us,        65536 - (MAIN_Fosc)/100000
  110.         TL0 = (u8)( 65536 - MAIN_Fosc / 100000ul);
  111.         TR0 = 1;                //開始運行


  112. //串口1初始化
  113.         S1_USE_P30P31();        //UART1 使用P30 P31口        默認
  114. //        S1_USE_P36P37();        //UART1 使用P36 P37口
  115. //        S1_USE_P16P17();        //UART1 使用P16 P17口

  116.         S1_8bit();                        //8位數據,波特率可變
  117.         S1_RX_Enable();                //允許接收
  118.         S1_TXD_RXD_OPEN();        //將TXD與RXD連接中繼斷開        默認
  119.         S1_BRT_UseTimer2();        //使用Timer2做波特率發生器
  120.         ES = 0;                                //禁止中斷, 使用查詢發送

  121.         Timer2_1T();        //Timer2 1T模式, 固定為16位自動重裝
  122.     T2L = (65536 - (MAIN_Fosc/4/BaudRate1));   //設置波特率重裝值
  123.     T2H = (65536 - (MAIN_Fosc/4/BaudRate1))>>8;
  124.         Timer2_Run();        //允許定時器2計數

  125.         EA = 1;                        //允許全局中斷

  126.         TxString("\r\n使用比較器做ADC例子\r\n");        //SUART1發送一個字符串
  127.         

  128.         while (1)
  129.         {
  130.                 if(adc_ok)                //等待ADC結束
  131.                 {
  132.                         adc_ok = 0;                                //清除ADC已結束標志
  133.                         TxString("ADC = ");        //轉十進制
  134.                         tmp[0] = adc_value / 10000 + '0';
  135.                         tmp[1] = adc_value % 10000 / 1000 + '0';
  136.                         tmp[2] = adc_value % 1000 / 100 + '0';
  137.                         tmp[3] = adc_value % 100 / 10 + '0';
  138.                         tmp[4] = adc_value % 10 + '0';
  139.                         for(i=0; i<4; i++)                //消無效0
  140.                         {
  141.                                 if(tmp[i] != '0')        break;
  142.                                 tmp[i] = ' ';
  143.                         }
  144.                         for(i=0; i<5; i++)                //發串口
  145.                         {
  146.                                 TI = 0;
  147.                                 SBUF = tmp[i];
  148.                                 while(!TI);
  149.                                 TI = 0;
  150.                         }
  151.                         TxString("\r\n");
  152.                 }
  153.         }
  154. }


  155. void TxString(u8 *puts)                //發送一個字符串
  156. {
  157.     for (; *puts != 0;        puts++)           //遇到停止符0結束
  158.         {
  159.                 TI = 0;
  160.                 SBUF = *puts;
  161.                 while(!TI);
  162.                 TI = 0;
  163.         }
  164. }


  165. /********************* Timer0中斷函數************************/
  166. void timer0_int (void) interrupt TIMER0_VECTOR
  167. {
  168.         if((CMPCR1 & CMPRES) == 0)        P_ADC = 0;        //比較器輸出高電平
  169.         else                                //P_ADC輸出低電平, 給負輸入端做反饋.
  170.         {
  171.                 P_ADC = 1;                        //P_ADC輸出高電平, 給負輸入端做反饋.
  172.                 adc ++;        //ADC計數+1
  173.         }

  174.         if(--adc_duty == 0)                        //ADC周期-1, 到0則ADC結束
  175.         {
  176.                 adc_duty = ADC_SCALE;        //周期計數賦初值
  177.                 adc_value = adc;                //保存ADC值
  178.                 adc = 0;                                //清除ADC值
  179.                 adc_ok = 1;                                //標志ADC已結束
  180.         }
  181. }





復制代碼
回復

使用道具 舉報

ID:213173 發表于 2020-8-6 20:49 | 顯示全部樓層
STC15W204S有8腳和16腳兩種封裝,樓主提到只能用P1.3,那只能是16腳封裝,8腳封裝的沒有P1。樓主與其糾結怎么模擬adc不如直接更換內置ADC的STC15W404AS,兩者管腳排列相同,價格相差幾角錢。何況利用RC測量電壓的精度取決于RC精度且受溫度變化影響較大,不適合批量生產制作。
回復

使用道具 舉報

ID:213173 發表于 2020-8-6 21:30 | 顯示全部樓層
模擬adc起碼需要3個條件:1個普通IO口,一個外部中斷口,一個定時器。樓主3個條件只具備1個半。
回復

使用道具 舉報

ID:803579 發表于 2020-8-7 10:07 | 顯示全部樓層
angmall 發表于 2020-8-6 20:16
你可以參考這個

我想請問,如果與內部基準電壓做比較是不是可以不用接p5.4
回復

使用道具 舉報

ID:147710 發表于 2020-8-7 10:18 | 顯示全部樓層
這個型號有ADC
stc8g.jpg

回復

使用道具 舉報

ID:146782 發表于 2020-8-7 11:58 | 顯示全部樓層
模擬adc需要:1個普通IO口,一個外部中斷口,一個定時器。直接換一個STC15W408AS吧
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

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