关于串口的问题
#include<reg52.h>
#include<intrins.h>
#include<stdio.h>
#define uint unsigned int
#define uchar unsigned char
sbit clock=P1^1; // 时钟信号(数据输入)
sbit date_out=P3^2; // 数据输出
sbit cs=P1^0; // 片选信号
float volt;
uchar code table[10] = {0x03, 0x9f, 0x25, 0x0d, 0x99, 0x49, 0x41, 0x1f, 0x01, 0x09};
uchar code table_d[10] = {0x02, 0x9e, 0x24, 0x0c, 0x98, 0x48, 0x40, 0x1e, 0x00, 0x08}; //带点数码管显示
uchar t0_num, flag_time,flag_on,flag_uart,temp;
//*************延时函数*************
void delay(uint del)
{
uchar i, j;
for(i=0; i<del; i++)
for(j=0; j<=148; j++);
}
//***********初始化函数***************
void init()
{
TMOD=0X21;
TH1=0XFD;
TL1=0XFD;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
SM0=0;
SM1=1;
REN=1;
//SCON=0X50;
TR1=1;
TR0=1;
ET0=1;
EA=1;
ES=1;
}
//*************获得AD的值**********************
uchar tlc549_qudong()
{
uchar i,temp;
cs=1;
clock=0;
cs=0; // cs置底电平。 同时date_out为高。(=1).
_nop_();
_nop_(); //延时大约1.4us,开始转换。
for(i=0;i<8;i++) //开始串行数据的输入;
{
temp<<=1;
temp|=date_out;
clock=1;
_nop_();
clock=0; //CLK transition time Max 0.1us
}
cs=1;
for(i=17;i>0;i--) //延时17us后读出数据。
_nop_();
return temp ;
}
//***********数据扩大1000倍,为了方便读出*************//
/*void date_conversation(void)
{
uchar AD_Data;
AD_Data=tlc549_qudong();
volt=(float)AD_Data*5.0/256.0; //特别要注意volt要是float型。
} */
//*************分离百,十,个位*************************
void display(uchar temp)
{
uchar bai,shi,ge;
bai=temp/100;
shi=temp/10%10;
ge=temp%10;
P2=0x04;
P0=table_d[bai];
delay(4);
P2=0x02;
//b=d/10%10;
P0=table[shi];
delay(4);
P2=0x01;
//c=d%10;
P0=table[ge];
delay(4);
}
void main()
{
init();
P2=0X00;
while(1)
{
if(flag_uart==1)
{
flag_uart=0;
ES=0;
TI=1;
switch(flag_on)
{
case 0: puts("Turn on AD!\n");
TR0=1;
break;
case 1: printf("Turn off AD!\n");
TR0=0;
break;
case 2: puts("error!\n");
break;
}
while(!TI);
TI=0;
ES=1;
}
if(flag_time==1)
{
flag_time=0;
temp=tlc549_qudong();
volt=(float)temp*5.0/256.0;
// date_conversation();
ES=0;
TI=1;
printf("the volage is %fV\n",volt) ;
while(!TI);
TI=0;
ES=1;
}
display(temp);
}
}
void timer() 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
{
uchar a;
RI=0;
a=SBUF;
flag_uart=1;
if(a==1) flag_on=0;
else if(a==2) flag_on=1;
else flag_on=2;
}
不知道为什么么,接受缓冲区不停的接受数据,好像进入了死循环。
不过发什么什么数 就只出现 error! 然后继续现在电压。
真确的应该是:发送 01 接受区出现:Turn on ad, the volage is ````.
发送 02 接受区出现:Turn on off. 显示上次的电压值。
发送其他的数字。。接受区出现: 只出现error!
[解决办法]
和上位机的协议不清楚。
[解决办法]
你设的是用timer1做为波特率产生器,但你好像没有设置波特率,再说了做为波特率用的计时器是不能开中断的.所以你这个串口设置是混乱的,接收不到正确的数据.如果被我言中,记得给分哦,谢谢!
[解决办法]
UPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUP
[解决办法]
上位机是你电脑上串口接收和发送的客户端