|
10黑幣
單片機(jī) stc8a8k
2路電壓采集異常,求大佬指導(dǎo)一下程序,哪邊有問(wèn)題?
調(diào)試設(shè)置單通道,能采集單通道電壓,設(shè)置雙通道,2個(gè)都采集不了求大佬指導(dǎo)一下
#include"stc8f.h"#include <intrins.h>
#include <stdio.h>
#define VCC 2.50
#define uint unsigned int
#define uchar unsigned char
#define ADC_CHANNEL0 0x00 //轉(zhuǎn)換通道P1.0
#define ADC_CHANNEL1 0x01 //轉(zhuǎn)換通道P1.1
#define ADC_CHANNEL2 0x02 //轉(zhuǎn)換通道P1.2
#define ADC_CHANNEL3 0x03 //轉(zhuǎn)換通道P1.3
#define ADC_CHANNEL4 0x04 //轉(zhuǎn)換通道P1.4
#define ADC_CHANNEL5 0x05 //轉(zhuǎn)換通道P1.5
#define ADC_CHANNEL6 0x06 //轉(zhuǎn)換通道P1.6
#define ADC_CHANNEL7 0x07 //轉(zhuǎn)換通道P1.7
#define ADC_CHANNEL8 0x08 //轉(zhuǎn)換通道P0.0
#define ADC_CHANNEL9 0x09 //轉(zhuǎn)換通道P0.1
#define ADC_CHANNEL10 0x0a //轉(zhuǎn)換通道P0.2
#define ADC_CHANNEL11 0x0b //轉(zhuǎn)換通道P0.3
#define ADC_CHANNEL12 0x0c //轉(zhuǎn)換通道P0.4
#define ADC_CHANNEL13 0x0d //轉(zhuǎn)換通道P0.5
#define ADC_CHANNEL14 0x0e //轉(zhuǎn)換通道P0.6
uint a;
bit flag_1= 0;bit flag_2=0;bit flag_3=0; bit flag_4=0;
uchar count=0; // 變量計(jì)數(shù)器
void Delay500ms() //@11.0592MHz
{
unsigned char i, j, k;
i = 29;
j = 14;
k = 54;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Delay1ms(a) //@11.0592MHz
{
unsigned char i, j;
i = 15;
j = 90;
do
{
while (--j);
} while (--i);
}
void UartInit(void) //9600bps@11.0592MHz
{
SCON = 0x50; //8位數(shù)據(jù),可變波特率
AUXR |= 0x40; //定時(shí)器1時(shí)鐘為Fosc,即1T
AUXR &= 0xFE; //串口1選擇定時(shí)器1為波特率發(fā)生器
TMOD &= 0x0F; //設(shè)定定時(shí)器1為16位自動(dòng)重裝方式
TL1 = 0xE0; //設(shè)定定時(shí)初值
TH1 = 0xFE; //設(shè)定定時(shí)初值
ET1 = 0; //禁止定時(shí)器1中斷
TR1 = 1; //啟動(dòng)定時(shí)器1
TI=1;
}
void ADC_init()
{
P1M0 = 0x00;
P1M1 = 0xff;
P0M0 = 0x00;
P0M1 = 0xff;
ADCCFG = 0x0f;
ADC_CONTR|=0x80; //開(kāi)啟AD轉(zhuǎn)換電源
Delay1ms(2);
}
uint ADC_GetResult(unsigned char ch)
{
uint ADC_Value=0;
ADC_RES=0;
ADC_RESL=0;
ADC_CONTR|= ch;
ADC_CONTR|= 0x40;//啟動(dòng)AD轉(zhuǎn)換
Delay1ms(1);
while(!(ADC_CONTR&0x20));
ADC_CONTR&=~0x20; //清完成標(biāo)志
ADC_Value=ADC_RES; //讀取ADC高八位
ADC_Value=(ADC_Value<<8)|ADC_RESL;//讀取ADC低四位,并且數(shù)據(jù)合并
ADC_Value>>=4; //數(shù)據(jù)右移4位,高12位為所需要的數(shù)據(jù)
return ADC_Value;
}
void Timer0Init(void) //1毫秒@11.0592MHz
{
AUXR |= 0x80; //定時(shí)器時(shí)鐘1T模式
TMOD &= 0xF0; //設(shè)置定時(shí)器模式
TL0 = 0xCD; //設(shè)置定時(shí)初值
TH0 = 0xD4; //設(shè)置定時(shí)初值
TF0 = 0; //清除TF0標(biāo)志
TR0 = 1; //定時(shí)器0開(kāi)始計(jì)時(shí)
EA = 1; //開(kāi)總中斷
ET0 = 1; //開(kāi)定時(shí)器T1中斷
}
void Timer0(void) interrupt 1
{
TL0 = 0xCD; //設(shè)置定時(shí)初值
TH0 = 0xD4; //設(shè)置定時(shí)初值
count++; //每次中斷加1
if(count>=20) //如果計(jì)數(shù)到了100ms
{
flag_1= 1;
}
if (count>=40)
{
flag_2= 1;
}
if (count>=60)
{
flag_3= 1;
}
if (count>=80)
{
count=0;
flag_4= 1;
}
}
void main()
{
float Vin1,Vin2;
uint AD1=0;
uint AD2=0;
ADC_init();
Timer0Init();
UartInit();
printf("串口初始化完畢");
while(1)
{
if(flag_1==1)
{
flag_1=0;
AD1=ADC_GetResult(ADC_CHANNEL6);
}
if(flag_2==1)
{
flag_2=0;
Vin1 = VCC*AD1/4090;
}
if(flag_3==1)
{
flag_3=0;
AD2=ADC_GetResult(ADC_CHANNEL5);
}
if(flag_4==1)
{
flag_4=0;
Vin2 = VCC*AD2/4090;
}
printf ("%.2f,%.2f",Vin1,Vin2);
Delay500ms();
}
}
|
|