本程序的主要用途是利用上位机显示AD0804转换后的电压值,利用上位机发送1,就会每个一秒的时间在上位机上显示电压值,当发送2时,退出显示电压值,一旦发送除这两个字以外的数字,就会出现ERROR的字眼字样,,但是我在调试的过程发现有一个问题,就是无论我在上位机上面对
单片机发送什么数据,包括1和2,都会显示ERROR的字眼,找了很久也找不到原因在哪里,所以发上
论坛,大家谈论一下,,问题究竟在哪里~??当然啦,数码管也是显示全部000000.。。。
#include<reg51.h>
#include<intrins.h>
#include<stdio.h>
#define uchar unsigned char
#define uint unsigned int
sbit seg04=P2^3;
sbit seg03=P2^2;
sbit seg02=P2^1;
sbit seg01=P2^0;
sbit adcwr=P3^6;
sbit adcrd=P3^7;
uint t0_num,a;
uchar flag_
time,flag_uart,flag_on;
uint A1,A2,A3,A4;
float adcunm2;
long adcunm3,adcunm,ad_val,ad_vo;
uchar code table1[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f
};
uchar code table2[]={
0xBf,0x86,0xDb,0xCf,
0xE6,0xEd,0xFd,0x87,
0xFf,0xEf
};
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void init()
{
TMOD=0x21;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TH1=0xfd;
TH1=0xfd;
TR1=1;
ET0=1;
SM0=0;
SM1=1;
REN=1;
EA=1;
ES=1;
}
void display(long adcunm13)
{
A1=adcunm13/1000;
A2=adcunm13%1000/100;
A3=adcunm13%100/10;
A4=adcunm13%10;
P0=0xff;
seg01=0;
seg02=1;
seg03=1;
seg04=1;
P0=table2[A1];
delayms(5);
seg01=1;
P0=0xff;
seg02=0;
seg03=1;
seg04=1;
P0=table1[A2];
delayms(5);
seg01=1;
seg02=1;
P0=0xff;
seg03=0;
seg04=1;
P0=table1[A3];
delayms(3);
seg01=1;
seg02=1;
P0=0xff;
seg03=1;
seg04=0;
P0=table1[A4];
delayms(3);
}
long start()
{
adcwr=1;
_nop_();
adcwr=0;
_nop_();
adcwr=1;
_nop_();
_nop_();
_nop_();
P1=0xff;
adcrd=1;
_nop_();
adcrd=0;
_nop_();
adcunm=P1;
adcrd=1;
adcunm2=adcunm*(5.0000/256);
adcunm3=adcunm2*1000;
return adcunm3;
}
void main()
{init();
while (1)
{
if (flag_uart==1)
{
flag_uart=0;
ES=0;
TI=1;
switch (flag_on)
{
case 0:
puts("Turn on ad
");
TR0=1;
break;
case 1:
printf("Turn off ad
");
TR0=0;
break;
case 2:
puts("Error");
break;
}
while (!TI);
TI=0;
ES=1;
}
if (flag_time==1)
{
flag_time=0;
ad_val=start();
//ad_vo=(float)adcunm*5.0000/256.0;
ES=0;
TI=1;
printf("the voltage is %lV
",ad_val);
while (!TI);
TI=0;
ES=1;
}
display(ad_val);
}
}
void time0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t0_num++;
if(t0_num==20)
{
t0_num=0;
flag_time=1;
}
}
void ser() interrupt 4
{
RI=0;
a=SBUF;
flag_uart=1;
if(a==1)
flag_on=0;
else if(a==2)
flag_on=1;
else
flag_on=2;
}
改了,还是一样喔~!
哦~!是哦~!好的~1谢谢你哈~!
一周热门 更多>