標(biāo)題:
STC8A單片機(jī)多通道同時(shí)使用的程序問題
[打印本頁(yè)]
作者:
貪吃的老鱷魚
時(shí)間:
2019-11-21 16:01
標(biāo)題:
STC8A單片機(jī)多通道同時(shí)使用的程序問題
請(qǐng)問STC8A單片機(jī)多通道使用怎么切換達(dá)使用,我只會(huì)該單通道使用的程序,兩個(gè)通道同時(shí)使用不會(huì)更改 請(qǐng)問怎么改
170606ofznnsfpeggnevh1.png
(27.92 KB, 下載次數(shù): 32)
下載附件
2019-11-21 18:58 上傳
單片機(jī)源程序如下:
#include
#include // _nop_()function
#include "STC8.h"
#include
#include "DELAY.h"
#define VCC 2.5
#define Tstop2 1400 //剎車溫度2
#define Tstop1 1400 //剎車溫度1
#define T 1400 //目標(biāo)溫度
#define T_poor 20 //目標(biāo)溫度差
#define Tmax 1500 //最大溫度
#define TAlert 1540 //警戒溫度
#define uint unsigned int
#define uchar unsigned char
#define U32 unsigned long
#define U16 unsigned int
#define FOSC 24000000UL
#define BRT (65536 - FOSC / 115200 / 4)
#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
sbit TEMP1 = P0^2; //控制1
sbit TEMP2 = P4^3; //控制2
sbit TEMP3 = P0^3; //控制3
float code RTD_TAB_PT100[] =
{
88.04,87.64,87.24,86.84,86.44,86.04,85.63,85.23,84.83,84.43, //-30
92.04,91.64,91.24,90.84,90.44,90.04,89.64,89.24,88.84,88.44, //-20
98.03,95.63,95.23,94.83,94.43,94.03,93.63,93.24,92.84,92.44, //-10
100.00,99.60,99.21,98.81,98.41,98.01,97.62,97.22,96.82,96.42, //-0
100.00,100.40,100.79,101.19,101.59,101.98,102.38,102.78,103.17,103.57, //0
103.96,104.36,104.75,105.15,105.54,105.94,106.33,106.73,107.12,107.52, //10
107.91,108.31,108.70,109.10,109.49,109.88,110.28,110.67,111.07,111.46, //20
111.85,112.25,112.64,113.03,113.43,113.82,114.21,114.60,115.00,115.39, //30
115.78,116.17,116.57,116.96,117.35,117.74,118.13,118.52,118.91,119.31, //40
119.70,120.09,120.48,120.87,121.26,121.65,122.04,122.43,122.82,123.21, //50
123.60,123.99,124.38,124.77,125.16,125.55,125.94,126.33,126.72,127.10, //60
};
U32 AD_value;
////PT100溫度采集
//unsigned char xdata ADC1;//外部溫度1
//unsigned char xdata ADC2;//外部溫度2
//unsigned char xdata ADC3;//油溫度
/**********************初始化串口******************************/
void UartInit(void) //9600bps@24.000MHz
{
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 = 0x8F; //設(shè)定定時(shí)初值
TH1 = 0xFD; //設(shè)定定時(shí)初值
ET1 = 0; //禁止定時(shí)器1中斷
TR1 = 1; //啟動(dòng)定時(shí)器1
TI=1;
}
//-----------------------------------------
//ADC初始化程序
//
//-----------------------------------------
void ADC_INI()
{
P1M0 = 0xff; //設(shè)置P1為ADC口
P1M1 = 0x00;
// ADC_CONTR |= 0x03; //切換AD通道,03為 P1.3
ADCCFG = 0x0f; //設(shè)置ADC時(shí)鐘為系統(tǒng)時(shí)鐘/2/16/16
ADC_CONTR = 0x80; //使能ADC模塊
EADC = 1; //使能ADC中斷
ADC_CONTR |= 0x40; //啟動(dòng)AD轉(zhuǎn)換
}
//-----------------------------------------
//AD中斷服務(wù)程序
//
//-----------------------------------------
void ADC_Isr() interrupt 5 using 1
{
static U32 accumulator = 0;//AD采集數(shù)值累加
static U16 measurements = 20;//數(shù)據(jù)值平均次數(shù)
U32 result = 0; //平均值結(jié)果
EA = 0;//20190121
ADC_CONTR|= 0x03;
ADC_CONTR &= ~0x20; //清中斷標(biāo)志
ADCCFG = 0x20; //設(shè)置結(jié)果右對(duì)齊
ACC = ADC_RES; //A[3:0]存儲(chǔ)ADC的12位結(jié)果的高4位,A[7:4]為0
B = ADC_RESL; //B存儲(chǔ)ADC的12位結(jié)果的低8位
accumulator += ACC * 256 + B; // Add most recent sample
measurements--;
if (measurements == 0)
{
measurements = 20;//平均值濾波======================
result = accumulator / measurements;
accumulator = 0; //=================================
AD_value = result ;
}
EA = 1;
ADC_CONTR |= 0x40; //繼續(xù)AD轉(zhuǎn)換
}
/*******************************主函數(shù)**********************************/
void main (void)
{
float Vin3,T0,AD3;//,//Vin2;
// uint AD3=0;
// uint T0=0;
uint AD2= 100;
//使用內(nèi)部高精度晶振 ----------------------------------------------------
P_SW2 = P_SW2 | 0x80; //訪問擴(kuò)展SFR時(shí),要將P_SW2的高位置 1, EAXFR = 1
CKSEL = 0x00;//使用內(nèi)部高精度晶振
CLKDIV = 0x00;//時(shí)鐘不分頻 默認(rèn)是4分頻即:CLKDIV = 0x04;
while (1) //等待晶振穩(wěn)定*************
{
if ((IRC24MCR & 0x01) == 1)
{
IRC24MCR = IRC24MCR |0x80;
break;
}
} //******************************
P_SW2 = P_SW2 & 0x7F;
//-------------------------------------------------------------------------
UartInit();
ADC_INI();
TEMP1= 0;
TEMP2= 0;
TEMP3= 0; //控制端置0
EA = 1;
while(1)
{
AD3 = AD_value;
Vin3 = AD3; //輸出通道3的電壓值
T0 = Vin3;
}
}
復(fù)制代碼
全部資料51hei下載地址:
TempCtrl.zip
(51.99 KB, 下載次數(shù): 17)
2019-11-21 16:01 上傳
點(diǎn)擊文件名下載附件
程序
作者:
wulin
時(shí)間:
2019-11-21 20:43
STC8A8K16S4A12有8個(gè)ADC通道,但內(nèi)部AD轉(zhuǎn)換器只有1個(gè)(其它品牌也基本如此),通過開關(guān)選通某通道轉(zhuǎn)換。不可能多通道同時(shí)轉(zhuǎn)換,而是分時(shí)轉(zhuǎn)換。由于轉(zhuǎn)換速度很快,可以理解為同時(shí)轉(zhuǎn)換。
作者:
yzwzfyz
時(shí)間:
2019-11-21 21:54
多通道不用怕,就當(dāng)成單通道來寫!
關(guān)鍵是協(xié)議,你可以在協(xié)議上做文章,各機(jī)下載的數(shù)據(jù),有取有舍,協(xié)議規(guī)定是自己的就取,不是自己的就舍,也就OK了。
當(dāng)然其中有此技巧,你要看書,看多機(jī)通訊的章節(jié)。
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1