登录  | 立即注册

游客您好!登录后享受更多精彩

扫一扫,访问微社区

QQ登录

只需一步,快速开始

开启左侧

[寒假笔记] 串口通信1

[复制链接]
发表于 2022-1-26 21:25:28 | 显示全部楼层 |阅读模式
学习笔记
学习科目: 51单片机
学习安排: 学习串口通信
开始时间: 2022-01-25
结束时间: 2022-01-26
了解串行通信,并行通信,波特率,理解串行通信的原理及单片机和电脑进行收发信息的方式。之后了解通信的三种类型1.单工通信2.半双工通信3.全双工通信,之后利用硬件模块进行串口通信,再结合一下中断。有三个程序,后两个差不多一样,后者多了一个中断把主循环空了出来。

串口1这个程序是我边码边理解的,虽然理解了但是码完了发现不能用,算了一下后发现,按照我写的数字,T0的重载值是小于0,我尝试修改了一下还是不能使用,如果有大佬会的话麻烦回一下贴,谢谢

#include<reg52.h>

sbit PINRXD = P3^0;
sbit PINTXD = P3^1;

bit RxdOrTxd = 0;
bit RxdEnd = 0;
bit TxdEnd = 0;
unsigned char RxdBuf = 0;
unsigned char TxdBuf = 0;

void ConfigUART(unsigned int baud);
void StartTXD(unsigned char dat);
void StartRXD();

void main()
{
   EA = 1;
ConfigUART(9600);

   while(1)
{
   while(PINRXD);
   StartRXD();
         while(!RxdEnd);
         StartTXD(RxdBuf+1);
         while(!TxdEnd);
}
}

void ConfigUART(unsigned int baud)
{
   TMOD &= 0xF0;
   TMOD |= 0x02;
   TH0 = 256-(32768000/12)/baud;
}

void StartRXD()
{
   TL0 = 256 - ((256-TH0)>>1);
   ET0 = 1;
         TR0 = 1;
         RxdEnd = 0;
         RxdOrTxd = 0;
}

void StartTXD(unsigned char dat)
{
   TxdBuf = dat;
   TL0 = TH0;
         ET0 = 1;
   TR0 = 1;
   PINTXD = 0;
   TxdEnd = 0;
   RxdOrTxd = 1;
}

void InterruptTimer0() interrupt 1
{
   static unsigned char cnt = 0;

   if(RxdOrTxd)
         {
         cnt++;
         if(cnt<=8)
         {
         PINTXD = TxdBuf&0x01;
         TxdBuf>>=1;
         }
         else if(cnt == 9)
         {
         PINTXD = 1;
         }
         else
         {
         cnt = 0;
         TR0 = 0;
         TxdEnd = 1;
         }
         }
         else
         {
         if(cnt == 0)
         {
         if(!PINRXD)
         {
         RxdBuf = 0;
         cnt++;
         }
         else
         {
         TR0 = 0;
         }
         }
         else if(cnt<=8)
         {
         RxdBuf>>=1;
         if(PINRXD)
         {
         RxdBuf |= 0x80;
         }
         cnt++;
         }
         else
         {
         cnt = 0;
         TR0 = 0;
         if(PINRXD)
         {
         RxdEnd = 1;
         }
         }
         }

}


串口2.1


#include<reg52.h>

void ConfigUART(unsigned int baud);

void main()
{
ConfigUART(9600);

while(1)
{
while(!RI);
RI = 0;
SBUF = SBUF+1;
while(!TI);
TI = 0;
}
}

void ConfigUART(unsigned int baud)
{
SCON = 0x50;
TMOD &= 0x0F;
TMOD |=0x20;
TH1 = 255-(32768000/12/32)/baud;
TL1 = TH1;
TR1 = 1;
}


串口2.2(加中断)

#include<reg52.h>

void ConfigUART(unsigned int baud);

void main()
{
EA = 1;
ConfigUART(9600);
while(1);
}

void ConfigUART(unsigned int baud)
{
SCON = 0x50;
TMOD &= 0x0F;
TMOD |= 0x20;
TH1 = 255-(32768000/12/32)/baud;
TL1 = TH1;
ET1 = 0;
ES = 1;
TR1 = 1;
}

void InterruptUART() interrupt 4
{
while(!RI);
RI = 0;
SBUF = SBUF+1;
while(!TI);
TI = 0;
}

好懒~~不想说~~~
发表于 2022-1-26 23:16:51 | 显示全部楼层
把波特率换为28800试试,这样256-32768000/12/28800=161.185185185......,波特率是在误差范围之内的,能不能成我也不知道
好懒~~不想说~~~
 楼主| 发表于 2022-1-27 19:13:41 | 显示全部楼层
房一鹏 发表于 2022-1-26 23:16
把波特率换为28800试试,这样256-32768000/12/28800=161.185185185......,波特率是在误差范围之内的,能不 ...

牛哇大佬,可以用了
好懒~~不想说~~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表