|
電路的設(shè)想很簡單,就是用51控制ADC0809采集數(shù)據(jù),再將數(shù)據(jù)通過串口傳到電腦里。
附件是設(shè)計的電路圖,從網(wǎng)上載的,沒有串口那一塊電路(因為串口那一路比較簡單):

然后是根據(jù)電路圖寫的程序: #include"regx52.h" #define uchar unsigned char
sbit ST=P1^1; sbit EOC=P1^0; sbit OE=P1^2; sbit CLK=P1^3; sbit ADDCS=P1^4; uchar AD_DATA/*,CHECKSEND,CHECKBACK*/; //保存IN0和IN1經(jīng)AD轉(zhuǎn)換后的數(shù)據(jù) //uchar sendflag; //發(fā)送許可
xdata uchar sendstr; /**********延時函數(shù)************/ void delay(uchar i) { uchar j; while(i--) { for(j=125;j>0;j--) ; } } /*********系統(tǒng)初始化***********/ void init() { EA=1; //開總中斷 TMOD=0x22; //設(shè)定T0、T1定時器工作方式 TH0=0xff; //利用T0中斷產(chǎn)生CLK信號 TL0=0xff; TR0=1; ET0=1; //開啟T0中斷 ST=0; OE=0; TH1=0xfa; //利用T1產(chǎn)生串口中斷 TL1=0xfa; TR1=1; ET1=1; //開啟T1中斷
SCON=0x50; //串行口工作在方式1 PCON=0x40; //bps增倍
ES=0; //禁止串行中斷 TI=0; //串行中斷發(fā)送禁用 RI=0; //串行中斷接收禁用 // sendflag=1; //初始允許發(fā)送 }
/*****************通信函數(shù)************/ void send(uchar databuff) { ES=1; SBUF=databuff; //發(fā)送數(shù)據(jù) while(!TI) ; //等待發(fā)送結(jié)束 TI=0; ES=0; }
/*void recieve(void) { ES=1; CHECKBACK=SBUF; while(!RI) ; RI=0; ES=0; } */
/***********AD轉(zhuǎn)換函數(shù)**********/ void AD() { ST=0; ADDCS=0; //選擇通道IN0 delay(5); ST=1; //啟動AD轉(zhuǎn)換 delay(5); ST=0; while(EOC==0) ; OE=1; AD_DATA=P2; OE=0; }
/***********T0、T1中斷服務(wù)程序************/ void timer0(void) interrupt 1 { CLK=~CLK; AD(); }
void timer1(void) interrupt 2 { // recieve(); // if(CHECKBACK^CHECKSEND==0) // { // sendflag=1; // } sendstr=AD_DATA; send(sendstr); }
/*****************主函數(shù)**************/
void main() { init(); while(1) { // AD(); // sendstr=AD_DATA; // if(sendflag){ // sendflag=0; // send(sendstr); // } /* else { sendflag=0; send(CHECKSEND); } */ } } ================================================ 問題在于,上電后,ADC0809壓根不工作,所以c51傳給串口的都是一堆亂碼
不知道是什么原因,有人說是因為多出來的串口通信改變了單片機(jī)某些端口的電平,但是還是一直很疑惑,不知道該怎么改電路...
請各位高人指點!
謝謝! |
|