找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STC12C5A60S2单片机A/D转换函数C语言程序模板

[复制链接]
跳转到指定楼层
楼主
ID:76190 发表于 2015-4-5 17:16 | 只看该作者 回帖奖励 |正序浏览 |阅读模式


1. STC12C5A60S2系列内置10位ADC,STC12C2052AD系列内置8位ADC。
2. 在使用ADC功能时,应将其输入端的I/O接口设置为高阻输入工作方式。
3. 更改ADC通道时须同时将对应的IO接口修改为高阻输入。
4. STC12C5A60S2系列的10位ADC数据中,高8位存放在ADC_RES中,低2位存放在ADC_RESL中。
STC12C5A60S2.h头文件中对ADC部分的定义如下:
sfr ADC_CONTR = 0xBC; //A/D 转换控制寄存器 ADC_POWER SPEED1 SPEED0 ADC_FLAG ADC_START CHS2 CHS1 CHS0 0000,0000
sfr ADC_RES  = 0xBD;  //A/D 转换结果高8位 ADCV.9 ADCV.8 ADCV.7 ADCV.6 ADCV.5 ADCV.4 ADCV.3 ADCV.2  0000,0000
sfr ADC_RESL = 0xBE;  //A/D 转换结果低2位                                           ADCV.1 ADCV.0  0000,0000
可将其模板下载到本地硬盘,在编写新程序的时候复制、粘贴到工程当中,然后根据情况写入具体内容。

  1. /*********************************************************************************************
  2. 函数名:8位A/D转换初始化函数
  3. 调  用:Read (?);
  4. 参  数:输入的端口(0000 0XXX 其中XXX是设置输入端口号,可用十进制0~7表示,0表示P1.0,7表示P1.7)
  5. 返回值:无
  6. 结  果:开启ADC功能并设置ADC的输入端口
  7. 备  注:适用于STC12C2052AD系列单片机(必须使用STC12C2052AD.h头文件)
  8. /**********************************************************************************************/
  9. void Read_init (unsigned char CHA){
  10. unsigned char AD_FIN=0; //存储A/D转换标志
  11.     CHA &= 0x07;            //选择ADC的8个接口中的一个(0000 0111 清0高5位)
  12.     ADC_CONTR = 0x40;  //ADC转换的速度(0XX0 0000 其中XX控制速度,请根据数据手册设置)
  13.     _nop_();
  14.     ADC_CONTR |= CHA;       //选择A/D当前通道
  15.     _nop_();
  16.     ADC_CONTR |= 0x80;      //启动A/D电源
  17.     DELAY_MS(1);            //使输入电压达到稳定(1ms即可)
  18. }
  19. /**********************************************************************************************/
  20. /*********************************************************************************************
  21. 函数名:8位A/D转换函数
  22. 调  用:? = Read ();
  23. 参  数:无
  24. 返回值:8位的ADC数据
  25. 结  果:读出指定ADC接口的A/D转换值,并返回数值
  26. 备  注:适用于STC12C2052AD系列单片机(必须使用STC12C2052AD.h头文件)
  27. /**********************************************************************************************/
  28. unsigned char Read (void){
  29. unsigned char AD_FIN=0; //存储A/D转换标志
  30.     ADC_CONTR |= 0x08;      //启动A/D转换(0000 1000 令ADCS = 1)
  31.     _nop_();
  32.     _nop_();
  33.     _nop_();
  34.     _nop_();
  35.     while (AD_FIN ==0){     //等待A/D转换结束
  36.         AD_FIN = (ADC_CONTR & 0x10); //0001 0000测试A/D转换结束否
  37.     }
  38.     ADC_CONTR &= 0xE7;      //1111 0111 清ADC_FLAG位, 关闭A/D转换,
  39. return (ADC_DATA);          //返回A/D转换结果(8位)
  40. }
  41. /**********************************************************************************************/
  42. /*********************************************************************************************
  43. 程序名:    8位ADC转换实验程序
  44. 硬件支持:  STC12C2052AD 使用ADC功能 外部晶体12MHz
  45. /*********************************************************************************************
  46. 说明:
  47. PC串口端设置 [ 4800,8,无,1,无 ]
  48. 将ADC读出的数值通过串口以十六进制方式显示。
  49. /*********************************************************************************************/
  50. #include <STC12C2052AD.H> //单片机头文件
  51. #include <intrins.h> //51基本运算(包括_nop_空函数)
  52. /*********************************************************************************************
  53. 函数名:毫秒级CPU延时函数
  54. 调  用:DELAY_MS (?);
  55. 参  数:1~65535(参数不可为0)
  56. 返回值:无
  57. 结  果:占用CPU方式延时与参数数值相同的毫秒时间
  58. 备  注:应用于1T单片机时i<600,应用于12T单片机时i<125
  59. /*********************************************************************************************/
  60. void DELAY_MS (unsigned int a){
  61. unsigned int i;
  62. while( a-- != 0){
  63.   for(i = 0; i < 600; i++);
  64. }
  65. }
  66. /*********************************************************************************************/
  67. /*********************************************************************************************
  68. 函数名:UART串口初始化函数
  69. 调  用:UART_init();
  70. 参  数:无
  71. 返回值:无
  72. 结  果:启动UART串口接收中断,允许串口接收,启动T/C1产生波特率(占用)
  73. 备  注:振荡晶体为12MHz,PC串口端设置 [ 4800,8,无,1,无 ]
  74. /**********************************************************************************************/
  75. void UART_init (void){
  76. //EA = 1; //允许总中断(如不使用中断,可用//屏蔽)
  77. //ES = 1; //允许UART串口的中断
  78. TMOD = 0x20; //定时器T/C1工作方式2
  79. SCON = 0x50; //串口工作方式1,允许串口接收(SCON = 0x40 时禁止串口接收)
  80. TH1 = 0xF3; //定时器初值高8位设置
  81. TL1 = 0xF3; //定时器初值低8位设置
  82. PCON = 0x80; //波特率倍频(屏蔽本句波特率为2400)
  83. TR1 = 1; //定时器启动   
  84. }
  85. /**********************************************************************************************/
  86. /*********************************************************************************************
  87. 函数名:UART串口发送函数
  88. 调  用:UART_T (?);
  89. 参  数:需要UART串口发送的数据(8位/1字节)
  90. 返回值:无
  91. 结  果:将参数中的数据发送给UART串口,确认发送完成后退出
  92. 备  注:
  93. /**********************************************************************************************/
  94. void UART_T (unsigned char UART_data){ //定义串口发送数据变量
  95. SBUF = UART_data; //将接收的数据发送回去
  96. while(TI == 0);  //检查发送中断标志位
  97. TI = 0;   //令发送中断标志位为0(软件清零)
  98. }
  99. /**********************************************************************************************/
  100. /*********************************************************************************************
  101. 函数名:8位A/D转换初始化函数
  102. 调  用:Read (?);
  103. 参  数:输入的端口(0000 0XXX 其中XXX是设置输入端口号,可用十进制0~7表示,0表示P1.0,7表示P1.7)
  104. 返回值:无
  105. 结  果:开启ADC功能并设置ADC的输入端口
  106. 备  注:适用于STC12C2052AD系列单片机(必须使用STC12C2052AD.h头文件)
  107. /**********************************************************************************************/
  108. void Read_init (unsigned char CHA){
  109. unsigned char AD_FIN=0; //存储A/D转换标志
  110.     CHA &= 0x07;            //选择ADC的8个接口中的一个(0000 0111 清0高5位)
  111.     ADC_CONTR = 0x40;  //ADC转换的速度(0XX0 0000 其中XX控制速度,请根据数据手册设置)
  112.     _nop_();
  113.     ADC_CONTR |= CHA;       //选择A/D当前通道
  114.     _nop_();
  115.     ADC_CONTR |= 0x80;      //启动A/D电源
  116.     DELAY_MS(1);            //使输入电压达到稳定(1ms即可)
  117. }
  118. /**********************************************************************************************/
  119. /*********************************************************************************************
  120. 函数名:8位A/D转换函数
  121. 调  用:? = Read ();
  122. 参  数:无
  123. 返回值:8位的ADC数据
  124. 结  果:读出指定ADC接口的A/D转换值,并返回数值
  125. 备  注:适用于STC12C2052AD系列单片机(必须使用STC12C2052AD.h头文件)
  126. /**********************************************************************************************/
  127. unsigned char Read (void){
  128. unsigned char AD_FIN=0; //存储A/D转换标志
  129.     ADC_CONTR |= 0x08;      //启动A/D转换(0000 1000 令ADCS = 1)
  130.     _nop_();
  131.     _nop_();
  132.     _nop_();
  133.     _nop_();
  134.     while (AD_FIN ==0){     //等待A/D转换结束
  135.         AD_FIN = (ADC_CONTR & 0x10); //0001 0000测试A/D转换结束否
  136.     }
  137.     ADC_CONTR &= 0xE7;      //1111 0111 清ADC_FLAG位, 关闭A/D转换,
  138. return (ADC_DATA);          //返回A/D转换结果(8位)
  139. }
  140. /**********************************************************************************************/
  141. /*********************************************************************************************
  142. 函数名:主函数
  143. 调  用:无
  144. 参  数:无
  145. 返回值:无
  146. 结  果:程序开始处,无限循环
  147. 备  注:
  148. /**********************************************************************************************/
  149. void main (void){
  150. unsigned char R;
  151. UART_init();//串口初始程序
  152. Read_init(0);//ADC初始化
  153. P1M0 = 0x01; //P1.7~.0:0000 0001(高阻)//注意:更改ADC通道时须同时将对应的IO接口修改为高阻输入。
  154. P1M1 = 0x00; //P1.7~.0:0000 0000(强推)
  155. while(1){
  156.      R = Read ();
  157.      UART_T (R); //串口小秘书,将ADC读出值送入串口显示
  158. }
  159. }/**********************************************************************************************/
  160. /*************************************************************
  161. /*************************************************************/
  162. /*********************************************************************************************
  163. 函数名:10位A/D转换初始化函数
  164. 调  用:Read_init (?);
  165. 参  数:输入的端口(0000 0XXX 其中XXX是设置输入端口号,可用十进制0~7表示,0表示P1.0,7表示P1.7)
  166. 返回值:无
  167. 结  果:开启ADC功能并设置ADC的输入端口
  168. 备  注:使用ADC功能时需要将对应的IO接口设置为高阻输入方式(例如:P1M1 = 0x01;)
  169. /**********************************************************************************************/
  170. void Read_init (unsigned char CHA){
  171. unsigned char AD_FIN=0; //存储A/D转换标志
  172.     CHA &= 0x07;            //选择ADC的8个接口中的一个(0000 0111 清0高5位)
  173.     ADC_CONTR = 0x40;  //ADC转换的速度(0XX0 0000 其中XX控制速度,请根据数据手册设置)
  174.     _nop_();
  175.     ADC_CONTR |= CHA;       //选择A/D当前通道
  176.     _nop_();
  177.     ADC_CONTR |= 0x80;      //启动A/D电源
  178.     DELAY_MS(1);            //使输入电压达到稳定(1ms即可)
  179. }
  180. /**********************************************************************************************/
  181. /*********************************************************************************************
  182. 函数名:10位A/D转换函数
  183. 调  用:? = ADC_Read();
  184. 参  数:无
  185. 返回值:10位ADC数据高(从0到1023(十进制))
  186. 结  果:读出指定ADC接口的A/D转换值,并返回数值
  187. 备  注:适用于STC12C5A60S2系列单片机(必须使用STC12C5A60S2.h头文件)
  188. /**********************************************************************************************/
  189. unsigned int ADC_Read (void){
  190. unsigned char AD_FIN=0; //存储A/D转换标志
  191.     ADC_CONTR |= 0x08;      //启动A/D转换(0000 1000 令ADCS = 1)
  192.     _nop_();
  193.     _nop_();
  194.     _nop_();
  195.     _nop_();
  196.     while (AD_FIN ==0){     //等待A/D转换结束
  197.         AD_FIN = (ADC_CONTR & 0x10); //0001 0000测试A/D转换结束否
  198.     }
  199.     ADC_CONTR &= 0xE7;      //1111 0111 清ADC_FLAG位, 关闭A/D转换,
  200. return (ADC_RES*4+ADC_RESL);//返回A/D转换结果(10位ADC数据高8位在ADC_RES中,低2位在ADC_RESL中)
  201. }
  202. /**********************************************************************************************/
  203. /*********************************************************************************************
  204. 程序名:    10位ADC转换实验程序
  205. 硬件支持:  STC12C5A60S2 使用10位ADC功能 外部晶体12MHz
  206. 接口说明:  P1.0接口接电位器  
  207. /*********************************************************************************************
  208. 说明:
  209. PC串口端设置 [ 4800,8,无,1,无 ]
  210. 将ADC读出的数值通过串口以十六进制方式显示(第一个数据是ADC高8位,第二个数据是ADC低2位)。
  211. /*********************************************************************************************/
  212. #include <STC12C5A60S2.H> //单片机头文件
  213. #include <intrins.h> //51基本运算(包括_nop_空函数)
  214. /*********************************************************************************************
  215. 函数名:毫秒级CPU延时函数
  216. 调  用:DELAY_MS (?);
  217. 参  数:1~65535(参数不可为0)
  218. 返回值:无
  219. 结  果:占用CPU方式延时与参数数值相同的毫秒时间
  220. 备  注:应用于1T单片机时i<600,应用于12T单片机时i<125
  221. /*********************************************************************************************/
  222. void DELAY_MS (unsigned int a){
  223. unsigned int i;
  224. while( a-- != 0){
  225.   for(i = 0; i < 600; i++);
  226. }
  227. }
  228. /*********************************************************************************************/
  229. /*********************************************************************************************
  230. 函数名:UART串口初始化函数
  231. 调  用:UART_init();
  232. 参  数:无
  233. 返回值:无
  234. 结  果:启动UART串口接收中断,允许串口接收,启动T/C1产生波特率(占用)
  235. 备  注:振荡晶体为12MHz,PC串口端设置 [ 4800,8,无,1,无 ]
  236. /**********************************************************************************************/
  237. void UART_init (void){
  238. //EA = 1; //允许总中断(如不使用中断,可用//屏蔽)
  239. //ES = 1; //允许UART串口的中断
  240. TMOD = 0x20; //定时器T/C1工作方式2
  241. SCON = 0x50; //串口工作方式1,允许串口接收(SCON = 0x40 时禁止串口接收)
  242. TH1 = 0xF3; //定时器初值高8位设置
  243. TL1 = 0xF3; //定时器初值低8位设置
  244. PCON = 0x80; //波特率倍频(屏蔽本句波特率为2400)
  245. TR1 = 1; //定时器启动   
  246. }
  247. /**********************************************************************************************/
  248. /*********************************************************************************************
  249. 函数名:UART串口发送函数
  250. 调  用:UART_T (?);
  251. 参  数:需要UART串口发送的数据(8位/1字节)
  252. 返回值:无
  253. 结  果:将参数中的数据发送给UART串口,确认发送完成后退出
  254. 备  注:
  255. /**********************************************************************************************/
  256. void UART_T (unsigned char UART_data){ //定义串口发送数据变量
  257. SBUF = UART_data; //将接收的数据发送回去
  258. while(TI == 0);  //检查发送中断标志位
  259. TI = 0;   //令发送中断标志位为0(软件清零)
  260. }
  261. /**********************************************************************************************/
  262. /*********************************************************************************************
  263. 函数名:10位A/D转换初始化函数
  264. 调  用:Read_init (?);
  265. 参  数:输入的端口(0000 0XXX 其中XXX是设置输入端口号,可用十进制0~7表示,0表示P1.0,7表示P1.7)
  266. 返回值:无
  267. 结  果:开启ADC功能并设置ADC的输入端口
  268. 备  注:适用于STC12C5A60S2系列单片机(必须使用STC12C5A60S2.h头文件)
  269. /**********************************************************************************************/
  270. void Read_init (unsigned char CHA){
  271. unsigned char AD_FIN=0; //存储A/D转换标志
  272.     CHA &= 0x07;            //选择ADC的8个接口中的一个(0000 0111 清0高5位)
  273.     ADC_CONTR = 0x40;  //ADC转换的速度(0XX0 0000 其中XX控制速度,请根据数据手册设置)
  274.     _nop_();
  275.     ADC_CONTR |= CHA;       //选择A/D当前通道
  276.     _nop_();
  277.     ADC_CONTR |= 0x80;      //启动A/D电源
  278.     DELAY_MS(1);            //使输入电压达到稳定(1ms即可)
  279. }
  280. /**********************************************************************************************/
  281. /*********************************************************************************************
  282. 函数名:10位A/D转换函数
  283. 调  用:ADC_Read ();
  284. 参  数:无
  285. 返回值:无(10位ADC数据高8位存放在ADC_RES中,低2位存放在ADC_RESL中)
  286. 结  果:读出指定ADC接口的A/D转换值,并返回数值
  287. 备  注:适用于STC12C5A60S2系列单片机(必须使用STC12C5A60S2.h头文件)
  288. /**********************************************************************************************/
  289. void ADC_Read (void){
  290. unsigned char AD_FIN=0; //存储A/D转换标志
  291.     ADC_CONTR |= 0x08;      //启动A/D转换(0000 1000 令ADCS = 1)
  292.     _nop_();
  293.     _nop_();
  294.     _nop_();
  295.     _nop_();
  296.     while (AD_FIN ==0){     //等待A/D转换结束
  297.         AD_FIN = (ADC_CONTR & 0x10); //0001 0000测试A/D转换结束否
  298.     }
  299.     ADC_CONTR &= 0xE7;      //1111 0111 清ADC_FLAG位, 关闭A/D转换,
  300. }
  301. /**********************************************************************************************/
  302. /*********************************************************************************************
  303. 函数名:主函数
  304. 调  用:无
  305. 参  数:无
  306. 返回值:无
  307. 结  果:程序开始处,无限循环
  308. 备  注:
  309. /**********************************************************************************************/
  310. void main (void){
  311. UART_init();//串口初始程序
  312. Read_init(0);//ADC初始化
  313. P1M1 = 0x01; //P1.7~P1.0:0000 0001(高阻)//注意:更改ADC通道时须同时将对应的IO接口修改为高阻输入。
  314. P1M0 = 0x00; //P1.7~P1.0:0000 0000(强推)
  315. while(1){
  316.      ADC_Read ();//调用ADC转换程序
  317.      UART_T (ADC_RES); //串口小秘书,将ADC读出值高8位送入串口  0000 0000
  318.      UART_T (ADC_RESL); //串口小秘书,将ADC读出值低2位送入串口  XXXX XX00
  319. }
  320. }
  321. /**********************************************************************************************/
复制代码





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

使用道具 举报

沙发
ID:85598 发表于 2015-8-1 20:24 | 只看该作者
好帖!希望楼主续上四位LED数码管(共阴)显示部分!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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