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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STC單片機電量檢測程序AD轉換測量第九通道(bandgap)值

[復制鏈接]
跳轉到指定樓層
樓主
ID:37276 發表于 2021-12-23 16:07 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. //測量第九通道(bandgap)值算出VCC

  2. #include <STC15WXX.h> //MCU:stc15w404as
  3. #include<stdio.h>
  4. #include "intrins.h"
  5. #define  uchar unsigned char  
  6. #define uint  unsigned int
  7. #define FOSC    11059200L
  8. #define BAUD    9600
  9. //工作頻率11.0592MHz     串口波特率9600
  10. //-----------------------------------------
  11. //ADC相關設定參數
  12. #define ADC_POWER   0x80            //ADC電源控制位
  13. #define ADC_FLAG    0x10            //ADC完成標志
  14. #define ADC_START   0x08            //ADC起始控制位
  15. #define ADC_SPEEDLL 0x00            //540個時鐘
  16. #define ADC_SPEEDL  0x20            //360個時鐘
  17. #define ADC_SPEEDH  0x40            //180個時鐘
  18. #define ADC_SPEEDHH 0x60            //90個時鐘
  19. //-----------------------------------------
  20. //BandGap相關參數
  21. #define ID_ADDR_RAM 0xef        //對于只有256字節RAM的MCU(大部分系列)存放地址為0EFH
  22. //#define ID_ADDR_RAM 0x6f        //對于只有128字節RAM的MCU(stc15f/w100系列)存放地址為06fH
  23. //注意:需要在下載代碼時選擇"在ID號前添加重要測試參數"選項,才可在程序中獲取此參數
  24. //容量不同的單片機請更改不同數值
  25. //#define ID_ADDR_ROM 0x03f7      //1K程序空間的MCU
  26. //#define ID_ADDR_ROM 0x07f7      //2K程序空間的MCU
  27. //#define ID_ADDR_ROM 0x0bf7      //3K程序空間的MCU
  28. //#define ID_ADDR_ROM 0x0ff7      //4K程序空間的MCU
  29. //#define ID_ADDR_ROM 0x13f7      //5K程序空間的MCU
  30. #define ID_ADDR_ROM 0x1ff7      //8K程序空間的MCU
  31. //#define ID_ADDR_ROM 0x27f7      //10K程序空間的MCU
  32. //#define ID_ADDR_ROM 0x2ff7      //12K程序空間的MCU
  33. //#define ID_ADDR_ROM 0x3ff7      //16K程序空間的MCU
  34. //#define ID_ADDR_ROM 0x4ff7      //20K程序空間的MCU
  35. //#define ID_ADDR_ROM 0x5ff7      //24K程序空間的MCU
  36. //#define ID_ADDR_ROM 0x6ff7      //28K程序空間的MCU
  37. //#define ID_ADDR_ROM 0x7ff7      //32K程序空間的MCU
  38. //#define ID_ADDR_ROM 0x9ff7      //40K程序空間的MCU
  39. //#define ID_ADDR_ROM 0xbff7      //48K程序空間的MCU
  40. //#define ID_ADDR_ROM 0xcff7      //52K程序空間的MCU
  41. //#define ID_ADDR_ROM 0xdff7      //56K程序空間的MCU
  42. //#define ID_ADDR_ROM 0xeff7      //60K程序空間的MCU
  43. //-----------------------------------------
  44. //聲明
  45. void InitUart();
  46. void InitADC();
  47. void SendData(uchar dat);
  48. uint GetADCResult(uchar ch);
  49. void Delay(uint n);
  50. void ShowResult(uchar ch);
  51. void main()
  52. {
  53.     InitUart();                     //初始化串口
  54.     InitADC();                      //初始化ADC
  55.     P1M1=0X01;                        //高阻輸入
  56.     while (1)
  57.     {
  58.         ShowResult(0);              //顯示通道0
  59.         //ShowResult(1);              //顯示通道1
  60. //       ShowResult(2);              //顯示通道2
  61.         //ShowResult(3);              //顯示通道3
  62.         //ShowResult(4);              //顯示通道4
  63.         //ShowResult(5);              //顯示通道5
  64.         //ShowResult(6);              //顯示通道6
  65.         //ShowResult(7);              //顯示通道7
  66.          Delay(100);
  67.     }
  68. }
  69. /*----------------------------
  70. 發送ADC結果
  71. ----------------------------*/
  72. void ShowResult(uchar ch)
  73. {
  74.     uint adc_res10,//測量設定通道adc值
  75.     bandgap,       //bandgap預儲存校準值,單位毫伏
  76.     adc_9gallery_res; //測量第九通道(bandgap)值
  77.     float power_voltage,        //系統供電電壓,單位毫伏
  78.     ADC_voltage;     //設定通道電壓值,單位毫伏

  79.     uchar  code *cptr; //定義ROM(代碼)區指針
  80.     //uchar  idata *iptr;//定義RAM(內存)區指針

  81.     cptr = ID_ADDR_ROM;         //從程序區讀取BandGap電壓值(單位:毫伏mV)
  82.     bandgap=*cptr++;
  83.     bandgap<<=8;
  84.     bandgap+=*cptr;
  85.     /*iptr = ID_ADDR_RAM;         //從內存區讀取BandGap電壓值(單位:毫伏mV)
  86.     bandgap=*iptr++;              //兩種方法結果一樣,上面的方法需要在下載式勾選"在ID號前添加重要測試參數"選項,才可在程序中獲取此參數
  87.     bandgap<<=8;                  //下面的方法不需要
  88.     bandgap+=*iptr;    */
  89.     //測量設定通道adc值
  90.     ADC_RES = 0;                    //清除結果寄存器
  91.     P1ASF = 0xff;                   //設置P1口為AD口
  92.     GetADCResult(ch);
  93.     GetADCResult(ch);                 //讀三次獲得穩定
  94.     adc_res10= GetADCResult(ch);
  95.     //測量第九通道(bandgap)值
  96.     ADC_RES = 0;                    //清除結果寄存器
  97.     P1ASF = 0x00;                   //設置讀第九通道
  98.     GetADCResult(0);                 //測bandgap時,調用此函數時通道數只能填0
  99.     GetADCResult(0);                 //讀三次獲得穩定
  100.     adc_9gallery_res=GetADCResult(0);
  101.     //計算系統供電電壓
  102.     power_voltage=(float)bandgap*1024/adc_9gallery_res;
  103.     //計算ADC通道測得電壓值
  104.     ADC_voltage=(float)bandgap*adc_res10/adc_9gallery_res;
  105.     printf("P1.%d ADC result:%d\n",(uint)ch,adc_res10);
  106.     printf("BandGap standard:%d mV\n",bandgap);
  107.     printf("BandGap value:%d \n",adc_9gallery_res);
  108.     printf("system power voltage:%.0f mV\n",power_voltage);
  109.     printf("ADC voltage:%.0f mV\n",ADC_voltage);
  110. }
  111. /*----------------------------
  112. 讀取ADC結果
  113. ----------------------------*/
  114. uint GetADCResult(uchar ch)
  115. {
  116.     uint ADC_10BIT_RES;
  117.     ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
  118.     _nop_();                        //等待4個NOP
  119.     _nop_();
  120.     _nop_();
  121.     _nop_();
  122.     while (!(ADC_CONTR & ADC_FLAG));//等待ADC轉換完成
  123.     ADC_CONTR &= ~ADC_FLAG;         //關閉 ADC
  124.     ADC_10BIT_RES=ADC_RES;      //得到高8位
  125.     ADC_10BIT_RES<<=2;
  126.     ADC_10BIT_RES+=ADC_RESL;     //得到低2位
  127.     return ADC_10BIT_RES;                 //返回ADC結果

  128. }
  129. /*----------------------------
  130. 初始化串口
  131. ----------------------------*/
  132. void InitUart()
  133. {
  134.     SCON = 0x5a;                //設置串口為8位可變波特率
  135.    T2L = 0xE0;        //設定定時初值
  136.     T2H = 0xFE;        //設定定時初值
  137.     AUXR = 0x14;                //T2為1T模式, 并啟動定時器2
  138.     AUXR |= 0x01;               //選擇定時器2為串口1的波特率發生器
  139. }
  140. /*----------------------------
  141. 初始化ADC
  142. ----------------------------*/
  143. void InitADC()
  144. {
  145.    P1ASF = 0xff;                   //設置P1口為AD口
  146.     ADC_RES = 0;                    //清除結果寄存器
  147.     ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
  148.     Delay(2);                       //ADC上電并延時
  149. }
  150. /*----------------------------
  151. 軟件延時
  152. ----------------------------*/
  153. void Delay(uint n)
  154. {
  155.     uint x;
  156.     while (n--)
  157.     {
  158.         x = 5000;
  159.         while (x--);
  160.     }
  161. }
復制代碼

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:90212 發表于 2022-5-3 15:55 | 只看該作者
一定要用內部晶振,外部晶振讀不出來bandgap,下載的時候還要勾選 在程序區結束處添加重要測試參數
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产激情视频在线 | 欧美成视频在线观看 | 亚洲精品一区二区三区蜜桃久 | 中文字幕在线一区二区三区 | 日韩欧美国产不卡 | 男人天堂网址 | 国产精品美女久久久av超清 | 黄色视频a级毛片 | 成年人黄色一级毛片 | 欧美偷偷操 | 免费成人高清在线视频 | 国产成人免费 | 亚洲毛片网站 | 精品少妇一区二区三区日产乱码 | 毛片免费观看视频 | 蜜桃在线一区二区三区 | 久久久国产精品入口麻豆 | 久久男人天堂 | 久久精品 | 狠狠综合久久av一区二区小说 | 祝你幸福电影在线观看 | 91视视频在线观看入口直接观看 | 视频在线亚洲 | 国产精品一区二区精品 | 日日夜夜精品免费视频 | 欧美一区视频 | a在线观看| 久久精品日产第一区二区三区 | 黄色在线免费观看视频 | 久久久久久久一区 | www国产成人免费观看视频,深夜成人网 | 欧美日韩中文字幕在线 | 手机看片1 | 国产99久久久国产精品 | 亚洲精品一区二区在线观看 | 亚洲 成人 在线 | 欧美精品中文字幕久久二区 | 深夜福利亚洲 | 国产一级视频免费播放 | 免费国产网站 | 亚洲自拍一区在线观看 |