如何将MC14433芯片AD转换的结果通过单片机串口传到PC,我写的程序如图,但是传过来的数字不对

#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
int second=0; //定义的秒
int mstcnt=0; //定义计数变量
uchar bdata TEST;//位变量
sbit ds1=P1^4; //测量数据选择位
sbit ds2=P1^5;
sbit ds3=P1^6;
sbit ds4=P1^7;
sbit ado=P3^7; //A/D转换结束指示,转换结束MC14433会有一个正脉冲,转换结束时读取电压值
uint a[4]={0,0,0,0}; //分别为千位,百位,十位,个位的测量数据缓冲区
//

********************延时函数delay此处省略
/**********************************************************************************************
//*名称:read *功能:读取测量数据

void read(void)
{
while(ado==0){ } //转换没有结束时,卡住不执行任何操作,下面为ado=1时执行的内容

while(ds1==1)
{ a[0]=P1&0x0f; } //将P10、P11、P12、P13BCD码读取,即测量数据的千位
while(ds2==1)
{ a[1]=P1&0x0f; } //读取测量数据的百位
while(ds3==1)
{ a[2]=P1&0x0f; } //读取测量数据的十位
while(ds4==1)
{ a[3]=P1&0x0f; } //读取测量数据的个位
}
void main()
{

SCON=0X50; //设置为工作方式1
TMOD=0X21; //设置计数器T1工作于方式2,T0工作于方式1
PCON=0X80; //波特率加倍
TH1=0XFA; //计数器T1初始值设置,注意波特率是9600的
TL1=0XFA;
TH0=0x4c; //预置T0计数初值
TL0=0x00;
ET0=1; //允许定时器T0中断
TR0=1; //T0开始计数
TR1=1; //T1开始计数
EA=1; //打开总中断
TEST = 0; //清0位变量

while(1)
{if(TEST=1)//如果T0计数中断次数达到20
{
TEST = 0;//清0该标志
SBUF=a[0];
delay(1);
SBUF=a[1];
delay(1);
SBUF=a[2];
delay(1);
SBUF=a[3];
while(!TI); //等待发送数据完成
TI=0;
}
}
}
//中断设置
void timer0(void) interrupt 1 using 0 //定时器0方式1,50ms中断一次
{
mstcnt++;
if(mstcnt == 20)
{
mstcnt = 0;//清0计数器
TEST = 1;//置位mstcnt计数到20的标志
}
TH0=0x4c;
TL0=0x00;
}
MC14433与单片机链接大致示意图,硬件良好

Q0是数据低位,一般该接P1.0,你真的将其接在P1.3上吗?若是那样,需对读到的数进行专门处理.追问

Q0我接到P1.0了,图标错了,但是传过来的数是不对的,大神麻烦你看看我的程序有什么问题吗

追答

没看见你读出子程序加在主程序的什么地方?读出和发送时要关闭定时器,以免被中断程序打断出现错误,读出和发送完毕后再打开定时器.另外波特率一定要设对,上位机接收时数据格式要选对,14433基准电压一定要调好.波特率9600 若你的晶振为12M时 初值应为TH1=0XF9 不过误差较大达6.99%,超过5%的规定,可以尝试低波特率或换用11.0592的晶振,是通讯错误还是采集读取错误,可以先发已知数据到上位机,看接收是否正确

温馨提示:答案为网友推荐,仅供参考
相似回答