教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 文库大全 > 求职职场 >

51单片机串口通信笔记(2)

来源:网络收集 时间:2026-05-04
导读: 816波特,消除误差可以调整时钟振荡频率fosc实现。例如采用的时钟振荡频率为11.0592MHz。 (2) 如果串行通讯选用很低的波特率,例如,波特率选为55,可将定时器T1设置为方式1定时。但在这种情况下,T1溢出时,需用在

816波特,消除误差可以调整时钟振荡频率fosc实现。例如采用的时钟振荡频率为11.0592MHz。
(2) 如果串行通讯选用很低的波特率,例如,波特率选为55,可将定时器T1设置为方式1定时。但在这种情况下,T1溢出时,需用在中断服务程序中重新装入初值。中断响应时间和执行指令时间会使波特率产生一定的误差,可用改变初值的方法加以调整。
例7-3 若8031单片机的时钟振荡频率为11.0592MHz,选用T1为方式2定时作为波特率发生器,波特率为2400b/s,求初值。
上述结果可直接从表7-2中查到。
这里时钟振荡频率选为11.0592 MHz,就可使初值为整数,从而产生精确的波特率。


方式1无中断式
#include <AT89X51.H>

void Send(void);
void rec(void);
int statu=0;
char dat;
void main(void){
TMOD=0x20;
TH1=0xfd;
TH0=0xfd;
TR1=1;
PCON=0x00;
SCON=0x50;
TI=1;
while(1){
rec();
Send();
}
}

void Send(){
int i=0;
if(TI & statu){
TI=0;
SBUF=dat;
while(!TI);
statu=0;
}
}

void rec(){
if(RI){
dat=SBUF;
RI=0;
statu=1;
}
}


方式1中断式

#include <AT89X51.H>

char str[10];
int len=0;

void main(void){
int i=0;
TMOD=0x20;
TH1=0xfd;
TH0=0xfd;
TR1=1;
PCON=0x00;

SCON=0x50;
EA=1;
ES=1;
while(1){
if(len==10){
int i;
ES=0;
SBUF='\n';
while(!TI);
TI=0;
for(i=0;i<10;i++){
SBUF=str[i];

高中物理教学艺术

while(!TI);
TI=0;
}
SBUF='\n';
while(!TI);
TI=0;
ES=1;
len=0;
}
}
}


rec() interrupt 4{
if(RI){
str[len]=SBUF;
RI=0;
ES=0;
SBUF=str[len];
while(!TI);
TI=0;
ES=1;
len++;
}
}








//使用printf,scanf

#include <AT89X51.H>
#include <stdio.h>
void main(void){
int x,y,z;
unsigned int a[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
unsigned int i,j;
P0=1;
SCON=0x50;
TMOD=0x20; //定时器设置主要是波特率
//TCON=0x40;
TH1=0xe8;
TL1=0xe8;
TI=1;
TR1=1;
while(1){
for(j=0;j<8;j++){
for(i=0;i<20000;i++);
P0=a[j];
}
printf("Good morning!\n");
for(j=0;j<8;j++){
for(i=0;i<20000;i++);
P0=0xff-a[j];
}
printf("input x and y\n");
scanf("%d%d",&x,&y);
z=x+y;
printf("x+y=%d\n\n",z);
}
}







//网上程序例子
#include <reg51.h>
#include <string.h>
unsigned char ch;

bit read_flag= 0 ;

void init_serialcom( void ) //串口通信初始设定
{

SCON = 0x50 ; //UART为模式1,8位数据,允许接收
TMOD |= 0x20 ; //定时器1为模式2,8位自动重装
PCON |= 0x80 ; //SMOD=1;
TH1 = 0xFD ; //Baud:19200 fosc="11".0592MHz
IE |= 0x90 ; //Enable Serial Interrupt
TR1 = 1 ; // timer 1 run
TI=1;
}



//向串口发送一个字符

void send_char_com( unsigned char ch)
{
SBUF=ch;
while (TI== 0);
TI= 0 ;
}

//串口接收中断函数

void serial () interrupt 4 using 3
{
if (RI)
{
RI = 0 ;
ch=SBUF;
read_flag= 1 ; //就置位取数标志
}
}

main()
{
init
_serialcom(); //初始化串口
while ( 1 )
{
if (read_flag) //如果取数标志已置位,就将读到的数从串口发出
{
read_flag= 0 ; //取数标志清0
send_char_com(ch);
}
}
}

…… 此处隐藏:245字,全部文档内容请下载后查看。喜欢就下载吧 ……
51单片机串口通信笔记(2).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wenku/119314.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)