微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 接近崩溃边缘,AD转换代码,结果老是不对啊!

接近崩溃边缘,AD转换代码,结果老是不对啊!

时间:10-02 整理:3721RD 点击:
结果输出的都是000
和,相同的对照好几遍就是改不出来哪里错了!崩溃,有没有大神教一教!
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define PCF8591_WRITE 0x90
#define PCF8591_READ 0x91
sbit scl=P2^1;
sbit sda=P2^0;
sbit wela=P2^7;
sbit dula=P2^6;
sbit DS1302 =P2^4;
void init();
void delay();
void delayms(uint);
void display(uchar ,uchar,uchar);
/*****************************************************/
//   I2C总线  
//
void start();
void end();
void respond();
void norespond();
//   PCF8591
void write_byte(uchar);
uchar read_byte();
void  readtbyte_8591(uchar);
void check_ack();
bit bdata SystemError=0;
//  存储以及显示
//uchar enter=0x42;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
                        0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar idata date;
void main()
{
uchar bai,shi,ge;
delayms(10);
DS1302=0;
while(1)
{  
  init();
  readtbyte_8591(0x42);
  if(SystemError==1)
  {
   init();
   readtbyte_8591(0x42);
  }  
  bai=date/100;
  shi=date/10%10;
  ge=date%10;
  display(bai,shi,ge);
}
}
void init()
{
scl=0;
end();
}
void delay()
{
_nop_();_nop_();
_nop_();_nop_();
}
void delayms(uint a)
{
uint i,j;
for(i=a;i>0;i--)
for(j=110;j>0;j--);
}
void display(uchar bai,uchar shi,uchar ge)
{
wela=1;
P0=0xfe;
wela=0;
P0=0xff;
dula=1;
P0=table[bai];
dula=0;
delayms(5);
wela=1;
P0=0xfd;
wela=0;
P0=0xff;
dula=1;
P0=table[shi];
dula=0;
delayms(5);
wela=1;
P0=0xfb;
wela=0;
P0=0xff;
dula=1;
P0=table[ge];
dula=0;
delayms(5);
}
//  I2C总线
void start()
{
sda=1;
scl=1;
sda=0;
delay();
scl=0;
}
void end()
{

sda=0;
scl=1;
delay();
sda=1;
delay();
scl=0;
}
void check_ack()
{
sda=1;
scl=1;
F0=0;
delay();
if(sda==1) F0=1;
scl=0;
}
void respond()  //主机发送应答
{
sda=0;
scl=1;
delay();
scl=0;
}
void norespond()
{
sda=1;
scl=1;
delay();
sda=0;
scl=0;
}
void write_byte(uchar ch)
{
uint i;
for(i=8;i>0;i--)
{
  if((ch&0x80) == 0x80)    // 若要发送的数据最高位为1则发送位1
    {
    sda = 1;
   scl=0;    // 传送位1
   scl = 1;
      delay();
   scl = 0;
    }
  else
  {  
   sda = 0;    // 否则传送位0
   scl = 1;
   delay();
     scl = 0;
  }
  ch = ch<<1;    // 数据左移一位
}
}
uchar read_byte()
{
uchar idata val=0;
uchar i;
for(i=8;i>0;i--)
{
  sda = 1;
    scl= 1;
    val =val<<1;      //左移一位
     if(sda == 1)
    sda = val|0x01;   // 若接收到的位为1,则数据的最后一位置1
  else
    val = val&0xfe;   // 否则数据的最后一位置0
    scl = 0;
}
return (val);
}
//   PCF9591
void  readtbyte_8591(uchar control_byte)
{  
uchar i=0;
start();
write_byte(PCF8591_WRITE);
check_ack();
if(F0 == 1)
{
  SystemError = 1;
  return ;
}
write_byte(control_byte);
check_ack();
if(F0 == 1)
{
  SystemError = 1;
  return ;
}
start();
write_byte(PCF8591_READ);
check_ack();
  if(F0 == 1)
{
  SystemError = 1;
  return ;
}
read_byte();
respond();
date=read_byte();
norespond();
end();
}

小编,莫着急,上示波器了吗。看看时序对不对,看看数据引脚上有波形吗。

分两步调吧,先把显示调正确了,然后再确定IIC部分也正确了,只有每一部分都正确了,才好整体调整。

已经调出来

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top