电路的设想很简单,就是用51控制ADC0809采集数据,再将数据通过串口传到电脑里。
附件是设计的电路图,从网上载的,没有串口那一块电路(因为串口那一路比较简单):

然后是根据电路图写的程序: #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经AD转换后的数据 //uchar sendflag; //发送许可
xdata uchar sendstr; /**********延时函数************/ void delay(uchar i) { uchar j; while(i--) { for(j=125;j>0;j--) ; } } /*********系统初始化***********/ void init() { EA=1; //开总中断 TMOD=0x22; //设定T0、T1定时器工作方式 TH0=0xff; //利用T0中断产生CLK信号 TL0=0xff; TR0=1; ET0=1; //开启T0中断 ST=0; OE=0; TH1=0xfa; //利用T1产生串口中断 TL1=0xfa; TR1=1; ET1=1; //开启T1中断
SCON=0x50; //串行口工作在方式1 PCON=0x40; //bps增倍
ES=0; //禁止串行中断 TI=0; //串行中断发送禁用 RI=0; //串行中断接收禁用 // sendflag=1; //初始允许发送 }
/*****************通信函数************/ void send(uchar databuff) { ES=1; SBUF=databuff; //发送数据 while(!TI) ; //等待发送结束 TI=0; ES=0; }
/*void recieve(void) { ES=1; CHECKBACK=SBUF; while(!RI) ; RI=0; ES=0; } */
/***********AD转换函数**********/ void AD() { ST=0; ADDCS=0; //选择通道IN0 delay(5); ST=1; //启动AD转换 delay(5); ST=0; while(EOC==0) ; OE=1; AD_DATA=P2; OE=0; }
/***********T0、T1中断服务程序************/ 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); }
/*****************主函数**************/
void main() { init(); while(1) { // AD(); // sendstr=AD_DATA; // if(sendflag){ // sendflag=0; // send(sendstr); // } /* else { sendflag=0; send(CHECKSEND); } */ } } ================================================ 问题在于,上电后,ADC0809压根不工作,所以c51传给串口的都是一堆乱码
不知道是什么原因,有人说是因为多出来的串口通信改变了单片机某些端口的电平,但是还是一直很疑惑,不知道该怎么改电路...
请各位高人指点!
谢谢! |