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; }
串口打印结构体数据
#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); //调用延时函数。 } }
作者:儒良设计
-------------------------------------------
个性签名:独学而无友,则孤陋而寡闻。做一个灵魂有趣的人!
万水千山总是情,打赏一分行不行,所以如果你心情还比较高兴,也是可以扫码打赏博主,哈哈哈(っ•̀ω•́)っ✎⁾⁾!