当前位置: 代码迷 >> 单片机 >> 关于串口的有关问题
  详细解决方案

关于串口的有关问题

热度:230   发布时间:2016-04-28 16:25:40.0
关于串口的问题
#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;
  相关解决方案