菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
146
0

Keil C51学习 7 串口控制

原创
05/13 14:22
阅读数 71213

串口流水灯

发送HEX 01 可以控制第一盏灯点亮,再次发送可以控制熄灭

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar i;

sbit D0=P1^0;
sbit D1=P1^1;
sbit D2=P1^2;
sbit D3=P1^3;
sbit D4=P1^4;
sbit D5=P1^5;
sbit D6=P1^6;
sbit D7=P1^7;
//波特率 19200
void init_uart(void)
{
    TMOD=0X20;
    TH1=0XFD;//19200
    TL1=0XFD;
    TR1=1;
    SCON=0X50;
    EA=1;
    ES=1;    
}

void main (void)
{
    init_uart();
    while(1)
    {
        while(!RI);
        RI=0;
        i=SBUF;
        switch(i)
        {
            case 0x01 :D0=~D0;break;
            case 0x02 :D1=~D1;break;
            case 0x03 :D2=~D2;break;
            case 0x04 :D3=~D3;break;
            case 0x05 :D4=~D4;break;
            case 0x06 :D5=~D5;break;
            case 0x07 :D6=~D6;break;
            case 0x08 :D7=~D7;break;
        }
    }

}
串口流水灯

发送接收

#include<reg52.h>
#define uchar unsigned char
uchar a,flag;
void main()
{
    TMOD=0x20;//设置定时器1为模式2
    TH1=0xfd;//装初值设定波特率19200
    TL1=0xfd;
    TR1=1;//启动定时器
    SM0=0;//串口通信模式设置
    SM1=1;
    REN=1;//串口允许接收数据
    EA=1;//开总中断
    ES=1;//开串中断
    PCON=0x80;
    while(1)
    {
        if(flag==1)//如果有数据则进入这个语句
        {
            ES=0;//进入发送数据时先关闭串行中断
            flag=0;
            SBUF=a;//将数据原样发回
            while(!TI);//等待数据发完
            TI=0;
            ES=1;//退出再开串行中断
        }
    }
}

void serial() interrupt 4//串行中断函数
{
    P1=SBUF;//将数据发送给P1口显示(测试用)
    a=SBUF;//收取数据
    flag=1;//标志置位
    RI=0;
}
发送接收

 

串口程序参考.h

#define T1MS_1200bps   0xD8;     /* (e8,-24,SMOD=0) @4800bps  pcon&=0x7f @11.0592MHz*/
#define T1MS_2400bps   0xEC;     /* (f4,-12,SMOD=0) @4800bps  pcon&=0x7f */
#define T1MS_4800bps   0xfa;     /* (fa, -6,SMOD=0) @4800bps  pcon&=0x7f */
#define T1MS_9600bps   0xFB;     /* (fd, -3,SMOD=0) @9600bps  pcon&=0x7f */
#define T1MS_19k2bps   0xfd;     /* (fd, -3,SMOD=1) @19.2kbps pcon|=0x80 */

unsigned char z;

/*********************************
函数名:sel_bps(select bps)
功能:设置串口波特率
sel为选择通讯速率:
  0=1200,1=2400,2=4800,3=9600,4=19.2k
作者:于振南
日期:06.02.25
*********************************/
void sel_bps(unsigned char sel)
{
     switch(sel)
     {
        case 0:PCON&=0x7f;
               TH1=T1MS_1200bps;   /* T1 use sio */
               TL1=T1MS_1200bps;
               break;
        case 1:PCON&=0x7f;
               TH1=T1MS_2400bps;   /* T1 use sio */
               TL1=T1MS_2400bps;
               break;
        case 2:PCON&=0x7f;
               TH1=T1MS_4800bps;   /* T1 use sio */
               TL1=T1MS_4800bps;
               break;
        case 3:PCON&=0x7f;
               TH1=T1MS_9600bps;   /* T1 use sio */
               TL1=T1MS_9600bps;
               break;
        case 4:PCON|=0x80;
               TH1=0xfd;   /* T1 use sio */
               TL1=0xfd;
               break;
     }

}

/*********************************
函数名:tran_init()(tranmit initialize)
功能:串口初始化
     通讯有关参数初始化
作者:于振南
日期:06.02.25
包含子函数:sel_bps
*********************************/
void tran_init()        /* 通讯有关参数初始化 */
{
    sel_bps(3); /* 选择通讯速率:0=1200,1=2400,2=4800,3=9600,4=19.2k */
    /* T1 use sio */
    TMOD=0x21;  /* T1=MODE2,sio; T0=MODE1,16bit,use time */
    PS=1;       /* SIO int high  优先级 */
    EA=1;
    ET1=0;

           SM0=0;
           SM1=1;      /* SM0=0 SM1=1,mode1,10bit          */
           SM2=0;      /* data int,无校验(TB8=bit_duble偶) */

    TR1=1;
    REN=1;
    RI=0;
    TI=0;
    ES=1;

}

/*********************************
函数名:sio_int(sio interrupt)
功能:中断方式接收串口数据   把收到的一个字节放在z中
通讯有关参数初始化
作者:于振南
日期:06.02.25
*********************************/
void  sio_int() interrupt 4 using 2
{
      ES=0;
      if(RI)        /* RI==1 */
      {  z=SBUF;
     RI=0;
      }
      ES=1;
}

void trans(unsigned char dat)
{
 SBUF=dat;
 while(!TI);
 TI=0;
}
串口通信参考.h

 串口打印结构体数据

#include <reg52.h>
#include <intrins.h> // _nop_() 函数在该头文件中进行了定义,必须将头文件包含进来。
#include <stdio.h> // printf()函数在该头文件中进行了定义,必须将头文件包含进来。
#define uchar unsigned char 
#define uint unsigned int 
void delay(int ms) //定义一个函数。
{ 
 uchar i; 
     while(ms--) //while(ms--)构成了循环,每次ms减1,如不为0执行循环体。
     { 
             for(i=0;i<250;i++) //for构成了内层循环,循环次数为250次。
             { 
             _nop_(); //空操作函数,相当于汇编中的nop指令。 
            _nop_(); 
             _nop_(); 
             _nop_(); 
             }
     } 
} 
/*****************结构体数据类型的声明和结构体数组的定义******************/ 
 struct student //结构体类型的声明,struct代表结构体类型,student代表结构体名。
{ 
 int num; //结构体中包含一个整型变量num,用来存放“学号”。
 char name[5];//结构体中包含一个字符型数组name[5],用来存放“名字”。
 char sex; //结构体中包含一个字符型变量sex,用来存放“性别”。
 int age; //结构体中包含一个整型变量age,用来存放“年龄”。
 float score; //结构体中包含一个单精度型变量score,用来存放“分数”。
}stu[3]={ 
 //定义了一个结构体数组stu[3],数组中的每个成员都具有上述结构体的类型。
 //其实数组就相当于定义了3个变量,每个变量都具有结构体类型。
 {1001,"wxh",'m',23,78.5}, //定义结构体数组时,进行了第1个成员的初始化操作。
 {1002,"lxh",'f',25,87.6}, //定义结构体数组时,进行了第2个成员的初始化操作。
 {1003,"fhg",'m',27,94.8}, //定义结构体数组时,进行了第3个成员的初始化操作。 
 };

void main(void) 
{ 
 SCON=0x50; //串口模式1,允许接收
 TMOD=0x20; //定时器1为模式2,8-bit 自动装载方式
 PCON=0x00; //波特率不倍增
 TL1=0xfd; //定时器1的低8位进行初始化设置,设置波特率19200。
 TH1=0xfd; //定时器1的高8位进行初始化设置,设置波特率19200。
 TI=1; //TI 置1,以发送第一个字节
 TR1=1; //启动定时器T1,作为波特率发生器。
    while(1)
    {
       uchar i; 
             for(i=0;i<3;i++) //循环3次,将数组中的成员数据发送到PC机中,用串口助手显示数据。
             printf("%d %s %c %d %f\n",stu[i].num,stu[i].name,stu[i].sex,stu[i].age,stu[i].score); 
             // printf()函数包含格式说明,输出参数两部分,具体可以查相关书籍。
             delay(500); //调用延时函数。
        }
}
 
串口打印结构体数据

 

发表评论

0/200
146 点赞
0 评论
收藏
为你推荐 换一批