- #include<STC8.H>
- #define uchar unsigned char
- #define uint unsigned int
- #define ulong unsigned long
- //***********y延時聲明**************************
- void Delay(uint t);
- void LCD_Delay(uint t);
- //***********LCD1602聲明***********************************
- void lcd_init(void);
- void DisplayOneChar(uint X, uint Y, uint DData);
- //**********************************************
- sbit LED0=P7^1;
- //**********************************************
- uchar xdata table1[]={" "};
- uchar xdata table2[]={"ADC_V: "};
- //**********************************************
- uint ADC_Result;uint ADC_count; ulong ADC_sum;uint xdata ADC_data[100]; uint ADC_flag;
- void Display_line(uchar y,uchar *DData)
- {
- uchar i;
- for(i=0;i<16;i++)
- {
- if(y==0) DisplayOneChar(i,0,DData[i]);
- else if(y==1) DisplayOneChar(0x40+i,1,DData[i]);
- }
- }
- void table2_charge()
- {
- table2[8]=ADC_Result%10000/1000+0x30;
- table2[9]=ADC_Result%1000/100+0x30;
- table2[10]=ADC_Result%100/10+0x30;
- table2[11]=ADC_Result%10+0x30;
- }
- void ADC_init()
- {
- P1M0 &=0xBF; //設置 P0.6 為 ADC 口 M1為1,M0為0,高阻輸入 1011 1111 0100 0000
- P1M1 |= 0x40;
- ADCCFG = 0x0f; //設置 ADC 時鐘為系統時鐘/2/16/16 數據左對齊
- ADC_CONTR = 0x8E; //使能 ADC 模塊 使能 1000 1110 通道P0.6
- EADC = 1; //使能 ADC 中斷
- EA = 1;
- ADC_CONTR |= 0x40; //啟動 AD 轉換
- }
- void ADC_filter(uint *P)
- {
- uint i,j,temp;
- ulong sum=0;
-
- for(j=0;j<99;j++)
- for(i=0;i<99-j;i++)
- {
- if(*(P+i)>*(P+i+1))
- {
- temp=*(P+i);
- *(P+i)=*(P+i+1);
- *(P+i+1)=temp;
- }
- }
- if(ADC_flag!=0)
- { for(i=45;i<55;i++)
- {
- sum+=P[i];
- }
- //ADC_Result=sum/10;
- ADC_Result=(uint)((float)(sum/10*2.5/4.096));
- }
- }
- void main()
- {
- LED0=0;
- lcd_init();
- ADC_init();
- ADC_count=0;ADC_flag=0;
- while(1)
- {
- // LED0=!LED0;
- // LCD_Delay(5);
- table2_charge();
- Display_line(0,table1);
- Display_line(1,table2);
- ADC_filter(ADC_data);
- }
- }
- void ADC_Isr() interrupt 5
- {
- ADC_CONTR &= ~0x20; //清中斷標志
- ADC_data[ADC_count]= (ADC_RESL>>4)+ADC_RES*16; //讀取 ADC 結果
- ADC_CONTR |= 0x40; //繼續 AD 轉換
-
- ADC_count++;
- if( ADC_count>100) {ADC_count=0; ADC_flag++; if(ADC_flag>=2) ADC_flag=1;}
- }
復制代碼 |