標(biāo)題: STC12C5A60S2單片機(jī)A/D轉(zhuǎn)換函數(shù)C語言程序模板 [打印本頁]

作者: xiashan    時(shí)間: 2015-4-5 17:16
標(biāo)題: STC12C5A60S2單片機(jī)A/D轉(zhuǎn)換函數(shù)C語言程序模板


1. STC12C5A60S2系列內(nèi)置10位ADC,STC12C2052AD系列內(nèi)置8位ADC。
2. 在使用ADC功能時(shí),應(yīng)將其輸入端的I/O接口設(shè)置為高阻輸入工作方式。
3. 更改ADC通道時(shí)須同時(shí)將對(duì)應(yīng)的IO接口修改為高阻輸入。
4. STC12C5A60S2系列的10位ADC數(shù)據(jù)中,高8位存放在ADC_RES中,低2位存放在ADC_RESL中。
STC12C5A60S2.h頭文件中對(duì)ADC部分的定義如下:
sfr ADC_CONTR = 0xBC; //A/D 轉(zhuǎn)換控制寄存器 ADC_POWER SPEED1 SPEED0 ADC_FLAG ADC_START CHS2 CHS1 CHS0 0000,0000
sfr ADC_RES  = 0xBD;  //A/D 轉(zhuǎn)換結(jié)果高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 轉(zhuǎn)換結(jié)果低2位                                           ADCV.1 ADCV.0  0000,0000
可將其模板下載到本地硬盤,在編寫新程序的時(shí)候復(fù)制、粘貼到工程當(dāng)中,然后根據(jù)情況寫入具體內(nèi)容。

  1. /*********************************************************************************************
  2. 函數(shù)名:8位A/D轉(zhuǎn)換初始化函數(shù)
  3. 調(diào)  用:Read (?);
  4. 參  數(shù):輸入的端口(0000 0XXX 其中XXX是設(shè)置輸入端口號(hào),可用十進(jìn)制0~7表示,0表示P1.0,7表示P1.7)
  5. 返回值:無
  6. 結(jié)  果:開啟ADC功能并設(shè)置ADC的輸入端口
  7. 備  注:適用于STC12C2052AD系列單片機(jī)(必須使用STC12C2052AD.h頭文件)
  8. /**********************************************************************************************/
  9. void Read_init (unsigned char CHA){
  10. unsigned char AD_FIN=0; //存儲(chǔ)A/D轉(zhuǎn)換標(biāo)志
  11.     CHA &= 0x07;            //選擇ADC的8個(gè)接口中的一個(gè)(0000 0111 清0高5位)
  12.     ADC_CONTR = 0x40;  //ADC轉(zhuǎn)換的速度(0XX0 0000 其中XX控制速度,請(qǐng)根據(jù)數(shù)據(jù)手冊(cè)設(shè)置)
  13.     _nop_();
  14.     ADC_CONTR |= CHA;       //選擇A/D當(dāng)前通道
  15.     _nop_();
  16.     ADC_CONTR |= 0x80;      //啟動(dòng)A/D電源
  17.     DELAY_MS(1);            //使輸入電壓達(dá)到穩(wěn)定(1ms即可)
  18. }
  19. /**********************************************************************************************/
  20. /*********************************************************************************************
  21. 函數(shù)名:8位A/D轉(zhuǎn)換函數(shù)
  22. 調(diào)  用:? = Read ();
  23. 參  數(shù):無
  24. 返回值:8位的ADC數(shù)據(jù)
  25. 結(jié)  果:讀出指定ADC接口的A/D轉(zhuǎn)換值,并返回?cái)?shù)值
  26. 備  注:適用于STC12C2052AD系列單片機(jī)(必須使用STC12C2052AD.h頭文件)
  27. /**********************************************************************************************/
  28. unsigned char Read (void){
  29. unsigned char AD_FIN=0; //存儲(chǔ)A/D轉(zhuǎn)換標(biāo)志
  30.     ADC_CONTR |= 0x08;      //啟動(dòng)A/D轉(zhuǎn)換(0000 1000 令A(yù)DCS = 1)
  31.     _nop_();
  32.     _nop_();
  33.     _nop_();
  34.     _nop_();
  35.     while (AD_FIN ==0){     //等待A/D轉(zhuǎn)換結(jié)束
  36.         AD_FIN = (ADC_CONTR & 0x10); //0001 0000測試A/D轉(zhuǎn)換結(jié)束否
  37.     }
  38.     ADC_CONTR &= 0xE7;      //1111 0111 清ADC_FLAG位, 關(guān)閉A/D轉(zhuǎn)換,
  39. return (ADC_DATA);          //返回A/D轉(zhuǎn)換結(jié)果(8位)
  40. }
  41. /**********************************************************************************************/
  42. /*********************************************************************************************
  43. 程序名:    8位ADC轉(zhuǎn)換實(shí)驗(yàn)程序
  44. 硬件支持:  STC12C2052AD 使用ADC功能 外部晶體12MHz
  45. /*********************************************************************************************
  46. 說明:
  47. PC串口端設(shè)置 [ 4800,8,無,1,無 ]
  48. 將ADC讀出的數(shù)值通過串口以十六進(jìn)制方式顯示。
  49. /*********************************************************************************************/
  50. #include <STC12C2052AD.H> //單片機(jī)頭文件
  51. #include <intrins.h> //51基本運(yùn)算(包括_nop_空函數(shù))
  52. /*********************************************************************************************
  53. 函數(shù)名:毫秒級(jí)CPU延時(shí)函數(shù)
  54. 調(diào)  用:DELAY_MS (?);
  55. 參  數(shù):1~65535(參數(shù)不可為0)
  56. 返回值:無
  57. 結(jié)  果:占用CPU方式延時(shí)與參數(shù)數(shù)值相同的毫秒時(shí)間
  58. 備  注:應(yīng)用于1T單片機(jī)時(shí)i<600,應(yīng)用于12T單片機(jī)時(shí)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. 函數(shù)名:UART串口初始化函數(shù)
  69. 調(diào)  用:UART_init();
  70. 參  數(shù):無
  71. 返回值:無
  72. 結(jié)  果:啟動(dòng)UART串口接收中斷,允許串口接收,啟動(dòng)T/C1產(chǎn)生波特率(占用)
  73. 備  注:振蕩晶體為12MHz,PC串口端設(shè)置 [ 4800,8,無,1,無 ]
  74. /**********************************************************************************************/
  75. void UART_init (void){
  76. //EA = 1; //允許總中斷(如不使用中斷,可用//屏蔽)
  77. //ES = 1; //允許UART串口的中斷
  78. TMOD = 0x20; //定時(shí)器T/C1工作方式2
  79. SCON = 0x50; //串口工作方式1,允許串口接收(SCON = 0x40 時(shí)禁止串口接收)
  80. TH1 = 0xF3; //定時(shí)器初值高8位設(shè)置
  81. TL1 = 0xF3; //定時(shí)器初值低8位設(shè)置
  82. PCON = 0x80; //波特率倍頻(屏蔽本句波特率為2400)
  83. TR1 = 1; //定時(shí)器啟動(dòng)   
  84. }
  85. /**********************************************************************************************/
  86. /*********************************************************************************************
  87. 函數(shù)名:UART串口發(fā)送函數(shù)
  88. 調(diào)  用:UART_T (?);
  89. 參  數(shù):需要UART串口發(fā)送的數(shù)據(jù)(8位/1字節(jié))
  90. 返回值:無
  91. 結(jié)  果:將參數(shù)中的數(shù)據(jù)發(fā)送給UART串口,確認(rèn)發(fā)送完成后退出
  92. 備  注:
  93. /**********************************************************************************************/
  94. void UART_T (unsigned char UART_data){ //定義串口發(fā)送數(shù)據(jù)變量
  95. SBUF = UART_data; //將接收的數(shù)據(jù)發(fā)送回去
  96. while(TI == 0);  //檢查發(fā)送中斷標(biāo)志位
  97. TI = 0;   //令發(fā)送中斷標(biāo)志位為0(軟件清零)
  98. }
  99. /**********************************************************************************************/
  100. /*********************************************************************************************
  101. 函數(shù)名:8位A/D轉(zhuǎn)換初始化函數(shù)
  102. 調(diào)  用:Read (?);
  103. 參  數(shù):輸入的端口(0000 0XXX 其中XXX是設(shè)置輸入端口號(hào),可用十進(jìn)制0~7表示,0表示P1.0,7表示P1.7)
  104. 返回值:無
  105. 結(jié)  果:開啟ADC功能并設(shè)置ADC的輸入端口
  106. 備  注:適用于STC12C2052AD系列單片機(jī)(必須使用STC12C2052AD.h頭文件)
  107. /**********************************************************************************************/
  108. void Read_init (unsigned char CHA){
  109. unsigned char AD_FIN=0; //存儲(chǔ)A/D轉(zhuǎn)換標(biāo)志
  110.     CHA &= 0x07;            //選擇ADC的8個(gè)接口中的一個(gè)(0000 0111 清0高5位)
  111.     ADC_CONTR = 0x40;  //ADC轉(zhuǎn)換的速度(0XX0 0000 其中XX控制速度,請(qǐng)根據(jù)數(shù)據(jù)手冊(cè)設(shè)置)
  112.     _nop_();
  113.     ADC_CONTR |= CHA;       //選擇A/D當(dāng)前通道
  114.     _nop_();
  115.     ADC_CONTR |= 0x80;      //啟動(dòng)A/D電源
  116.     DELAY_MS(1);            //使輸入電壓達(dá)到穩(wěn)定(1ms即可)
  117. }
  118. /**********************************************************************************************/
  119. /*********************************************************************************************
  120. 函數(shù)名:8位A/D轉(zhuǎn)換函數(shù)
  121. 調(diào)  用:? = Read ();
  122. 參  數(shù):無
  123. 返回值:8位的ADC數(shù)據(jù)
  124. 結(jié)  果:讀出指定ADC接口的A/D轉(zhuǎn)換值,并返回?cái)?shù)值
  125. 備  注:適用于STC12C2052AD系列單片機(jī)(必須使用STC12C2052AD.h頭文件)
  126. /**********************************************************************************************/
  127. unsigned char Read (void){
  128. unsigned char AD_FIN=0; //存儲(chǔ)A/D轉(zhuǎn)換標(biāo)志
  129.     ADC_CONTR |= 0x08;      //啟動(dòng)A/D轉(zhuǎn)換(0000 1000 令A(yù)DCS = 1)
  130.     _nop_();
  131.     _nop_();
  132.     _nop_();
  133.     _nop_();
  134.     while (AD_FIN ==0){     //等待A/D轉(zhuǎn)換結(jié)束
  135.         AD_FIN = (ADC_CONTR & 0x10); //0001 0000測試A/D轉(zhuǎn)換結(jié)束否
  136.     }
  137.     ADC_CONTR &= 0xE7;      //1111 0111 清ADC_FLAG位, 關(guān)閉A/D轉(zhuǎn)換,
  138. return (ADC_DATA);          //返回A/D轉(zhuǎn)換結(jié)果(8位)
  139. }
  140. /**********************************************************************************************/
  141. /*********************************************************************************************
  142. 函數(shù)名:主函數(shù)
  143. 調(diào)  用:無
  144. 參  數(shù):無
  145. 返回值:無
  146. 結(jié)  果:程序開始處,無限循環(huán)
  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通道時(shí)須同時(shí)將對(duì)應(yīng)的IO接口修改為高阻輸入。
  154. P1M1 = 0x00; //P1.7~.0:0000 0000(強(qiáng)推)
  155. while(1){
  156.      R = Read ();
  157.      UART_T (R); //串口小秘書,將ADC讀出值送入串口顯示
  158. }
  159. }/**********************************************************************************************/
  160. /*************************************************************
  161. /*************************************************************/
  162. /*********************************************************************************************
  163. 函數(shù)名:10位A/D轉(zhuǎn)換初始化函數(shù)
  164. 調(diào)  用:Read_init (?);
  165. 參  數(shù):輸入的端口(0000 0XXX 其中XXX是設(shè)置輸入端口號(hào),可用十進(jìn)制0~7表示,0表示P1.0,7表示P1.7)
  166. 返回值:無
  167. 結(jié)  果:開啟ADC功能并設(shè)置ADC的輸入端口
  168. 備  注:使用ADC功能時(shí)需要將對(duì)應(yīng)的IO接口設(shè)置為高阻輸入方式(例如:P1M1 = 0x01;)
  169. /**********************************************************************************************/
  170. void Read_init (unsigned char CHA){
  171. unsigned char AD_FIN=0; //存儲(chǔ)A/D轉(zhuǎn)換標(biāo)志
  172.     CHA &= 0x07;            //選擇ADC的8個(gè)接口中的一個(gè)(0000 0111 清0高5位)
  173.     ADC_CONTR = 0x40;  //ADC轉(zhuǎn)換的速度(0XX0 0000 其中XX控制速度,請(qǐng)根據(jù)數(shù)據(jù)手冊(cè)設(shè)置)
  174.     _nop_();
  175.     ADC_CONTR |= CHA;       //選擇A/D當(dāng)前通道
  176.     _nop_();
  177.     ADC_CONTR |= 0x80;      //啟動(dòng)A/D電源
  178.     DELAY_MS(1);            //使輸入電壓達(dá)到穩(wěn)定(1ms即可)
  179. }
  180. /**********************************************************************************************/
  181. /*********************************************************************************************
  182. 函數(shù)名:10位A/D轉(zhuǎn)換函數(shù)
  183. 調(diào)  用:? = ADC_Read();
  184. 參  數(shù):無
  185. 返回值:10位ADC數(shù)據(jù)高(從0到1023(十進(jìn)制))
  186. 結(jié)  果:讀出指定ADC接口的A/D轉(zhuǎn)換值,并返回?cái)?shù)值
  187. 備  注:適用于STC12C5A60S2系列單片機(jī)(必須使用STC12C5A60S2.h頭文件)
  188. /**********************************************************************************************/
  189. unsigned int ADC_Read (void){
  190. unsigned char AD_FIN=0; //存儲(chǔ)A/D轉(zhuǎn)換標(biāo)志
  191.     ADC_CONTR |= 0x08;      //啟動(dòng)A/D轉(zhuǎn)換(0000 1000 令A(yù)DCS = 1)
  192.     _nop_();
  193.     _nop_();
  194.     _nop_();
  195.     _nop_();
  196.     while (AD_FIN ==0){     //等待A/D轉(zhuǎn)換結(jié)束
  197.         AD_FIN = (ADC_CONTR & 0x10); //0001 0000測試A/D轉(zhuǎn)換結(jié)束否
  198.     }
  199.     ADC_CONTR &= 0xE7;      //1111 0111 清ADC_FLAG位, 關(guān)閉A/D轉(zhuǎn)換,
  200. return (ADC_RES*4+ADC_RESL);//返回A/D轉(zhuǎn)換結(jié)果(10位ADC數(shù)據(jù)高8位在ADC_RES中,低2位在ADC_RESL中)
  201. }
  202. /**********************************************************************************************/
  203. /*********************************************************************************************
  204. 程序名:    10位ADC轉(zhuǎn)換實(shí)驗(yàn)程序
  205. 硬件支持:  STC12C5A60S2 使用10位ADC功能 外部晶體12MHz
  206. 接口說明:  P1.0接口接電位器  
  207. /*********************************************************************************************
  208. 說明:
  209. PC串口端設(shè)置 [ 4800,8,無,1,無 ]
  210. 將ADC讀出的數(shù)值通過串口以十六進(jìn)制方式顯示(第一個(gè)數(shù)據(jù)是ADC高8位,第二個(gè)數(shù)據(jù)是ADC低2位)。
  211. /*********************************************************************************************/
  212. #include <STC12C5A60S2.H> //單片機(jī)頭文件
  213. #include <intrins.h> //51基本運(yùn)算(包括_nop_空函數(shù))
  214. /*********************************************************************************************
  215. 函數(shù)名:毫秒級(jí)CPU延時(shí)函數(shù)
  216. 調(diào)  用:DELAY_MS (?);
  217. 參  數(shù):1~65535(參數(shù)不可為0)
  218. 返回值:無
  219. 結(jié)  果:占用CPU方式延時(shí)與參數(shù)數(shù)值相同的毫秒時(shí)間
  220. 備  注:應(yīng)用于1T單片機(jī)時(shí)i<600,應(yīng)用于12T單片機(jī)時(shí)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. 函數(shù)名:UART串口初始化函數(shù)
  231. 調(diào)  用:UART_init();
  232. 參  數(shù):無
  233. 返回值:無
  234. 結(jié)  果:啟動(dòng)UART串口接收中斷,允許串口接收,啟動(dòng)T/C1產(chǎn)生波特率(占用)
  235. 備  注:振蕩晶體為12MHz,PC串口端設(shè)置 [ 4800,8,無,1,無 ]
  236. /**********************************************************************************************/
  237. void UART_init (void){
  238. //EA = 1; //允許總中斷(如不使用中斷,可用//屏蔽)
  239. //ES = 1; //允許UART串口的中斷
  240. TMOD = 0x20; //定時(shí)器T/C1工作方式2
  241. SCON = 0x50; //串口工作方式1,允許串口接收(SCON = 0x40 時(shí)禁止串口接收)
  242. TH1 = 0xF3; //定時(shí)器初值高8位設(shè)置
  243. TL1 = 0xF3; //定時(shí)器初值低8位設(shè)置
  244. PCON = 0x80; //波特率倍頻(屏蔽本句波特率為2400)
  245. TR1 = 1; //定時(shí)器啟動(dòng)   
  246. }
  247. /**********************************************************************************************/
  248. /*********************************************************************************************
  249. 函數(shù)名:UART串口發(fā)送函數(shù)
  250. 調(diào)  用:UART_T (?);
  251. 參  數(shù):需要UART串口發(fā)送的數(shù)據(jù)(8位/1字節(jié))
  252. 返回值:無
  253. 結(jié)  果:將參數(shù)中的數(shù)據(jù)發(fā)送給UART串口,確認(rèn)發(fā)送完成后退出
  254. 備  注:
  255. /**********************************************************************************************/
  256. void UART_T (unsigned char UART_data){ //定義串口發(fā)送數(shù)據(jù)變量
  257. SBUF = UART_data; //將接收的數(shù)據(jù)發(fā)送回去
  258. while(TI == 0);  //檢查發(fā)送中斷標(biāo)志位
  259. TI = 0;   //令發(fā)送中斷標(biāo)志位為0(軟件清零)
  260. }
  261. /**********************************************************************************************/
  262. /*********************************************************************************************
  263. 函數(shù)名:10位A/D轉(zhuǎn)換初始化函數(shù)
  264. 調(diào)  用:Read_init (?);
  265. 參  數(shù):輸入的端口(0000 0XXX 其中XXX是設(shè)置輸入端口號(hào),可用十進(jìn)制0~7表示,0表示P1.0,7表示P1.7)
  266. 返回值:無
  267. 結(jié)  果:開啟ADC功能并設(shè)置ADC的輸入端口
  268. 備  注:適用于STC12C5A60S2系列單片機(jī)(必須使用STC12C5A60S2.h頭文件)
  269. /**********************************************************************************************/
  270. void Read_init (unsigned char CHA){
  271. unsigned char AD_FIN=0; //存儲(chǔ)A/D轉(zhuǎn)換標(biāo)志
  272.     CHA &= 0x07;            //選擇ADC的8個(gè)接口中的一個(gè)(0000 0111 清0高5位)
  273.     ADC_CONTR = 0x40;  //ADC轉(zhuǎn)換的速度(0XX0 0000 其中XX控制速度,請(qǐng)根據(jù)數(shù)據(jù)手冊(cè)設(shè)置)
  274.     _nop_();
  275.     ADC_CONTR |= CHA;       //選擇A/D當(dāng)前通道
  276.     _nop_();
  277.     ADC_CONTR |= 0x80;      //啟動(dòng)A/D電源
  278.     DELAY_MS(1);            //使輸入電壓達(dá)到穩(wěn)定(1ms即可)
  279. }
  280. /**********************************************************************************************/
  281. /*********************************************************************************************
  282. 函數(shù)名:10位A/D轉(zhuǎn)換函數(shù)
  283. 調(diào)  用:ADC_Read ();
  284. 參  數(shù):無
  285. 返回值:無(10位ADC數(shù)據(jù)高8位存放在ADC_RES中,低2位存放在ADC_RESL中)
  286. 結(jié)  果:讀出指定ADC接口的A/D轉(zhuǎn)換值,并返回?cái)?shù)值
  287. 備  注:適用于STC12C5A60S2系列單片機(jī)(必須使用STC12C5A60S2.h頭文件)
  288. /**********************************************************************************************/
  289. void ADC_Read (void){
  290. unsigned char AD_FIN=0; //存儲(chǔ)A/D轉(zhuǎn)換標(biāo)志
  291.     ADC_CONTR |= 0x08;      //啟動(dòng)A/D轉(zhuǎn)換(0000 1000 令A(yù)DCS = 1)
  292.     _nop_();
  293.     _nop_();
  294.     _nop_();
  295.     _nop_();
  296.     while (AD_FIN ==0){     //等待A/D轉(zhuǎn)換結(jié)束
  297.         AD_FIN = (ADC_CONTR & 0x10); //0001 0000測試A/D轉(zhuǎn)換結(jié)束否
  298.     }
  299.     ADC_CONTR &= 0xE7;      //1111 0111 清ADC_FLAG位, 關(guān)閉A/D轉(zhuǎn)換,
  300. }
  301. /**********************************************************************************************/
  302. /*********************************************************************************************
  303. 函數(shù)名:主函數(shù)
  304. 調(diào)  用:無
  305. 參  數(shù):無
  306. 返回值:無
  307. 結(jié)  果:程序開始處,無限循環(huán)
  308. 備  注:
  309. /**********************************************************************************************/
  310. void main (void){
  311. UART_init();//串口初始程序
  312. Read_init(0);//ADC初始化
  313. P1M1 = 0x01; //P1.7~P1.0:0000 0001(高阻)//注意:更改ADC通道時(shí)須同時(shí)將對(duì)應(yīng)的IO接口修改為高阻輸入。
  314. P1M0 = 0x00; //P1.7~P1.0:0000 0000(強(qiáng)推)
  315. while(1){
  316.      ADC_Read ();//調(diào)用ADC轉(zhuǎn)換程序
  317.      UART_T (ADC_RES); //串口小秘書,將ADC讀出值高8位送入串口  0000 0000
  318.      UART_T (ADC_RESL); //串口小秘書,將ADC讀出值低2位送入串口  XXXX XX00
  319. }
  320. }
  321. /**********************************************************************************************/
復(fù)制代碼






作者: hawkj    時(shí)間: 2015-8-1 20:24
好帖!希望樓主續(xù)上四位LED數(shù)碼管(共陰)顯示部分!




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1