本帖最后由 619247581 于 2020-6-18 17:16 編輯
- #include<stc8g.h> //STC8G系列單片機頭文件,可去最新版stc—isp里下載
- #include "intrins.h"
- #include "stdio.h"
- #include "codetab.h"
- #include "LQ12864.h"
- /******************************+**********************************
- 函數(shù)功能: 采AD轉換完成的值
- 說 明:
- 入口參數(shù): channel 定義ADC口,范圍:0x00~0x07 0x08~0x0e 0x0f
- P1.0~P1.7 P3.0~P3.6 單片機VCC腳
- 出口參數(shù): tes
- *****************************************************************/
- unsigned int AD_get(unsigned char channel)
- {
- int tes; //定義一個變量tes,用來儲存ADC讀取的結果
- ADC_CONTR = 0x80|0x40|channel; //啟動 AD 轉換
- _nop_();
- _nop_();
- while (!(ADC_CONTR & 0x20)); //查詢 ADC 完成標志
- ADC_CONTR &= ~0x20; //清完成標志
- tes = ADC_RES; //讀取 ADC 結果
- return tes; //返回AD轉換完成的值
- }
- /****************************************************************
- 函數(shù)功能: 讀取8個采到的AD值,求其平均值并返回所求值
- 說 明:先取兩次AD值,并丟棄,再采8個AD值,求其平均值,再返回值
- 入口參數(shù): channel 定義ADC口,范圍:0x00~0x07 0x08~0x0e 0x0f
- P1.0~P1.7 P3.0~P3.6 單片機VCC腳
- 出口參數(shù): res
- *****************************************************************/
- unsigned int AD_work(unsigned char channel)
- {
- char i;
- unsigned int res=0;
- AD_get(channel);
- AD_get(channel); //前兩個數(shù)據(jù)丟棄,在切換通道的時候更加穩(wěn)定
- res = 0; //res清零
- for (i=0; i<8; i++)
- {
- res += AD_get(channel); //讀取 8 次數(shù)據(jù)
- }
- res=res/8; //取平均值
- return res; //返回完成的值
- }
- //主函數(shù)
- void main()
- {
- unsigned int vcc; //定義無符號整形變量vcc,存儲AD_val運算完后的整數(shù)值
- unsigned int vcc1; //定義無符號整形變量vcc1,存儲AD_val運算完后的小數(shù)值
- unsigned int vcc2; //定義無符號整形變量vcc2,存儲AD_vcc運算完后的整數(shù)值
- unsigned int vcc3; //定義無符號整形變量vcc3,存儲AD_vcc運算完后的小數(shù)值
- unsigned int AD_val; //定義無符號整形變量AD_val,存儲P1.0采到的AD值
- unsigned int AD_vcc; //定義無符號整形變量AD_vcc,存儲P1.1采到的AD值
- unsigned char s[8]={0}; //定義無符號整形數(shù)組s,存儲AD_val的值
- unsigned char t[8]={0}; //定義無符號整形數(shù)組t,存儲AD_vcc的值
- P0M0 = 0x00; //設置P0.0~P0.7為雙向口模式
- P0M1 = 0x00;
- P1M0 = 0x00; //設置P1.0~P1.7為雙向口模式
- P1M1 = 0x00;
- P2M0 = 0x00; //設置P2.0~P2.7為雙向口模式
- P2M1 = 0x00;
- P3M0 = 0x00; //設置P3.0~P3.7為雙向口模式
- P3M1 = 0x00;
- P4M0 = 0x00; //設置P4.0~P4.7為雙向口模式
- P4M1 = 0x00;
- P5M0 = 0x00; //設置P5.0~P5.7為雙向口模式
- P5M1 = 0x00;
- P1M0 = 0x00; //設置 P1.0和P1.1,P1.4 為 ADC 口,也就是高阻輸入模式
- P1M1 = 0x13;
- P3M0 = 0x00; //設置P3.1~P3.6為ADC 口
- P3M1 = 0x7e;
- ADCCFG = 0x0f; //設置 ADC 時鐘為系統(tǒng)時鐘/2/16/16
- ADC_CONTR = 0x80; //使能 ADC 模塊
- OLED_Init(); //OLED初始化
- while(1)
- {
- AD_val=AD_work(0x00); //將P1.0口的返回值儲存到變量AD_val
- AD_vcc=AD_work(0x01); //將P1.1口的返回值儲存到變量AD_vcc
- vcc=AD_val*20/1024; //取模作為顯示電壓1的整數(shù)
- vcc1=AD_val*20%1024; //取余作為顯示電壓1的小數(shù)
- vcc2=AD_vcc*20/1024; //取模作為顯示電壓2的整數(shù)
- vcc3=AD_vcc*20%1024; //取余作為顯示電壓2的小數(shù)
- if(vcc1<10) //如果小數(shù)部分小于10,則在數(shù)組里小數(shù)部分前置兩個零
- {
- sprintf(s,"%d.00%dv",vcc,vcc1); //打印電壓值到數(shù)組s
- }
- else if(vcc1<100) //如果小數(shù)部分小于100,則在數(shù)組里小數(shù)部分前置一個零
- {
- sprintf(s,"%d.0%dv",vcc,vcc1); //打印電壓值到數(shù)組s
- }
- else if(vcc1>=1000) //如果小數(shù)部分小于1000,則在數(shù)組里小數(shù)部分強制減去18
- {
- sprintf(s,"%d.%dv",vcc,vcc1-18); //打印電壓值到數(shù)組s
- }
- else //如果小數(shù)部分大于1000,無特殊要求
- {
- sprintf(s,"%d.%dv",vcc,vcc1); //打印電壓值到數(shù)組s
- }
- if(vcc3<10) //如果小數(shù)部分小于10,則在數(shù)組里小數(shù)部分前置兩個零
- {
- sprintf(t,"%d.00%dv",vcc2,vcc3);
- }
- else if(vcc3<100) //如果小數(shù)部分小于100,則在數(shù)組里小數(shù)部分前置一個零
- {
- sprintf(t,"%d.0%dv",vcc2,vcc3); //打印電壓值到數(shù)組t
- }
- else if(vcc3>=1000) //如果小數(shù)部分小于1000,則在數(shù)組里小數(shù)部分強制減去18
- {
- sprintf(t,"%d.%dv",vcc2,vcc3-18); //打印電壓值到數(shù)組t
- }
- else //如果小數(shù)部分大于1000,無特殊要求
- {
- sprintf(t,"%d.%dv",vcc2,vcc3); //打印電壓值到數(shù)組t
- }
- // sprintf(s,"%d",AD_val); //把AD_val的值打印成一個字符串保存在數(shù)組s中
- // sprintf(t,"%d",AD_vcc); //把AD_vcc的值打印成一個字符串保存在數(shù)組s中
- delay(2000); //延時2秒,防止數(shù)據(jù)刷新太快
-
- OLED_P6x8Str(24,0,"Voltage tester");
- OLED_P6x8Str(0,1,"V1:");
- OLED_P6x8Str(19,1,s); //在顯示屏顯示數(shù)組s里的值
- OLED_P6x8Str(0,2,"I1:");
- OLED_P6x8Str(0,4,"V3:");
- OLED_P6x8Str(0,5,"I3:");
- OLED_P6x8Str(0,7,"V5:");
-
- OLED_P6x8Str(64,1,"V2:");
- OLED_P6x8Str(83,1,t); //在顯示屏顯示數(shù)組t里的值
- OLED_P6x8Str(64,2,"I2:");
- OLED_P6x8Str(64,4,"V4:");
- OLED_P6x8Str(64,5,"I4:");
- OLED_FormLine(0,3);
- OLED_FormLine(0,6);
- AD_val=0; //清零
- AD_vcc=0; //清零
- vcc=0; //清零
- vcc1=0; //清零
- vcc2=0; //清零
- vcc3=0; //清零
- }
- }
復制代碼
如題,想改成定時器加中斷檢測內部多通道ADC的函數(shù),不知道該怎么改,請求大佬們給點思路
|