正好去年寫過類似的程序 是取樣40個點 你可以自己改一下延時和循環次數 參考一下吧
#include "stc15.h"
#include "intrins.h"
#define FOSC 11059200L
#define BAUD 115200
typedef unsigned char u8;
typedef unsigned int u16;
#define ADC_POWER 0x80 //ADC電源控制位
#define ADC_FLAG 0x10 //ADC完成標志
#define ADC_START 0x08 //ADC起始控制位
#define ADC_SPEEDLL 0x00 //540個時鐘
#define ADC_SPEEDL 0x20 //360個時鐘
#define ADC_SPEEDH 0x40 //180個時鐘
#define ADC_SPEEDHH 0x60 //90個時鐘
#define S1_S0 0x40
#define S1_S1 0x80
void InitUart();
void InitADC();
void Init_timer();
void qie_huan();
void SendData(u8 dat);
u16 GetADCResult(u8 ch);
void Delay(u16 n);
void ShowResult(u16 ch);
u16 dat1;
u8 mod,dac_end,sync;
u16 se[8]={0,0,0,0,0,0,0,0},sm[8]={0,0,0,0,0,0,0,0};
bit busy;
sbit led=P3^2;
sbit led1=P3^3;
/*----------------------------
讀取ADC結果
----------------------------*/
u16 GetADCResult(u8 ch)
{
u16 dat;
ADC_CONTR = ADC_POWER | ADC_SPEEDH | ch ;
ADC_CONTR|= ADC_START;
_nop_(); //等待4個NOP
_nop_();
_nop_();
_nop_();
while (!(ADC_CONTR & ADC_FLAG));//等待ADC轉換完成
ADC_CONTR &= ~ADC_FLAG; //Close ADC
dat= (ADC_RES<<8)&0xff00|ADC_RESL; //返回ADC結果
return dat;
}
void qie_huan() //串口引腳選擇函數
{
ACC = P_SW1;
ACC &= ~(S1_S0 | S1_S1); //S1_S0=0 S1_S1=0
P_SW1 = ACC; //(P3.0/RxD, P3.1/TxD)
// ACC = P_SW1;
// ACC &= ~(S1_S0 | S1_S1); //S1_S0=1 S1_S1=0
// ACC |= S1_S0; //(P3.6/RxD_2, P3.7/TxD_2)
// P_SW1 = ACC;
}
/*----------------------------
初始化串口
----------------------------*/
void InitUart()
{
SCON = 0x5a; //設置串口為8位可變波特率
T2L = (65536 - (FOSC/4/BAUD));
T2H = (65536 - (FOSC/4/BAUD)) >> 8;
AUXR |= 0x10; //T2為1T模式, 并啟動定時器2
AUXR |= 0x04;
AUXR |= 0x01; //選擇定時器2為串口1的波特率發生器
ES=1;
EA=1;
}
/*----------------------------
初始化ADC
----------------------------*/
void InitADC()
{
P1ASF = 0xff; //設置P1口為AD口
ADC_RES = 0;
ADC_RESL=0;
CLK_DIV |= 0x20;
ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
Delay(2); //ADC上電并延時
}
void Init_timer()
{
AUXR |= 0x80; //定時器0為1T模式
// AUXR &= 0x7f; //定時器0為12T模式
TMOD &= 0xF0; //設置定時器為模式0(16位自動重裝載)
TL0 = 0xF0; //設置定時初始值
TH0 = 0x31;
TR0 = 1; //定時器0開始計時
ET0 = 1; //使能定時器0中斷
EA = 1;
}
/*----------------------------
發送串口數據
----------------------------*/
void SendData(u8 dat)
{
while (busy); //等待前一個數據發送完成
busy = 1; //清除發送標志
SBUF = dat; //發送當前數據
}
/*----------------------------
發送ADC結果到PC
----------------------------*/
void ShowResult(u16 ch)
{
u8 h,l;
h=ch>>8;
l=ch;
SendData(l); //顯示高2位結果
SendData(h); //顯示高2位結果
}
/*----------------------------
軟件延時
----------------------------*/
void Delay(u16 n)
{
u16 x;
while (n--)
{
x = 5000;
while (x--);
}
}
void Delay500us() //@11.0592MHz
{
unsigned char i, j;
_nop_();
_nop_();
i = 6;
j = 93;
do
{
while (--j);
} while (--i);
}
void main()
{
u8 i,j;
P0M0 = 0x00;
P0M1 = 0x00;
P1M0 = 0x00;
P1M1 = 0x00;
P2M0 = 0x00;
P2M1 = 0x00;
P3M0 = 0x00;
P3M1 = 0x00;
P5M0 = 0x00;
P5M1 = 0x00;
qie_huan();
Init_timer();
InitUart(); //初始化串口
InitADC(); //初始化ADC
while(1)
{
TR0 = 1;
ET0 = 1;
for(i=0;i<40;i++)
{
Delay500us();
for(j=0;j<8;j++)
{
se[j]=GetADCResult(j);
if(se[j]>sm[j])
{
sm[j]=se[j];
}
}
}
for(i=0;i<8;i++)
{
ShowResult(sm[i]);
sm[i]=0;
}
while (!mod||(sync!=49));
TR0 = 0;
ET0 = 0;
mod=0;
sync=48;
// while (mod&&(sync==49))
// {
// TR0 = 0;
// ET0 = 0;
// for(i=0;i<8;i++)
// {
// ShowResult(sm[i]);
// sm[i]=0;
// }
// mod=0;
// TR0 = 1;
// ET0 = 1;
// sync=48;
// }
}
while(1);
}
/* Timer0 interrupt routine */
void tm0_isr() interrupt 1
{
dat1++;
led1=!led1;
if(dat1>20)
{
mod=1;
dat1=0;
led=!led;
}
}
/*UART 中斷服務程序
-----------------------------*/
void Uart() interrupt 4
{
if(RI)
{
RI = 0; //清除RI位
sync=SBUF;
}
if(TI)
{
TI = 0; //清除TI位
busy = 0;
}
}
|