首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

关于串口的有关问题

2012-02-07 
关于串口的问题#includereg52.h#includeintrins.h#includestdio.h#define uint unsigned int#define

关于串口的问题
#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
[解决办法]
上位机是你电脑上串口接收和发送的客户端

热点排行