(C51学习五)单片机与PC通过串口通信
来源:互联网 发布:怎么打理淘宝店铺 编辑:程序博客网 时间:2024/05/01 10:12
1.开发步骤
2.串口模块
3.SBUF是什么
4.串口相应寄存器
5.给定波特率求定时值
6.代码实现
1.开发步骤
1.设置串口中断寄存器
2.求出给定波特率对应的T1定时器初始值(因为传统的C51是用T1定时器产生波特率的)
3.写程序
2.串口模块
什么是串口?串口就是COM口,串口是串行发送数据的,是一位位地发送数据位,常见的是9针串口。但在一般的C51学习版和开发版上都有集成CH340转换芯片,
使得用usb口就可以代替串口,所以用一般的学习板进行开发,只要插上usb线就可以进行串口测试。
3.SBUF是什么
SBUF是一个寄存器,作为一个缓冲区,当单片机准备接收数据时,会先把数据放到SBUF中,然后再接收。发送也是,当单片机准备发送数据时,会先把数据放到
SBUF中,再发送出去
4.串口相应寄存器
SCON串口控制寄存器(主要用方式1)
SM1,SM0:
SM0SM1工作方式功能波特率00方式08位同步移位寄存器晶振频率 / 1201方式110位UART可变10方式211位UART晶振频率/32或晶振频率/6411方式311位UART可变
SM2:----多机通信控制位(可以先不理)
多机通信是工作在方式2和方式3的,所以SM2主要用于方式2和方式3,多级通信时,SM2=1,当SM2=1时,只有当接收到的数据帧第9位(RB8)为1时,
单片机才把前八位数据放入自己的SBUF中,否则,将丢弃数据帧。当SM2=0时,不论RB8的值是什么,都会把串口收到的数据放到SBUF中。
REN:-----允许接收位
REN用于控制是否允许接收数据,REN=1时,允许接收数据,REN=0时,拒绝接收数据
TB8:-------是要发送的第9位数据位
在方式2和方式3中,TB8是要作为数据帧第9位被发送出去的,在多机通信中,可用于判断当前数据帧的数据是地址还是数据,TB8=0为数据,TB8=1为地址
RB8:-------接收到的第9位数据位
当单片机已经接收一帧数据帧时,会把数据帧中的第9位放到 RB8中。方式0不使用RB8,在方式2和方式3中,RB8为接收到的数据帧的第9位数据位。
TI:-----发送中断标志位
方式0中,不用管他。其他方式下,当发送数据完毕,硬件会将其置1,当 TI 被置1,会向CPU发送中断请求。我们记得要在中断服务程序中把 IT 置回0.
RI:-----接收中断标志位
当接受完一帧数据时,RI 由硬件置1,当RI 被置1,会向CPU请求中断。同样要在中断服务程序中把 RI 置回0。
PCON功率控制寄存器
这个寄存器只有一个位SMOD,在方式1,2.,3时,波特率都与SMOD有关,当SMOD=1时,波特率会增加一倍。复位时,SMOD变回0
5.给定波特率求定时值
串口中断要有定时器T1参加,因为C51是用定时器1来产生波特率的。
因此就需要给 定时器T1 设置初值。
首先,我们要选择一个合适的波特率,波特率关乎数据发送的快慢,一般我们选择9600b/s好了,你选2400也没问题。
一般我们会选择定时器的方式2(这里不是说上面的方式2,而是最大计数为256且自动重载定时器初值的方式)
使用这种方式是因为它能自动重载定时器初值,不用在中断服务程序中人工重设,可以减少误差。
下面给出公式:
Fosc:为晶振频率
(256-X):最终要求的是X,256出现的原因是定时器的方式2最大技术是256,如果是方式1,则是65536-X
最后把X化成16进制,高八位赋给 TH1,第八位赋给 TL1
例子:
或者可以直接下载一个51波特率计算器:
6.代码实现:
测试前提:首先要在PC机(电脑)上下载个串口助手,用于接收51单片机的数据。
C51发送数据到电脑:
#include <reg51.h>typedef unsigned char uint8;typedef unsigned int uint16;uint8 Buf[]="hello world!\n";void delay(uint16 n){while (n--);}/*波特率为9600*/void UART_init(void){ SCON = 0x50; //串口方式1 TMOD = 0x20; // 定时器使用方式2自动重载 TH1 = 0xFD; //9600波特率对应的预设数,定时器方式2下,TH1=TL1 TL1 = 0xFD; TR1 = 1;//开启定时器,开始产生波特率}/*发送一个字符*/void UART_send_byte(uint8 dat){SBUF = dat; //把数据放到SBUF中while (TI == 0);//未发送完毕就等待TI = 0; //发送完毕后,要把TI重新置0}/*发送一个字符串*/void UART_send_string(uint8 *buf){while (*buf != '\0'){UART_send_byte(*buf++);}}main(){UART_init();while (1){UART_send_string(Buf);delay(20000);}}效果:串口助手连接后会不停显示 hello world。(串口助手波特率要设成和单片机发送波特率一样,COM口也是)
电脑发送数据到单片机:
#include<reg52.h>#define uchar unsigned char#define uint unsigned intuchar buf;void main(void){SCON=0x50;//设定串口工作方式0101 0000PCON=0x00;TMOD=0x20;EA=1;ES=1;TL1=0xfd;//波特率9600TH1=0xfd;TR1=1;while(1);}//串行中断服务函数void serial() interrupt 4{ES=0;//暂时关闭串口中断RI=0;buf=SBUF;//把收到的信息从SBUF放到buf中。switch(buf){case 0x31: P1=0xfe;break; //二进制 0011 0001 十进制 49 控制字符 1 16进制 0X31case 0x32: P1=0xfd;break; //1111 1101case 0x33: P1=0xfb;break;case 0x34: P1=0xf7;break;case 0x35: P1=0xef;break; case 0x36: P1=0xdf;break;case 0x37: P1=0xbf;break;case 0x38: P1=0x7f;break;}ES=1;//重新开启串口中断}效果:当用电脑的串口助手向单片机发送数字1的时候,单片机会亮起LED0,以此类推。
- (C51学习五)单片机与PC通过串口通信
- C51 语言编程:单片机与 PC 串口通信程序
- PC与单片机串通(串口通信)
- 单片机-串口与PC通信
- 单片机与RS232串口通信C51程序
- 【串口通信】Labview与C51单片机实现串口通信
- 51单片机学习笔记(五)_VSPD+Proteus+串口调试工具+Keil C51实现单片机串口通信仿真
- 51单片机与PC进行串口通信
- 51单片机与PC串口通信
- 单片机与PC机多机通讯 串口通信
- Android通过串口与PC通信
- 51单片机与PC串口通信程序及硬件电路图
- 51 单片机与PC 串口通信程序及硬件电路图
- PC机串口调试助手与单片机通信字符问题
- PC与串口通信
- 51单片机和PC串口异步通信(续)
- 关于PC机单片机串口通信
- 51单片机和PC串口异步通信
- 405. Convert a Number to Hexadecimal
- iostat -d -x -k 1 100
- (大数相加)HDU 1002 A + B Problem II
- 历届试题 波动数列
- Glide、Picasso与与Fresco要点
- (C51学习五)单片机与PC通过串口通信
- 【C++】Keans聚类算法的C++实现
- 简单的string问题解决:Detect Capital
- java懒加载异常的解决
- Longest Palindromic Substring (第一周)
- 软件测试高级问题
- Python 爬虫教程 4
- 三种遍历:for,for-Each,Iterator
- Java正则表达式-2