找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2054|回复: 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 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:90212 发表于 2022-5-3 15:55 | 显示全部楼层
一定要用内部晶振,外部晶振读不出来bandgap,下载的时候还要勾选 在程序区结束处添加重要测试参数
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表