求用keil实现单片机与PC机串口通信

单片机接收PC机发来的字符,并将其显示在LCD1602上,我用的是开发板


#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include<intrins.h>

sbit RS = P2^4;   //定义端口 
sbit RW = P2^5;
sbit EN = P2^6;
sbit led= P1^0;
#define RS_CLR RS=0 
#define RS_SET RS=1

#define RW_CLR RW=0 
#define RW_SET RW=1 

#define EN_CLR EN=0
#define EN_SET EN=1

#define DataPort P0
unsigned char date[17],*p;
/*------------------------------------------------
 uS延时函数,含有输入参数 unsigned char t,无返回值
 unsigned char 是定义无符号字符变量,其值的范围是
 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
 长度如下 T=tx2+5 uS 
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{   
 while(--t);
}
/*------------------------------------------------
 mS延时函数,含有输入参数 unsigned char t,无返回值
 unsigned char 是定义无符号字符变量,其值的范围是
 0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
void DelayMs(unsigned char t)
{
     
 while(t--)
 {
     //大致延时1mS
     DelayUs2x(245);
 DelayUs2x(245);
 }
}
/*------------------------------------------------
              判忙函数
------------------------------------------------*/
 /*bit LCD_Check_Busy(void) 
 { 
 DataPort= 0xFF; 
 RS_CLR; 
 RW_SET; 
 EN_CLR; 
 _nop_(); 
 EN_SET;
 return (bit)(DataPort & 0x80);
 }*/
/*------------------------------------------------
              写入命令函数
------------------------------------------------*/
 void LCD_Write_Com(unsigned char com) 
 {  
// while(LCD_Check_Busy()); //忙则等待
 DelayMs(5);
 RS_CLR; 
 RW_CLR; 
 EN_SET; 
 DataPort= com; 
 _nop_(); 
 EN_CLR;
 EN_SET; 
 DataPort= com<<4; 
 _nop_(); 
 EN_CLR;
 }
/*------------------------------------------------
              写入数据函数
------------------------------------------------*/
 void LCD_Write_Data(unsigned char Data) 
 { 
 //while(LCD_Check_Busy()); //忙则等待
 DelayMs(5);
 RS_SET; 
 RW_CLR; 
 EN_SET; 
 DataPort= Data; 
 _nop_();
 EN_CLR;
  EN_SET; 
 DataPort= Data<<4; 
 _nop_();
 EN_CLR;
 }

/*------------------------------------------------
                清屏函数
------------------------------------------------*/
 void LCD_Clear(void) 
 { 
 LCD_Write_Com(0x01); 
 DelayMs(5);
 }
/*------------------------------------------------
              写入字符串函数
------------------------------------------------*/
 void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) 
 {     
 if (y == 0) 
  {     
 LCD_Write_Com(0x80 + x);     //表示第一行
  }
 else 
  {      
  LCD_Write_Com(0xC0 + x);      //表示第二行
  }        
 while (*s) 
  {     
 LCD_Write_Data( *s);     
 s ++;     
  }
 }
/*------------------------------------------------
              写入字符函数
------------------------------------------------*/
 void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) 
 {     
 if (y == 0) 
  {     
  LCD_Write_Com(0x80 + x);     
  }    
 else 
  {     
  LCD_Write_Com(0xC0 + x);     
  }        
 LCD_Write_Data( Data);  
 }
/*------------------------------------------------
              初始化函数
------------------------------------------------*/
 void LCD_Init(void) 
 {
   LCD_Write_Com(0x38);    /*显示模式设置*/ 
   DelayMs(5); 
   LCD_Write_Com(0x38); 
   DelayMs(5); 
   LCD_Write_Com(0x38); 
   DelayMs(5); 
   LCD_Write_Com(0x28);    //4bit 模式
   LCD_Write_Com(0x08);    /*显示关闭*/ 
   LCD_Write_Com(0x01);    /*显示清屏*/ 
   LCD_Write_Com(0x06);    /*显示光标移动设置*/ 
   DelayMs(5); 
   LCD_Write_Com(0x0C);    /*显示开及光标设置*/
   }
/*------------------------------------------------
                    发送一个字节
------------------------------------------------*/
void SendByte(unsigned char dat)
{
 SBUF = dat;
 while(!TI);
 TI = 0;
}
/*------------------------------------------------
                    发送一个字符串
------------------------------------------------*/
void SendStr(unsigned char *s)
{
 while(*s!='\0')         // \0 表示字符串结束标志,通过检测是否字符串末尾
  {
   SendByte(*s);
   s++;
  }
}
 
/*------------------------------------------------
                    串口初始化
------------------------------------------------*/
void InitUART  (void)
{
 SCON  = 0x50;           // SCON: 模式 1, 8-bit UART, 使能接收  
 TMOD |= 0x20;               // TMOD: timer 1, mode 2, 8-bit 重装
 TH1   = 0xFD;               // TH1:  重装值 9600 波特率 晶振 11.0592MHz  
 TR1   = 1;                  // TR1:  timer 1 打开                         
 EA    = 1;                  //打开总中断
//  ES    = 1;               //打开串口中断
}                           
/*------------------------------------------------
                     串口中断程序
------------------------------------------------*/
void UART_SER (void) interrupt 4 //串行中断服务程序
{
 unsigned char n;            
 if(RI)                         //判断是接收中断产生
  {
    led=~led;  
     RI=0;                        //标志位清零
     date[n]=SBUF;   
 n++;     
 n&=0x0f;
   }
 if(TI)
  {                       //如果是发送标志位,清零
   TI=0;
  }
}   
/*------------------------------------------------
                    主函数
------------------------------------------------*/ 
void main(void) 

LCD_Init(); 
LCD_Clear();//清屏
SendStr("串口通信单片机测试 电脑串口调试工具发送信息 显示到1602显示屏上");
ES    = 1;
while (1) 
 { 
  p=&date[0];  
  LCD_Write_String(5,0,"hehe hehe");
  LCD_Write_String(1,1,*p);
 
 }
}

//希望采纳

追问

我看到过这个,不太对哦

温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-01-07
你这个问题真有意思,单片机是什么芯片?不同的芯片都有不同的串口、LCD驱动的
相似回答