用TLC2543,LV程序修改了第二版资料中的例子7,看不到采集的0--5V电压?
大家好!我用12位AD芯片TLC2543采集0--5V电压数据,单片机程序是没有问题的,因为我用串口调试工具可以看到PC机收到正确的数据:
其中,“09”是TLC2543采集结果的高8位,“86"是TLC2543采集结果的低8位,所以12位数据是:0x986,转成十进制是:2438,对应的电压是:2438/4096 * 5 = 2.976V,和实际电压相符。
但我修改了第二版资料中的例子7的LV程序,却不能正常显示电压波形。修改后的LV程序如下:
我的单片机波特率是:115200,而且每次单片机只发两个字节的数据。不知为什么,修改后的LV程序不能显示0--5V电压。
请帮忙看一下,非常感谢! 兄弟,那个OFFSET不对!您这个如果是二字节的话,应该是0和1 因为您的CPU程序和我们的有所不同,所以造成这个OFFSET也不同! 兄弟再试试这个,就改了二个数字,一个原来是1现在改为0,一个原来是2现在改为1,因为跟您的CPU程序有关的原因! 初学labview,困难重重.还是不行啊
我的MCU主程序如下:
void main(void)
{
EA = 1; //开总中断
ES = 1; //开串口中断
CS = 1; //设置TLC2543片选为高
SCON = 0x50; //串口方式1工作,8位数据位,1位停止位,无奇偶校验,允许接收
TMOD = 0x21; //定时器1定时方式2(8位自动重装计数器);定时器0工作于定时方式1(TH0+TL0共16位全部参加计数)
PCON = 0x80; //波特率加倍控制,SMOD位
TH1 = 0xff; //定时器/计数器T1置初值 波特率115200
TL1 = 0xff; //定时器/计数器T1置重装数
TR1 = 1; //启动定时器T1
pc_command = 0;
while(1)
{
while(pc_command != 0x11); //等待PC发送开始传送指令
pc_command = 0;
read2543(0x30); //第一次读A/D无效
delay_10us();
read2543(0x30); //
delay_10us(); //A/D转换时间
ES = 0;
SBUF = ah; // 转换结果的高4位
while(TI == 0);
TI = 0;
SBUF = al; //转换结果的低8位
while(TI == 0);
TI = 0;
ES = 1;
}
} VISA是装了的,因为我运行其他LV串口程序,是可以看到接收的数据的 把MCU程序修改成和例子7差不多的,主要程序如下:
/*******************************************************************/
/* */
/* 单片机在串口接收1字节 */
/* 说明:串口接收中断 */
/* */
/*******************************************************************/
void serial_int(void) interrupt 4
{
if (RI)
{
ES = 0;
pc_command = SBUF;
RI = 0;
ES = 1;
}
}
void data_convert(uint data_to_convert) //把数据折开成四字节,为了方便发送
{
data_conver = 0;
data_conver = (uchar)((data_to_convert & 0x0f00) >> 8);
data_conver = (uchar)((data_to_convert & 0x00f0) >> 4);
data_conver = (uchar)(data_to_convert & 0x000f);
}
void main(void)
{
uchar i;
EA = 1; //开总中断
ES = 1; //开串口中断
SCON = 0x50; //串口方式1工作,8位数据位,1位停止位,无奇偶校验,允许接收
TMOD = 0x20; //定时器1定时方式2(8位自动重装计数器
PCON = 0x80; //波特率加倍控制,SMOD位
TH1 = 0xff; //定时器/计数器T1置初值 波特率115200
TL1 = 0xff; //定时器/计数器T1置重装数
TR1 = 1; //启动定时器T1
while(1)
{
while(pc_command != 0x11); //等待PC发送开始传送指令
pc_command = 0;
read2543(0x30);
delay_10us();
read2543(0x30);
data_convert(ad); //ad是uint类型,
for(i = 0;i < 4;i++) //循环4次,即是发送四次,每次发送一个字节
{
SBUF = data_conver; //发送变换后的4字节数据
while(TI==0); //等待发送完毕
TI = 0; //发送完毕以后清除发送完标志位
}
}
}
还是不行,前面板显示如下:
用其它串口工具却可以看到4个字节的数据:
实在是太郁闷了. 不用改CPU的程序,按上面的我传的,我试过将您第一个图中的数据进行转换,得到的值确实是您所说的那个2.9几伏的!
您看一下那个COM的下拉能下拉下来吗? 是不是串口被占用了呢?有没有关闭其他串口部分,兄弟高亮后面板程序试试看有没有错误码! 先选好串口再运行它! 如果需要自由度高点的,可以看例8会更方便些的! 刚发现问题了,兄弟您的单片机波特率是115200的话,上位机LABVIEW程序默认是9600,改一下波特率,应该就可以了! 高亮后如下:
波特率我修改如下,运行后还是不行:
还有一个问题一直想不清楚:
在MCU程序中,单片机发送给PC机的数据是实际的TLC2543采集的数据,不是对应的ASCII码.但串口上跑的却是ASCII码,难道RS232协议会自动把准备发到串口线路上的数据,自动转换成对应的ASCII码吗?
因为看了PC机这边的LV程序,要对从串口来的ASCII码转成16进制数据,所以对这个问题还是想不通.
页:
[1]
2