TLC2543芯片采集电压总是4.99V
时间:10-02
整理:3721RD
点击:
我通过2543采集电压,然后通过串口发送到电脑上,一直显示4.9V左右,已经确定2543那边的A1端口是有电压的,求解原因,感激不尽。使用proteus调试,程序是可以运行的,可以正常采集电压。
uint read2543(uchar port) //读2543端口号的直
{
uint dat=0; //保留输出结果
uchar i;
cs=1;
eoc=1;
clock=0;
cs=0;
port<<=4;
for(i=0;i<8;i++) //读高8位
{
if(out)
dat|=0x01; //存放数据高-低
in=(bit)(port&0x80); //高位先输入
clock=1;
_nop_();
_nop_();
_nop_();
clock=0;
_nop_();
_nop_();
_nop_();
port<<=1;
dat<<=1;
}
for(i=8;i<12;i++)
{
if(out)
dat|=0x01;
clock=1;
_nop_();
_nop_();
_nop_();
clock=0;
_nop_();
_nop_();
_nop_();
dat<<=1;
}
cs=1;//开始转换
while(!eoc); //等待转换完成
dat>>=1;/////?
return dat;
}
#include "STC15Fxxxx.H"
#include "ad2543.h"
#define MAIN_Fosc 11059200L //定义主时钟
#define BaudRate1 9600UL //选择波特率
#define Timer2_Reload (65536UL -(MAIN_Fosc / 4 /12 / BaudRate1)) //Timer 2 重装值, 对应300KHZ
sbit RS485_enable = P3^5;
sbit LED = P5^5;
u8 TX1_Buffer[8] = "abcdax";
void usart_init()
{
SCON = (SCON & 0x3f) | 0x40 ; //工作方式1 8位可变波特率
REN = 0; //禁止接收 PCON不用管,自动置0
S1_USE_P36P37(); //UART1 使用P36 P37口
AUXR &= ~(1<<4); //Timer stop 波特率使用Timer2产生
AUXR |= 0x01; // 选择定时器2作为波特率发生器
AUXR |= (0<<2); //Timer2 set as 12T mode
TH2 = (u8)(Timer2_Reload >> 8);
TL2 = (u8)Timer2_Reload;
AUXR |= (1<<4); //Timer run enable
ES = 1; //允许串口中断
EA = 1; //允许全局中断
}
void main ()
{
u8 i = 0,j=0;
long temp = 0 ;
uint result = 0;
P3M0 = 0X20; //强制推挽输出
P3M1 = 0X00;
RS485_enable = 1;
LED = 0;
usart_init();
while(1)
{
i = 0;
//result = 0;
{
AN3(1); //Y1这是一个通道选择,不影响,因在2543端口测到电压
j++;
if(j >= 7)
j=0;
result = read2543(1);
temp = result;
//temp =(uint)(result*1.0/4095*5000); // 此指令不再使用,因测试时无法进行运算
temp = (temp*122/100); //
delay_ms(100);
TX1_Buffer[0] = (u8)(temp>>24);
TX1_Buffer[1] = (u8)(temp>>16);
TX1_Buffer[2] = (u8)(temp>>8);
TX1_Buffer[3] = (u8)(temp);
}
while(TX1_Buffer[i] != 'x')
{
SBUF = TX1_Buffer[i]; //发一个字节
while(!TI);
TI=0;
i++;
}
}
}
uint read2543(uchar port) //读2543端口号的直
{
uint dat=0; //保留输出结果
uchar i;
cs=1;
eoc=1;
clock=0;
cs=0;
port<<=4;
for(i=0;i<8;i++) //读高8位
{
if(out)
dat|=0x01; //存放数据高-低
in=(bit)(port&0x80); //高位先输入
clock=1;
_nop_();
_nop_();
_nop_();
clock=0;
_nop_();
_nop_();
_nop_();
port<<=1;
dat<<=1;
}
for(i=8;i<12;i++)
{
if(out)
dat|=0x01;
clock=1;
_nop_();
_nop_();
_nop_();
clock=0;
_nop_();
_nop_();
_nop_();
dat<<=1;
}
cs=1;//开始转换
while(!eoc); //等待转换完成
dat>>=1;/////?
return dat;
}
#include "STC15Fxxxx.H"
#include "ad2543.h"
#define MAIN_Fosc 11059200L //定义主时钟
#define BaudRate1 9600UL //选择波特率
#define Timer2_Reload (65536UL -(MAIN_Fosc / 4 /12 / BaudRate1)) //Timer 2 重装值, 对应300KHZ
sbit RS485_enable = P3^5;
sbit LED = P5^5;
u8 TX1_Buffer[8] = "abcdax";
void usart_init()
{
SCON = (SCON & 0x3f) | 0x40 ; //工作方式1 8位可变波特率
REN = 0; //禁止接收 PCON不用管,自动置0
S1_USE_P36P37(); //UART1 使用P36 P37口
AUXR &= ~(1<<4); //Timer stop 波特率使用Timer2产生
AUXR |= 0x01; // 选择定时器2作为波特率发生器
AUXR |= (0<<2); //Timer2 set as 12T mode
TH2 = (u8)(Timer2_Reload >> 8);
TL2 = (u8)Timer2_Reload;
AUXR |= (1<<4); //Timer run enable
ES = 1; //允许串口中断
EA = 1; //允许全局中断
}
void main ()
{
u8 i = 0,j=0;
long temp = 0 ;
uint result = 0;
P3M0 = 0X20; //强制推挽输出
P3M1 = 0X00;
RS485_enable = 1;
LED = 0;
usart_init();
while(1)
{
i = 0;
//result = 0;
{
AN3(1); //Y1这是一个通道选择,不影响,因在2543端口测到电压
j++;
if(j >= 7)
j=0;
result = read2543(1);
temp = result;
//temp =(uint)(result*1.0/4095*5000); // 此指令不再使用,因测试时无法进行运算
temp = (temp*122/100); //
delay_ms(100);
TX1_Buffer[0] = (u8)(temp>>24);
TX1_Buffer[1] = (u8)(temp>>16);
TX1_Buffer[2] = (u8)(temp>>8);
TX1_Buffer[3] = (u8)(temp);
}
while(TX1_Buffer[i] != 'x')
{
SBUF = TX1_Buffer[i]; //发一个字节
while(!TI);
TI=0;
i++;
}
}
}
通道选择
2543
protues可以不代表实物就可以的
程序不对
昨天查出两个硬件问题,CLOCK的引脚电平输出不够,必须使用强推挽输出,还有一个是芯片的VCC和GND那里短路了,然而现在问题还是没有解决。
请问程序那里错了,就是采集的程序那里,帮忙解决一下吧
你是要做什么 做设计还是
你是要做什么 做设计还是
你是要做什么 做设计还是
做的设计,就是一个电压采集,通过串口发送到电脑上
就是做的很简单的一个,但是现在做的东西还是有错误,收到的数据一直是错误的
我这里有2543 的程序 绝对可用 1002925094