微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 串口通信

串口通信

时间:10-02 整理:3721RD 点击:
串口通信查询方式

#include <reg52.h>

#define uchar unsigned char

#define uint unsigned int

uchar num;

void delay(uint z)

{

         uintx,y;

         for(x= z; x > 0; x--)

                  for(y= 114; y > 0; y--);

}

void UART_init()

{

         TMOD= 0x20; //T1工作模式2  8位自动重装

         TH1= 0xfd;

         TL1= 0xfd;  //比特率位9600

         TR1= 1;    //启动T1计时器

         SM0= 0;

         SM1= 1;  //串口工作方式1 10位异步收发

         REN=1;    //串口允许接收位

}

void main()

{

         UART_init();

         while(1)

         {

                  SBUF= num;

                  while(!TI);

                  TI= 0;

                  num++;

                  delay(500);      

                  //读取SBUFF

                  //while(!RI);

                  //P1= SBUF;

                  //RI= 0;

         }      

}

中断方式

#include <reg52.h>

#define uchar unsigned char

#define uint unsigned int

uchar num;

void delay(uint z)

{

         uintx,y;

         for(x= z; x > 0; x--)

                  for(y= 114; y > 0; y--);

}

void UART_init()

{

         TMOD= 0x20; //T1工作模式2  8位自动重装

         TH1= 0xfd;

         TL1= 0xfd;  //比特率位9600

         TR1= 1;   //打开计数器1

         SM0= 0;

         SM1= 1;  //串口工作方式1 10位异步收发

         REN=1;    //串口允许接收位

         EA= 1;    // 开总中断

         ES= 1;    // 打开串口中断

}

void main()

{

         UART_init();

         while(1);

}

void UART() interrupt 4 //内部查询优先级

{

         if(RI)  //检测接收是否完成

         {

                  num= SBUF;  //取出缓存器的值

                  P1= SBUF;

                  num++;

                  RI= 0;

                  SBUF= num;

                  while(!TI);

                  TI= 0;

         }

}

1.  以4800bps从计算机发任意一字节数据,通过数码管以十进制的形式显示出来。

/*

以4800bps从计算机发任意一字节数据,通过数码管以十进制显示

的形式显示出来。

*/

#include <reg52.h>

#define uchar unsigned char

#define uint  unsigned int

sbit we = P2^7;        //数码管位选

sbit du = P2^6;         //数码管段选

/*数码管段码*/

uchar code leddata[]={

                0x3F,  //"0"

                0x06,  //"1"

                0x5B,  //"2"

                0x4F,  //"3"

                0x66,  //"4"

                0x6D,  //"5"

                0x7D,  //"6"

               0x07,  //"7"

                0x7F,  //"8"

                0x6F,  //"9"

                0x77,  //"A"

                0x7C,  //"B"

                0x39,  //"C"

                0x5E,  //"D"

                0x79,  //"E"

                0x71,  //"F"

                0x76,  //"H"

                0x38,  //"L"

                0x37,  //"n"

                0x3E,  //"u"

                0x73,  //"P"

                0x5C,  //"o"

                0x40,  //"-"

                0x00,  //熄灭

                0x00  //自定义

                         };

/*1毫秒延时函数*/

void delay(uint z)   

{

         uintx,y;

         for(x= z; x > 0; x--)

                  for(y= 114; y > 0 ; y--);

}

/*

串口初始化函数

工作模式1 10位异步收发发送速率4800bps

*/

void UART_init()  

{

         TMOD= 0x20;       //T1工作模式2  8位自动重装

         TH1= 0xfa;

         TL1= 0xfa;     //比特率4800

         TR1= 1;            //启动T1定时器

         SM0= 0;

         SM1= 1;                  //串口工作方式1 10位异步

         REN= 1;           //串口允许接收

}

/*3位数码管显示函数*/

void display(uchar num)

{

         ucharbai,shi,ge;

         bai= num / 100; //求模

         shi= num % 100 / 10; //求余100后求出有多少个10

         ge  = num % 10; //求余

         

         P0= 0xff; //清除断码

         we= 1;

         P0= 0xfe;       //点亮第一位数码管

         we= 0;

         du= 1;

         P0= leddata[bai];   //显示百位

         du= 0;

         delay(1);

         P0= 0xff; //清除断码

         we= 1;

         P0= 0xfd;//点亮第二位数码管

         we= 0;

         du= 1;

         P0= leddata[shi];   //显示十位

         du= 0;

         delay(1);

         P0= 0xff; //清除断码

         we= 1;

         P0= 0xfb;//点亮第三位数码管

         we= 0;

         du= 1;

         P0= leddata[ge];  //显示各位

         du= 0;

         delay(1);  

}

void main()

{

         UART_init();//串口配置初始化

         while(1)

         {

                  if(RI)        //检测是否接收完成

                  {

                          RI= 0;      //清除接收标志位,以便于下次接收

                  }

                  display(SBUF);//取出接收SBUF的值赋给数码管显示

         }

}

2.  把矩阵键盘的键值以2400bps上传到计算机串口助手。

/*

把矩阵键盘的键值以2400bps上传到计算机串口助手

*/

#include <reg52.h>

#define uchar unsigned char

#define uint  unsigned int

/*1毫秒延时函数*/

void delay(uint z)   

{

         uintx,y;

         for(x= z; x > 0; x--)

                  for(y= 114; y > 0 ; y--);

}

/*

串口初始化函数

工作模式1 10位异步收发发送速率2400bps

*/

void UART_init()  

{

         TMOD= 0x20;       //T1工作模式2  8位自动重装

         TH1= 0xf4;

         TL1= 0xf4;     //比特率2400,计算公式256-11059200/2400/32/12

         TR1= 1;            //启动T1定时器

         SM0= 0;

         SM1= 1;                  //串口工作方式1 10位异步

//     REN= 1;           //串口允许接收

}

/*

         4*4矩阵键盘扫描函数

         带返回值,返回键值码

*/

uchar KeyScan()

{

         ucharcord_l,cord_h;//声明列线和行线的值的储存变量

         P3= 0xf0;//1111 0000

         if((P3 & 0xf0) != 0xf0)//判断是否有按键按下

         {

                  delay(5);//软件消抖

                  if((P3 & 0xf0) != 0xf0)//判断是否有按键按下

                  {

                            cord_l = P3 & 0xf0;// 储存列线值

                            P3 = cord_l | 0x0f;

                            cord_h = P3 & 0x0f;// 储存行线值

                             while( (P3 & 0x0f) != 0x0f );//松手检测

                            return (cord_l + cord_h);//返回键值码

                  }      

         }

                  

}

/*

         4*4矩阵键盘键值码处理函数

         返回转换后的键值码

*/

uchar KeyPro()

{

         ucharkey_value; //存放转换后的按键值

         switch(KeyScan() )

         {

                 //第一行键值码

                  case0xee: key_value = 0x01;                  break;

                  case0xde: key_value = 0x02;                  break;

                  case0xbe: key_value = 0x03;                  break;

                  case0x7e: key_value = 0x04;                  break;

                  

                  //第二行键值码

                  case0xed: key_value = 0x05;                  break;

                  case0xdd: key_value = 0x06;                  break;

                  case0xbd: key_value = 0x07;                  break;

                  case0x7d: key_value = 0x08;                  break;

                  //第三行键值码

                  case0xeb: key_value = 0x09;                  break;

                  case0xdb: key_value = 0x0a;                  break;

                  case0xbb: key_value = 0x0b;                  break;

                  case0x7b: key_value = 0x0c;         break;

                  //第四行键值码

                  case0xe7: key_value = 0x0d;                  break;

                  case0xd7: key_value = 0x0e;                  break;

                  case0xb7: key_value = 0x0f;          break;

                  case0x77: key_value = 0x10;                  break;

         }

         return(key_value);//返回转换后的键值码

}

void main()

{

         UART_init();//串口初始化

         while(1)

         {

                  SBUF= KeyPro();//调用带返回值的键值码转换函数,把转换后的键值码送入发送SBUF

                  while(!TI);                 //检测是否发送完毕

                  TI= 0;                        //清楚发送完毕标志位,已便于下次发送

         }

}


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top