• Keil C51学习 7 串口控制


    串口流水灯

    发送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); //调用延时函数。
            }
    }
     
    串口打印结构体数据
  • 相关阅读:
    实现 RSA 算法之改进和优化(第三章)(老物)
    实现 RSA 算法之 C 语言实现(第二章)(老物)
    实现 RSA 算法之基础公式证明(第一章)(老物)
    mapreducer计算原理
    Job的运行过程
    HDFS之JAVAAPI
    HDFS文件操作
    HdfS体系结构
    hdfs(分布式文件系统)优缺点
    hadoop的单机配置
  • 原文地址:https://www.cnblogs.com/bymeet/p/14355283.html
Copyright © 2020-2023  润新知