登录  | 立即注册

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

扫一扫,访问微社区

QQ登录

只需一步,快速开始

开启左侧

[寒假笔记] 串口通信1

[复制链接]
发表于 2022-1-20 18:03:30 | 显示全部楼层 |阅读模式
学习笔记
学习科目: 单片机
学习安排: 单片机
开始时间: 2022-01-20
结束时间: 2022-01-20
本帖最后由 房一鹏 于 2022-1-25 21:49 编辑

在把此程序下载到板子里后,我用串口助手发送数据,但接受不到任何数据。翻看了之前学长的帖子之后,发现32768000/12/9600为小数,与电脑串口不对应,故不能使用。其中这两位学长的帖子写的很好(链接发到下面)http://bbs.hpuedd.com/forum.php?mod=viewthread&tid=2457&extra=page%3D14%26filter%3Dtypeid%26typeid%3D238http://bbs.hpuedd.com/forum.php?mod=viewthread&tid=2516&extra=page%3D10%26filter%3Dtypeid%26typeid%3D238

补充:波特率计算是允许有偏差的见下图,所以改变定时器的初值是可以使程序运行的,具体计算多少的初值,就自己算了(我没算)。
但还是把程序发一遍(不可以用的
#include<reg52.h>

sbit Rxd=P3^0;
sbit Txd=P3^1;

bit RxdEnd=0;                      //ê&#228;è&#235;&#189;áê&#248;±ê&#214;&#190;
bit TxdEnd=0;                      //ê&#228;3&#246;&#189;áê&#248;±ê&#214;&#190;
bit RxdOrTxd=0;                    //&#197;D&#182;&#207;ê&#228;è&#235;£&#172;ê&#228;3&#246;&#161;£μèóú0ê&#228;è&#235;£&#187;μèóú1ê&#228;3&#246;
unsigned char Rxdbuf=0;            //ê&#228;è&#235;êy×&#214;
unsigned char Txdbuf=0;            //ê&#228;3&#246;êy×&#214;

void configUATA(unsigned int baud);
void StartRxd();
void StartTxd(unsigned char dat);      //oˉêyéù&#195;÷

void main()
{
        EA=1;
        configUATA(9600);                    
        
        while(1)
        {
                while(Rxd);
                StartRxd();
                while(!RxdEnd);
                StartTxd(Rxdbuf+1);
                while(!TxdEnd);
        }
}

void configUATA(unsigned int baud)
{
        TMOD&=0xF0;
        TMOD|=0x01;                        //éè&#214;&#195;&#182;¨ê±&#198;÷0μ&#196;1¤×÷&#196;£ê&#189;&#206;a2
        TH0=256-(32768000/12)/baud;  

}

void StartRxd()
{
        
        TL0=256-((256-TH0)>>1);
        ET0=1;                      //′ò&#191;a&#214;D&#182;&#207;
        TR0=1;                      //′ò&#191;a&#182;¨ê±&#198;÷
        RxdEnd=0;                   //ê&#228;è&#235;&#206;′&#189;áê&#248;
        RxdOrTxd=0;                 
}

void StartTxd(unsigned char dat)
{
        Txdbuf=dat;
        TL0=TH0;
        ET0=1;
        TR0=1;
        Txd=0;
        TxdEnd=0;                 //ê&#228;3&#246;&#206;′&#189;áê&#248;
        RxdOrTxd=1;
}

void interruptTimer0() interrupt 1
{
        static unsigned char cnt=0;
        if(RxdOrTxd)                   //ê&#228;3&#246;3ìDò
        {
                cnt++;
                if(cnt<=8)
                {
                        Txd=Txdbuf&0x01;
                        Txdbuf>>=1;
                }
                else if(cnt==9)
                {
                        Txd=1;
                }
                else
                {
                        cnt=0;
                        TR0=0;
                        TxdEnd=1;
                }
        }
        else                           //ê&#228;è&#235;3ìDò
        {
                if(cnt==0)
                {
                        if(!Rxd)
                        {
                                Rxdbuf=0;
                                cnt++;
                        }
                        else
                        {
                                TR0=0;
                        }
                }
                else if(cnt<=8)
                {
                        Rxdbuf>>=1;
                        if(Rxd)
                        {
                                Rxdbuf|=0x80;
                        }
                        cnt++;
                }
                else
                {
                        cnt=0;
                        TR0=0;
                        if(Rxd)
                        {
                                RxdEnd=1;
                        }
                }
        }
}




Screenshot_2022-01-20-18-51-16-45.jpg
好懒~~不想说~~~
 楼主| 发表于 2022-1-27 21:26:18 | 显示全部楼层
波特率换成28800就可以用了
好懒~~不想说~~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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