欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
我有一個STC8G1k08—20PIN的多通道內部ADC查詢測量程序,想改成定時器加中斷檢測該...
[打印本頁]
作者:
619247581
時間:
2020-6-18 17:15
標題:
我有一個STC8G1k08—20PIN的多通道內部ADC查詢測量程序,想改成定時器加中斷檢測該...
本帖最后由 619247581 于 2020-6-18 17:16 編輯
#include<stc8g.h> //STC8G系列單片機頭文件,可去最新版stc—isp里下載
#include "intrins.h"
#include "stdio.h"
#include "codetab.h"
#include "LQ12864.h"
/******************************+**********************************
函數功能: 采AD轉換完成的值
說 明:
入口參數: channel 定義ADC口,范圍:0x00~0x07 0x08~0x0e 0x0f
P1.0~P1.7 P3.0~P3.6 單片機VCC腳
出口參數: 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轉換完成的值
}
/****************************************************************
函數功能: 讀取8個采到的AD值,求其平均值并返回所求值
說 明:先取兩次AD值,并丟棄,再采8個AD值,求其平均值,再返回值
入口參數: channel 定義ADC口,范圍:0x00~0x07 0x08~0x0e 0x0f
P1.0~P1.7 P3.0~P3.6 單片機VCC腳
出口參數: res
*****************************************************************/
unsigned int AD_work(unsigned char channel)
{
char i;
unsigned int res=0;
AD_get(channel);
AD_get(channel); //前兩個數據丟棄,在切換通道的時候更加穩定
res = 0; //res清零
for (i=0; i<8; i++)
{
res += AD_get(channel); //讀取 8 次數據
}
res=res/8; //取平均值
return res; //返回完成的值
}
//主函數
void main()
{
unsigned int vcc; //定義無符號整形變量vcc,存儲AD_val運算完后的整數值
unsigned int vcc1; //定義無符號整形變量vcc1,存儲AD_val運算完后的小數值
unsigned int vcc2; //定義無符號整形變量vcc2,存儲AD_vcc運算完后的整數值
unsigned int vcc3; //定義無符號整形變量vcc3,存儲AD_vcc運算完后的小數值
unsigned int AD_val; //定義無符號整形變量AD_val,存儲P1.0采到的AD值
unsigned int AD_vcc; //定義無符號整形變量AD_vcc,存儲P1.1采到的AD值
unsigned char s[8]={0}; //定義無符號整形數組s,存儲AD_val的值
unsigned char t[8]={0}; //定義無符號整形數組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 時鐘為系統時鐘/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的整數
vcc1=AD_val*20%1024; //取余作為顯示電壓1的小數
vcc2=AD_vcc*20/1024; //取模作為顯示電壓2的整數
vcc3=AD_vcc*20%1024; //取余作為顯示電壓2的小數
if(vcc1<10) //如果小數部分小于10,則在數組里小數部分前置兩個零
{
sprintf(s,"%d.00%dv",vcc,vcc1); //打印電壓值到數組s
}
else if(vcc1<100) //如果小數部分小于100,則在數組里小數部分前置一個零
{
sprintf(s,"%d.0%dv",vcc,vcc1); //打印電壓值到數組s
}
else if(vcc1>=1000) //如果小數部分小于1000,則在數組里小數部分強制減去18
{
sprintf(s,"%d.%dv",vcc,vcc1-18); //打印電壓值到數組s
}
else //如果小數部分大于1000,無特殊要求
{
sprintf(s,"%d.%dv",vcc,vcc1); //打印電壓值到數組s
}
if(vcc3<10) //如果小數部分小于10,則在數組里小數部分前置兩個零
{
sprintf(t,"%d.00%dv",vcc2,vcc3);
}
else if(vcc3<100) //如果小數部分小于100,則在數組里小數部分前置一個零
{
sprintf(t,"%d.0%dv",vcc2,vcc3); //打印電壓值到數組t
}
else if(vcc3>=1000) //如果小數部分小于1000,則在數組里小數部分強制減去18
{
sprintf(t,"%d.%dv",vcc2,vcc3-18); //打印電壓值到數組t
}
else //如果小數部分大于1000,無特殊要求
{
sprintf(t,"%d.%dv",vcc2,vcc3); //打印電壓值到數組t
}
// sprintf(s,"%d",AD_val); //把AD_val的值打印成一個字符串保存在數組s中
// sprintf(t,"%d",AD_vcc); //把AD_vcc的值打印成一個字符串保存在數組s中
delay(2000); //延時2秒,防止數據刷新太快
OLED_P6x8Str(24,0,"Voltage tester");
OLED_P6x8Str(0,1,"V1:");
OLED_P6x8Str(19,1,s); //在顯示屏顯示數組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); //在顯示屏顯示數組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的函數,不知道該怎么改,請求大佬們給點思路
作者:
Joseph824
時間:
2021-7-7 21:01
看看你的代碼
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1