ADC0832采集到的数据发送到串口一直是乱码怎么回事?
时间:10-02
整理:3721RD
点击:
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit start=P3^3; //ADC0808控制端 引脚 定义
sbit eoc=P3^4;
sbit cs=P2^3;
sbit V=P2^5 ; //电压、电流、电阻测量换挡引脚定义
sbit I=P2^6;
sbit R=P2^7;
sbit a=P3^5; //ADC0808控制输入端引脚定义
sbit b=P3^6;
sbit c=P3^7;
sbit duan=P2^0; //锁存器74HC573使能端引脚定义
sbit wei=P2^1;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //共阴数码管代码表"0-F"
uchar code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1}; //共阴数码管代码表"0-F"(带小数点)
//uchar table2[]='D';
uchar *p="d";
int i;
uchar ge=0,shi=0,bai=0,qian=0,wan=0,sw=0; //声明全局变量,用于数码管显示,分别为“个、十百、千、万、十万”
void delay(uint count) //延时1ms 子程序
{
uint i,j;
for(i=0;i<count;i++)
for(j=0;j<120;j++);
}
void serial_int()
{
//设置定时器1的工作方式为方式2
TMOD=0x20; //设定定时器1的初值,使串口通讯的波特率为9600bps
TH1=0xfd; TL1=0xfd;
SCON=0x50;
PCON=0x00;
ES=1;EA=1;
TR1=1;
}
/*主函数*/
void main()
{
uint adval,adval2,adval3; //声明变量
unsigned long int temp;
while(1)
{
if(V==0) //选择电压档,进行电压测量 (电流电阻档程序跟此类似)
{
a=0;b=0;c=0; //ADC0808通道选择
start=0;
cs=0;
delay(5);
start=1;
delay(5);
start=0;
while(1)
{
if(eoc==1)
{
cs=1;
adval=P1; //读取数字量
temp=adval* 1.0/255* 1000; //换算成具体电压值的100倍
serial_int();
ES=0;
delay(5);
cs=0;
sw=temp/100000; //取各位的具体数值
wan=temp%100000/10000;
qian=temp%10000/1000;
bai=temp%1000/100;
shi=temp%100/10;
ge=temp%10;
//delay(5);
P0=0x00; //清除P0口的数据,方便下次赋值
delay(5);
wei=1;duan=0; //对数码管进行位选
P0=0xdf;
delay(2);
wei=0;duan=1; //对数码管进行段选(下面类似)
P0=table[ge];
delay(2);
P0=0x00;
wei=1;duan=0;
P0=0xef;
delay(2);
wei=0;duan=1;
P0=table[shi];
delay(2);
P0=0x00;
wei=1;duan=0;
P0=0xf7;
delay(2);
wei=0;duan=1;
P0=table1[bai];
delay(2);
P0=0x00;
wei=1;duan=0;
P0=0xfb;
delay(2);
wei=0;duan=1;
P0=table[qian];
delay(2);
P0=0x00;
wei=1;duan=0;
P0=0xfd;
delay(2);
wei=0;duan=1;
P0=table[wan];
delay(2);
P0=0x00;
wei=1;duan=0;
P0=0xfe;
delay(2);
wei=0;duan=1;
P0=table[sw];
delay(2);
P0=0x00;
start=1;
start=0;
delay(10);
}
if(I==0||R==0) break; //中途换挡则退出循环
}
}
if(I==0) // 选择电流档 进行电流测量
{
a=0;b=1;c=0;
start=0;
cs=0;
delay(5);
start=1;
delay(5);
start=0;
while(1)
{
if(eoc==1)
{
cs=1;
adval2=P1;
temp=adval2*0.1/255*500000;
cs=0;
sw=temp/100000;
wan=temp%100000/10000;
qian=temp%10000/1000;
bai=temp%1000/100;
shi=temp%100/10;
ge=temp%10;
P0=0x00;
delay(5);
wei=1;duan=0;
P0=0xdf;
delay(2);
wei=0;duan=1;
P0=table[ge];
delay(2);
P0=0x00;
wei=1;duan=0;
P0=0xef;
delay(2);
wei=0;duan=1;
P0=table[shi];
delay(2);
P0=0x00;
wei=1;duan=0;
P0=0xf7;
delay(2);
wei=0;duan=1;
P0=table1[bai];
delay(2);
P0=0x00;
wei=1;duan=0;
P0=0xfb;
delay(2);
wei=0;duan=1;
P0=table[qian];
delay(2);
P0=0x00;
wei=1;duan=0;
P0=0xfd;
delay(2);
wei=0;duan=1;
P0=table[wan];
delay(2);
P0=0x00;
wei=1;duan=0;
P0=0xfe;
delay(2);
wei=0;duan=1;
P0=table[sw];
delay(2);
P0=0x00;
start=1;
start=0;
delay(10);
}
if(V==0||R==0) break;
}
}
if(R==0) // 选择电阻档 进行电阻测量
{
a=1;b=0;c=0;
start=0;
cs=0;
delay(5);
start=1;
delay(5);
start=0;
while(1)
{
if(eoc==1)
{
cs=1;
adval3=P1;
temp=adval3* 1.0/255* 100000;
cs=0;
sw=temp/100000;
wan=temp%100000/10000;
qian=temp%10000/1000;
bai=temp%1000/100;
shi=temp%100/10;
ge=temp%10;
P0=0x00;
delay(5);
wei=1;duan=0;
P0=0xdf;
delay(2);
wei=0;duan=1;
P0=table[ge];
delay(2);
P0=0x00;
wei=1;duan=0;
P0=0xef;
delay(2);
wei=0;duan=1;
P0=table[shi];
delay(2);
P0=0x00;
wei=1;duan=0;
P0=0xf7;
delay(2);
wei=0;duan=1;
P0=table1[bai];
delay(2);
P0=0x00;
wei=1;duan=0;
P0=0xfb;
delay(2);
wei=0;duan=1;
P0=table[qian];
delay(2);
P0=0x00;
wei=1;duan=0;
P0=0xfd;
delay(2);
wei=0;duan=1;
P0=table[wan];
delay(2);
P0=0x00;
wei=1;duan=0;
P0=0xfe;
delay(2);
wei=0;duan=1;
P0=table[sw];
delay(2);
P0=0x00;
start=1;
start=0;
delay(10);
}
if(I==0||V==0) break;
}
}
}
}
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit start=P3^3; //ADC0808控制端 引脚 定义
sbit eoc=P3^4;
sbit cs=P2^3;
sbit V=P2^5 ; //电压、电流、电阻测量换挡引脚定义
sbit I=P2^6;
sbit R=P2^7;
sbit a=P3^5; //ADC0808控制输入端引脚定义
sbit b=P3^6;
sbit c=P3^7;
sbit duan=P2^0; //锁存器74HC573使能端引脚定义
sbit wei=P2^1;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //共阴数码管代码表"0-F"
uchar code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1}; //共阴数码管代码表"0-F"(带小数点)
//uchar table2[]='D';
uchar *p="d";
int i;
uchar ge=0,shi=0,bai=0,qian=0,wan=0,sw=0; //声明全局变量,用于数码管显示,分别为“个、十百、千、万、十万”
void delay(uint count) //延时1ms 子程序
{
uint i,j;
for(i=0;i<count;i++)
for(j=0;j<120;j++);
}
void serial_int()
{
//设置定时器1的工作方式为方式2
TMOD=0x20; //设定定时器1的初值,使串口通讯的波特率为9600bps
TH1=0xfd; TL1=0xfd;
SCON=0x50;
PCON=0x00;
ES=1;EA=1;
TR1=1;
}
/*主函数*/
void main()
{
uint adval,adval2,adval3; //声明变量
unsigned long int temp;
while(1)
{
if(V==0) //选择电压档,进行电压测量 (电流电阻档程序跟此类似)
{
a=0;b=0;c=0; //ADC0808通道选择
start=0;
cs=0;
delay(5);
start=1;
delay(5);
start=0;
while(1)
{
if(eoc==1)
{
cs=1;
adval=P1; //读取数字量
temp=adval* 1.0/255* 1000; //换算成具体电压值的100倍
serial_int();
ES=0;
delay(5);
cs=0;
sw=temp/100000; //取各位的具体数值
wan=temp%100000/10000;
qian=temp%10000/1000;
bai=temp%1000/100;
shi=temp%100/10;
ge=temp%10;
//delay(5);
P0=0x00; //清除P0口的数据,方便下次赋值
delay(5);
wei=1;duan=0; //对数码管进行位选
P0=0xdf;
delay(2);
wei=0;duan=1; //对数码管进行段选(下面类似)
P0=table[ge];
delay(2);
P0=0x00;
wei=1;duan=0;
P0=0xef;
delay(2);
wei=0;duan=1;
P0=table[shi];
delay(2);
P0=0x00;
wei=1;duan=0;
P0=0xf7;
delay(2);
wei=0;duan=1;
P0=table1[bai];
delay(2);
P0=0x00;
wei=1;duan=0;
P0=0xfb;
delay(2);
wei=0;duan=1;
P0=table[qian];
delay(2);
P0=0x00;
wei=1;duan=0;
P0=0xfd;
delay(2);
wei=0;duan=1;
P0=table[wan];
delay(2);
P0=0x00;
wei=1;duan=0;
P0=0xfe;
delay(2);
wei=0;duan=1;
P0=table[sw];
delay(2);
P0=0x00;
start=1;
start=0;
delay(10);
}
if(I==0||R==0) break; //中途换挡则退出循环
}
}
if(I==0) // 选择电流档 进行电流测量
{
a=0;b=1;c=0;
start=0;
cs=0;
delay(5);
start=1;
delay(5);
start=0;
while(1)
{
if(eoc==1)
{
cs=1;
adval2=P1;
temp=adval2*0.1/255*500000;
cs=0;
sw=temp/100000;
wan=temp%100000/10000;
qian=temp%10000/1000;
bai=temp%1000/100;
shi=temp%100/10;
ge=temp%10;
P0=0x00;
delay(5);
wei=1;duan=0;
P0=0xdf;
delay(2);
wei=0;duan=1;
P0=table[ge];
delay(2);
P0=0x00;
wei=1;duan=0;
P0=0xef;
delay(2);
wei=0;duan=1;
P0=table[shi];
delay(2);
P0=0x00;
wei=1;duan=0;
P0=0xf7;
delay(2);
wei=0;duan=1;
P0=table1[bai];
delay(2);
P0=0x00;
wei=1;duan=0;
P0=0xfb;
delay(2);
wei=0;duan=1;
P0=table[qian];
delay(2);
P0=0x00;
wei=1;duan=0;
P0=0xfd;
delay(2);
wei=0;duan=1;
P0=table[wan];
delay(2);
P0=0x00;
wei=1;duan=0;
P0=0xfe;
delay(2);
wei=0;duan=1;
P0=table[sw];
delay(2);
P0=0x00;
start=1;
start=0;
delay(10);
}
if(V==0||R==0) break;
}
}
if(R==0) // 选择电阻档 进行电阻测量
{
a=1;b=0;c=0;
start=0;
cs=0;
delay(5);
start=1;
delay(5);
start=0;
while(1)
{
if(eoc==1)
{
cs=1;
adval3=P1;
temp=adval3* 1.0/255* 100000;
cs=0;
sw=temp/100000;
wan=temp%100000/10000;
qian=temp%10000/1000;
bai=temp%1000/100;
shi=temp%100/10;
ge=temp%10;
P0=0x00;
delay(5);
wei=1;duan=0;
P0=0xdf;
delay(2);
wei=0;duan=1;
P0=table[ge];
delay(2);
P0=0x00;
wei=1;duan=0;
P0=0xef;
delay(2);
wei=0;duan=1;
P0=table[shi];
delay(2);
P0=0x00;
wei=1;duan=0;
P0=0xf7;
delay(2);
wei=0;duan=1;
P0=table1[bai];
delay(2);
P0=0x00;
wei=1;duan=0;
P0=0xfb;
delay(2);
wei=0;duan=1;
P0=table[qian];
delay(2);
P0=0x00;
wei=1;duan=0;
P0=0xfd;
delay(2);
wei=0;duan=1;
P0=table[wan];
delay(2);
P0=0x00;
wei=1;duan=0;
P0=0xfe;
delay(2);
wei=0;duan=1;
P0=table[sw];
delay(2);
P0=0x00;
start=1;
start=0;
delay(10);
}
if(I==0||V==0) break;
}
}
}
}
