单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 983|回复: 3
打印 上一主题 下一主题
收起左侧

STC15W1K16PWM单片机自带的ADC转换程序

[复制链接]
跳转到指定楼层
楼主
dabing89 发表于 2018-10-12 09:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
实用的AD转换程序,废话不多说,直接上传代码 007 实用的AD转换器的使用.rar (50.8 KB, 下载次数: 11)

  1. /*******************************************************************************
  2. * 文件名: ADC转换器使用
  3. * 描  述: 电池电压
  4. * 功  能:中断方式
  5. * 作  者:大核桃
  6. * 版本号:1.0.1(2017.05.23)
  7. *******************************************************************************/
  8. #include "stc15w.h"//头文件
  9. #include "intrins.h"



  10. /*******************************************************************************
  11. * 文件名: 重定义
  12. * 描  述:   
  13. * 功  能:
  14. * 作  者:大核桃
  15. * 版本号:1.0.1(2017.05.23)
  16. *******************************************************************************/
  17. typedef unsigned char uint8;
  18. typedef unsigned int  uint16;
  19. typedef unsigned long uint32;

  20. #define ADC_POWER   0x80            //ADC电源控制位
  21. #define ADC_FLAG    0x10            //ADC完成标志
  22. #define ADC_START   0x08            //ADC起始控制位
  23. #define ADC_SPEEDLL 0x00            //540个时钟
  24. //#define ADC_SPEEDL  0x20            //360个时钟
  25. //#define ADC_SPEEDH  0x40            //180个时钟
  26. //#define ADC_SPEEDHH 0x60            //90个时钟

  27. /*******************************************************************************
  28. * 文件名:全局变量定义区域
  29. * 描  述:
  30. * 功  能:
  31. * 作  者:大核桃
  32. * 版本号:1.0.1(2015.03.03)
  33. *******************************************************************************/
  34. uint8 val,ch;
  35. uint16 temp;
  36. bit flag_ad2 = 0;//电压采集完成标志
  37. bit flag_coll1 = 0;//数据采集间隔
  38. uint16 Adresult_val = 0;//采集的AD数值xx
  39. uint8 ad_count = 0; //采集AD的次数计数器

  40. /*******************************************************************************
  41. * 文件名:共阳数码管真值表
  42. * 描  述:
  43. * 功  能:
  44. * 作  者:大核桃
  45. * 版本号:1.0.1(2015.03.03)
  46. *******************************************************************************/
  47. code uint8 LedChar[] = {
  48.         0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
  49.         0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff,0xc1
  50. };

  51. /*******************************************************************************
  52. * 文件名:单独位定义
  53. * 描  述:   
  54. * 功  能:
  55. * 作  者:大核桃
  56. * 版本号:1.0.1(2017.05.23)
  57. *******************************************************************************/
  58. sbit LED0 = P1^0;//第1组LED
  59. sbit LED1 = P1^1;//第2组LED
  60. sbit LED2 = P1^2;//第3组LED                                 
  61. sbit LED3 = P1^3;//第4组LED
  62. sbit LED4 = P1^4;//第5组LED
  63. sbit LED5 = P3^2;//第6组LED
  64. sbit LED6 = P0^0;//第7组LED
  65. sbit LED7 = P0^1;//第8组LED

  66. sbit LEDS1 = P3^3;//数码管1
  67. sbit LEDS2 = P3^4;//数码管2
  68. sbit LEDS3 = P3^6;//数码管3
  69. sbit LEDS4 = P3^7;//数码管4

  70. /*******************************************************************************
  71. * 文件名:函数前置声明
  72. * 描  述:   
  73. * 功  能:
  74. * 作  者:大核桃
  75. * 版本号:1.0.1(2017.05.23)
  76. *******************************************************************************/
  77. void Mcu_Port_Init();
  78. void LedScan();
  79. void Delay500ms(); //24MHZ
  80. void Time0_Init();//定时器0
  81. void InitADC(void);
  82. uint16 VolTage_Monitor(uint8 times); //AD转换与查表处理程序

  83. /*******************************************************************************
  84. * 文件名
  85. * 描  述: 主函数  
  86. * 功  能:入口
  87. * 作  者:大核桃
  88. * 版本号:1.0.1(2017.05.23)
  89. *******************************************************************************/
  90. void main(void)
  91. {                                       
  92.         Mcu_Port_Init();//IO上电初始化
  93.         Time0_Init();
  94.         InitADC();

  95.         while(1)
  96.         {
  97.                 VolTage_Monitor(16);//采集16次数据
  98.         }
  99. }

  100. /*******************************************************************************
  101. * 文件名:void LedScan()
  102. * 描  述: LED刷新
  103. * 功  能:
  104. * 作  者:大核桃
  105. * 版本号:1.0.1(2017.05.23)
  106. *******************************************************************************/
  107. void LedScan()
  108. {
  109.         static uint8 i = 0;

  110.         P2 = 0Xff;
  111.         switch(i)
  112.         {
  113.                 case 0: LEDS4 = 0;LEDS1 = 1;P2 = 0x7f & LedChar[16];i++;break;
  114.                 case 1: LEDS1 = 0;LEDS2 = 1;P2 = LedChar[val / 10 % 10];i++;break;
  115.                 case 2: LEDS2 = 0;LEDS3 = 1;P2 = LedChar[val % 10];i++;break;
  116.                 case 3: LEDS3 = 0;LEDS4 = 1;P2 = LedChar[17];i = 0;break;

  117.                 default:break;
  118.         }
  119. }

  120. /*******************************************************************************
  121. * 文件名:void InitADC(void)
  122. * 描  述: //初始化 AD 转换
  123. * 功  能:
  124. * 作  者:大核桃
  125. * 版本号:1.0.1(2015.03.03)
  126. *******************************************************************************/
  127. void InitADC(void)
  128. {
  129.         P1ASF = 0xE0; //设置 P1 口为模拟口
  130.         ADC_RES = 0; //清除结果寄存器
  131.         CLK_DIV |= 0x20; //ADRJ 为 1,ADC_RES 存放高两位结果,ADC_RESL 存放低 8 位结果
  132.     //ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START;
  133.         ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START;                    //ADC上电并延时
  134. }

  135. /*******************************************************************************
  136. * 文件名:void adc_isr() interrupt 5 using 1
  137. * 描  述: 中断服务程序
  138. * 功  能:
  139. * 作  者:大核桃
  140. * 版本号:1.0.1(2015.03.03)
  141. *******************************************************************************/
  142. void adc_isr() interrupt 5 using 1
  143. {
  144.         EADC = 1;//开ADC中断

  145.         ADC_CONTR &= !ADC_FLAG; //清除ADC中断标志
  146.         temp = ADC_RES;
  147.         temp <<= 8;
  148.         temp |= ADC_RESL;
  149.         flag_ad2 = 1; //电压采集完成标志
  150.         ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | 5;

  151.         EADC = 0;//关闭中断               

  152. }

  153. /*******************************************************************************
  154. * 文件名:VolTage_Monitor(void);
  155. * 描  述: 电压结果计算
  156. * 功  能:模编程块化
  157. * 作  者:大核桃
  158. * 版本号:1.0.1(2015.03.03)
  159. *******************************************************************************/
  160. uint16 VolTage_Monitor(uint8 times) //AD转换与查表处理程序
  161. {
  162.    if(flag_coll1) //每次采集AD的时间间隔标志位
  163.    {
  164.                 if(ad_count < times)//连续采集16次后再把求总数据的平均值
  165.                 {
  166.                         if(flag_ad2 == 1)   //完成一次AD采样
  167.                         {
  168.                                 flag_ad2 = 0;  //清除完成一次采样的标志位

  169.                                 Adresult_val = Adresult_val + temp;
  170.                                 ad_count++;
  171.                                 ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | 5;
  172.                         }
  173.                 } //右移动一位数据就相当于整除以2
  174.                 else  //已经采集完16次数据,这个时候把总累加数据除以16就可以求得平均值了
  175.                 {
  176.                         Adresult_val >>= 4;
  177.                         val = ((Adresult_val) * 2 * (3.3 / 1023) * 10);//放大10
  178.                         Adresult_val = 0; //AD暂存清零
  179.                         temp = 0;        //把采集AD的结果清零
  180.                         ad_count = 0;     //把采集次数重新清零
  181.                 }
  182.    }

  183.    return  val;//返回采集的电压数值
  184. }

  185. /*******************************************************************************
  186. * 文件名:void Time0_Init()
  187. * 描  述: 定时器0初始化
  188. * 功  能:10毫秒@11.0592MHz
  189. * 作  者:大核桃
  190. * 版本号:1.0.1(2017.05.23)
  191. *******************************************************************************/
  192. void Time0_Init(void)
  193. {
  194.         AUXR |= 0x80;   //定时器时钟1T模式
  195.         TMOD &= 0xF0;        //设置定时器模式
  196.         TL0 = 0xCD;                //设置定时初值
  197.         TH0 = 0xD4;                //设置定时初值
  198.         ET0 = 1;
  199.         TR0 = 1;                //定时器0开始计时
  200.         EA = 1;               
  201. }
  202. /*******************************************************************************
  203. * 文件名:
  204. * 描  述: 中断函数
  205. * 功  能:1毫秒@11.0592MHz
  206. * 作  者:大核桃
  207. * 版本号:1.0.1(2017.05.23)
  208. *******************************************************************************/
  209. void ET0_IRQHandler() interrupt 1
  210. {
  211.         static uint8 tmrcoll1 = 0;//数据采集间隔

  212.         EADC = 0;  //在定时中断中禁止AD中断

  213.     TL0 = 0xCD;                //设置定时初值
  214.         TH0 = 0xD4;                //设置定时初值

  215.         tmrcoll1++;//数据采集时间累加
  216.         if(tmrcoll1 >= 2) // 2 = 2ms  500HZ                                                                                                                                                                          //166*100 =16.6MS  
  217.         {
  218.             tmrcoll1 = 0;
  219.                 flag_coll1 = 1;//数据采集间隔标志位 2ms读取一次数据
  220.         }

  221.         LedScan();

  222.         EADC = 1;  //在定时中断中打开AD中断
  223.                         
  224. }

  225. /*******************************************************************************
  226. * 文件名:void Mcu_Port_Init()
  227. * 描  述: io初始化
  228. * 功  能:
  229. * 作  者:大核桃
  230. * 版本号:1.0.1(2017.05.23)
  231. *******************************************************************************/
  232. void Mcu_Port_Init()
  233. {
  234.         IE = 0xa8;//允许AD转换
  235.         //将P0口低二位配置为推挽输出
  236.         //234567位配置位高阻输入
  237.         P0M1 = 0xFC;//1111 1100
  238.         P0M0 = 0X03;//0000 0011
  239.         //P0 = 0X01;//第6个
  240.         //P0 = 0X02;//第7个
  241.         //高3位配置高阻输入,用作模拟口
  242.         //其他配置推挽输出,驱动LED
  243.         P1M1 = 0xE0;//1110 0000
  244.         P1M0 = 0X1F;//0001 1111
  245.         //P2口配置准双向口
  246.         P2M1 = 0X00;
  247.         P2M0 = 0X00;
  248.         P2 = 0Xff; //上电为1111 1111


  249. //        //P54,P55口为推挽输出
  250.         P5M1 = 0X00;
  251.         P5M0 = 0X00;
  252.         P5 = 0xFF;

  253.         //P37,P36,3.2,P3.3 P3.4口为推挽输出
  254.         P3M1 = 0X00;
  255.         P3M0 = 0XFC;
  256.         P3 = 0X23; //0010 0111//第5个LED端口
  257.         
  258.         LED0 = 0;//第1组LED,如果使能请置为1
  259.         LED1 = 0;
  260.         LED2 = 0;
  261.         LED3 = 0;
  262.         LED4 = 0;
  263.         LED5 = 0;
  264.         LED6 = 0;
  265.         LED7 = 0;        
  266. }

  267. /*******************************************************************************
  268. * 文件名:void Delay500ms()                //@24.000MHz
  269. * 描  述:Y5内核延时
  270. * 功  能:
  271. * 作  者:大核桃
  272. * 版本号:1.0.1(2017.05.23)
  273. *******************************************************************************/
  274. void Delay500ms()                //@24.000MHz
  275. {
  276.         unsigned char i, j, k;

  277.         _nop_();
  278.         _nop_();
  279.         i = 46;
  280.         j = 153;
  281.         k = 245;
  282.         do
  283.         {
  284.                 do
  285.                 {
  286.                         while (--k);
  287.                 } while (--j);
  288.         } while (--i);
  289. }

复制代码



评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享 分享淘帖 顶 踩
回复

使用道具 举报

沙发
admin 发表于 2018-10-12 16:32 | 只看该作者
ad型号是什么 电路能分享下吗?
回复

使用道具 举报

板凳
 楼主| dabing89 发表于 2018-10-12 22:15 | 只看该作者
admin 发表于 2018-10-12 16:32
ad型号是什么 电路能分享下吗?

谢老大回复,是单片机的内部ADC,STC15W1K16PWM,电子时钟原理图已经上传
回复

使用道具 举报

地板
时光倒影 发表于 2018-12-13 11:49 | 只看该作者
谢谢楼主分享
回复

使用道具 举报

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

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51黑电子论坛单片机. 联系QQ:125739409;技术交流QQ群582644647

Powered by 单片机教程网

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