硬件電路為光敏電阻串聯一個20K的分壓電阻 接1602液晶顯示 采用STM8S208MB芯片 內部AIN13通道 可顯示采集到的AD值、轉換后的電壓值以及擋位
STM8S單片機源程序:
- /*光敏測量 接20K分壓電阻 可顯示讀取到的AD值 轉換后的電壓值及擋位 AIN13端口PF5*/
- /*注意:LCD R/W引腳需要硬件接地 若要軟件接地則GPIO初始化內定義*/
- #include"iostm8s208mb.h"
- #define uchar unsigned char
- #define uint unsigned int
- #define ushort unsigned short
- uchar tab1[]="=ADC2 GUANGMIN="; //初始化后顯示畫面
- uchar tab2[]="= . V =";
- static uint AD_temp[10]={0,0,0,0,0,0,0,0,0,0}; //建立數組用于存放采集的AD的10個數值
- static uint AD_val=0; //全局變量 ADC單次采樣數據
- static uint voltage=0; //實際測得的電壓值
-
- #define LCD_EN PF_ODR_ODR4 //LCD使能端
- #define LCD_RS PF_ODR_ODR0 //LCD寫端口
- #define LCD_DATA PB_ODR //LCD數據端
- void delay(uint z) //約1ms延時
- {
- uint i,j;
- while (z--)
- {
- for(i=0;i<50;i++)
- for(j=0;j<20;j++);
- }
- }
- void GPIO_init(void)
- {
- PF_DDR_DDR4=1; //LCD使能端初始化
- PF_CR1_C14=1;
- PF_CR2_C24=1;
-
- PF_DDR_DDR0=1; //LCD寫端口初始化
- PF_CR1_C10=1;
- PF_CR2_C20=1;
-
- PB_DDR=0xff; //LCD數據端初始化
- PB_CR1=0xff;
- PB_CR2=0xff;
-
- }
- void write_com(uchar com) //LCD寫命令 參考時序圖
- {
- LCD_RS=0;
- LCD_DATA=com;
- delay(5);
- LCD_EN=1;
- delay(5);
- LCD_EN=0;
- }
- void write_data(uchar data) //LCD寫數據 參考時序圖
- {
- LCD_RS=1;
- LCD_DATA=data;
- delay(5);
- LCD_EN=1;
- delay(5);
- LCD_EN=0;
- }
- void LCD_init(void) //LCD初始化
- {
- LCD_EN=0;
- write_com(0x38); //設置16*2顯示,5*7點陣,8位數據接口
- write_com(0x0c); //設置開顯示,不顯示光標
- write_com(0x06); //寫一個字符后地址指針加1
- write_com(0x01); //顯示清0,數據指針清0
- }
- void LCD_watch(uchar add,uchar data) //LCD顯示計數函數
- {
- write_com(0x80+0x40+add);
- write_data(0x30+data); //0x30表示字符表內0-9數字的八位為0011 0000
- }
- void LCD_DIS2(void) //LCD初始化結束后顯示內容
- {
- uchar num;
- write_com(0x80);
- for(num=0;num<16;num++)
- {
- write_data(tab1[num]);
- delay(5);
- }
- write_com(0x80+0x40);
- for(num=0;num<16;num++)
- {
- write_data(tab2[num]);
- delay(5);
- }
- }
- void ADC_init(void) //ADC13初始化函數
- {
- ADC_CSR=0x0d; //禁止中斷使能 選擇AIN13通道
- ADC_CR1=0x02; //Fmaster2分頻 連續轉換模式
- ADC_CR2=0x08; //禁止外部觸發 右對齊方式
-
- PF_DDR_DDR5=0; //PF5設置為無中斷懸浮輸入
- PF_CR1_C15=0;
- PF_CR2_C25=0;
-
- ADC_TDRH=0xff; //禁止施密特觸發功能
- ADC_TDRL=0xff;
- // ADC_CR1|=0x01; //使能喚醒ADC
- }
- void ADC_GET(void) //ADC轉換函數
- {
- uchar num=0; //num為采集次數
- ADC_CR1|=0x01; //使能喚醒ADC
- ADC_CR1|=0x01; //啟動ADC轉換
- while(num<10) //采集10次結果
- {
- while((ADC_CSR&0x80)==0); //判斷EOC位是否為1 等待轉換結束
- ADC_CSR&=0x7f; //結束后EOC位由軟件清零
- AD_temp[num]=(uint)ADC_DRL; //先賦值低位
- AD_temp[num]|=(uint)ADC_DRH<<8; //高位左移8位后與低位拼合
- num++;
- }
- ADC_CR1&=0xfe; //關閉ADC轉換
- }
- void AVG_AD_temp(void) //平均值濾波函數
- {
- uchar i,j;
- uint temp; //定義暫存變量暫存數值
- for(i=10;i>=1;i--)
- {
- for(j=0;j<(i-1);j++)
- {
- if(AD_temp[j]>AD_temp[j+1])
- {
- temp=AD_temp[j];
- AD_temp[j]=AD_temp[j+1];
- AD_temp[j+1]=temp;
- }
- }
- }
- for(i=2;i<=7;i++) //將采集到的10個值取中間6個進行累加求平均
- {
- AD_val+=AD_temp[i];
- }
- AD_val=(uint)AD_val/6;
- }
- void main(void)
- {
- uchar qian,bai,shi,ge,qian1,bai1,shi1,ge1,shi2,ge2;
- GPIO_init();
- ADC_init();
- LCD_init();
- LCD_DIS2();
- while(1)
- {
- ADC_GET();
- AVG_AD_temp();
- // delay(50);
-
- /*這里顯示的是AIN13讀取到的AD實際值*/
- qian=AD_val/1000; //千位
- bai=AD_val%1000/100; //百位
- shi=AD_val%100/10; //十位
- ge=AD_val%10; //個位
- LCD_watch(1,qian);
- LCD_watch(2,bai);
- LCD_watch(3,shi);
- LCD_watch(4,ge);
-
- /*這里顯示的是擋位(0-99對應0-1023) 電壓基準來自Vref+*/
- shi2=(uint)(AD_val*0.09766)/10; //十位
- ge2=(uint)(AD_val/0.09766)%10; //個位
- LCD_watch(13,shi2);
- LCD_watch(14,ge2);
-
- voltage=(uint)(AD_val*5.087890625); //獲取的AD值乘以基準值 由于乘積為浮點型所以再次轉換為整形
- AD_val=0; //AD值清零
-
- /*這里顯示的是AD轉換后的電壓值 電壓基準來自Vref+ 此處和VDD連接 即+5V*/
- qian1=voltage/1000; //千位
- bai1=voltage%1000/100; //百位
- shi1=voltage%100/10; //十位
- ge1=voltage%10; //個位
- LCD_watch(6,qian1);
- LCD_watch(8,bai1);
- LCD_watch(9,shi1);
- LCD_watch(10,ge1);
- }
- }
復制代碼
所有資料51hei提供下載:
光敏測量帶AD值電壓值和擋位.rar
(272.37 KB, 下載次數: 24)
2018-7-20 00:03 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|