找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5186|回复: 3
打印 上一主题 下一主题
收起左侧

[求助]求教51单片机问题,高人指点!

[复制链接]
跳转到指定楼层
楼主
ID:17874 发表于 2009-10-7 01:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
 电路的设想很简单,就是用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传给串口的都是一堆乱码

不知道是什么原因,有人说是因为多出来的串口通信改变了单片机某些端口的电平,但是还是一直很疑惑,不知道该怎么改电路...

请各位高人指点!

谢谢!
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:18221 发表于 2009-10-18 16:11 | 只看该作者

帮你顶一下

 

 

回复

使用道具 举报

板凳
ID:18297 发表于 2009-10-20 11:04 | 只看该作者
建议先仿真再搭电路
回复

使用道具 举报

地板
ID:18411 发表于 2009-10-23 09:49 | 只看该作者
你采用的操作方式是静态方式,很麻烦,还要注意时序的问题,而且速度慢,建议采用总线方式,就是献给AD芯片用XBYTE[]定义一个地址XBYTE[。。。] = 。。。启动转换,书上这种例子很多的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表