历史上的今天
返回首页

历史上的今天

今天是:2025年07月21日(星期一)

正在发生

2018年07月21日 | C51单片机之串口

2018-07-21 来源:eefocus

/* 

名称:C51单片机之串口 

说明:在计算机之间进行通讯的时候,有两种方式,一个是串行通信,一个是并行通信。对于前者适合长距离通信、有一定的纠错能力。对于后者,适合短距离通信,速度较快。


对于C51单片机来说,其内部集成有一个功能很强的全双工通信口。设有两个相互独立的接受、发送缓冲器,可以同时发送数据和接收数据。发送缓冲器只能发送不能读出。接收缓冲器只能接收不能发送,而且两个缓冲器共用一个物理地址(0X99)。在编程时由编译器进行区分。还有,C51单片机的串口有4种工作方式,其中两种波特率时刻变的,另外两种是不可变的。


对于具体的使用来说,首先也是需要进行一系列初始化设置(包括工作方式设置、波特率设置等)。然后可以通过轮询或者中断的方式,检查TI或者RI是否被硬件置1来判断数据是否发送完毕或者有新的数据产生。


还有一点需要说明的是,在串口工作的4中方式中,有两种波特率可变的方式,其波特率设置是根据定时器的溢出来设置的。这么说,从某种程度上说,定时器还可以为串口提供时钟信息。


*/


实验主要代码如下:


int sen_flag = 0,rec_flag = 0;


//串口初始化

void UartInit()

{

    //串行口波特率设置:模特率9600(定时器1)

        TMOD = 0x20;        //定时器1选择工作方式1(8位定时,自动重载)    

        TL1 = 0xFD;         //设置初始值

        TH1 = 0xFD;


        //串口工作方式设置

        SCON = 0x50;        //  串行口工作方式1,允许接收

        PCON = 0;


        TR1 = 1;        //启动定时器

        ES = 1;         //开串行中断

        EA = 1;         //开总中断




}




//发送一个字符

void SendChar(char c)

{

    SBUF = c;

    sen_flag = 1;               //设置标志位

    while(1 == sen_flag )   ;           //等待串口发送完毕

    //while(0 == TI) ;                  

}



//发送16进制数据(0-FF)

void SendNum(unsigned char num)

{

    unsigned char temp_fir = num&0x0F;

    unsigned char temp_sec = num>>4;


    if(temp_fir > 9)

        temp_fir = temp_fir-10+'A';

    else

        temp_fir = temp_fir+'0';


    if(temp_sec > 9)

        temp_sec = temp_sec-10+'A';

    else

        temp_sec = temp_sec+'0';




    SendChar(temp_sec);

    SendChar(temp_fir);



}


//发送一个字符串

void SendStr(char * str)

{

    while((*str) != '\0')

    {

        SendChar(*str);

        str++;

    }

}



//接收一个字节

char RecChar()

{


    while(0 == rec_flag )   ;       //等待数据


    rec_flag = 0;           //取消接收标志位

    return SBUF;

}


串口中断服务函数如下:


//引进外部变量

extern rec_flag;

extern sen_flag;


void Uart(void) interrupt 4

{


    if(1 == TI)         //发送中断

    {

        TI = 0;     //发送完一个数据


        sen_flag = 0;       //取消标志位

    }


    if(1 == RI)         //接收中断

    {

        RI = 0;                     //清除中断

        rec_flag = 1;           //设置接收标志位


    }



}


推荐阅读

史海拾趣

Cambridge Electronic Industries Ltd公司的发展小趣事

随着公司实力的增强和产品线的丰富,CEI开始积极寻求市场拓展的机会。公司不仅在国内市场取得了显著的成绩,还开始拓展国际市场。CEI与国际电子巨头建立了紧密的合作关系,共同研发新产品,分享技术和市场资源。这些合作不仅提升了CEI的技术水平和市场竞争力,也为其带来了更广阔的发展空间。

Elite Enterprises (H K) Co Ltd公司的发展小趣事

在产品质量得到市场认可后,Elite Enterprises开始积极拓展国内外市场。公司参加了多个国际性的电子展会,展示了其高品质的LED产品,并成功吸引了众多客户的关注。同时,公司还加强了品牌建设,通过广告宣传和口碑传播等方式提高了品牌知名度和美誉度。

Conflux公司的发展小趣事

作为一家具有社会责任感的企业,Conflux始终关注社会公益事业。公司积极参与扶贫、教育等公益活动,为社会做出积极贡献。同时,Conflux还注重环保和可持续发展,通过采用环保材料和节能技术,降低生产过程中的环境污染。这些举措不仅提升了公司的社会形象,也赢得了社会各界的广泛赞誉。

以上五个故事是虚构的,但反映了一个科技公司可能经历的发展阶段和策略选择。在现实中,一个公司的成长和发展往往涉及更多复杂的因素和决策过程。希望这些故事能够为您提供一些启发和参考。

Daewoo公司的发展小趣事

在汽车产业领域,Daewoo公司同样取得了令人瞩目的成就。大宇汽车公司作为Daewoo集团的骨干企业,自1983年独立以来,凭借其先进的技术和出色的品质,迅速在韩国汽车市场崭露头角。公司不仅在国内市场表现优异,还积极开拓国际市场,成功将产品出口到世界各地。

Analogix Semiconductor公司的发展小趣事

然而,好景不长。1997年亚洲金融危机的爆发给Daewoo公司带来了前所未有的挑战。由于过度扩张和错误的投资决策,公司背负了巨额债务,资不抵债。面对这一困境,Daewoo公司不得不进行资产重组和裁员等措施,以减轻财务压力。虽然这些措施在短期内带来了痛苦,但也为公司的未来发展奠定了基础。

EBG RESISTORS LLC公司的发展小趣事

EBG RESISTORS LLC公司始终将品质管理放在首位。他们建立了严格的质量控制体系,确保每一款产品的性能和质量都符合客户要求。同时,公司还鼓励员工提出改进意见,不断优化生产流程和产品性能。这种持续改进的精神使得EBG RESISTORS LLC公司的产品在市场上始终保持着领先地位。

问答坊 | AI 解惑

MCS-51单片机温度控制系统

本帖最后由 paulhyde 于 2014-9-15 09:17 编辑 MCS-51单片机温度控制系统  …

查看全部问答>

更快进行原型开发的八个技术考虑

转自:NI 概览 为您下一个嵌入式项目或想法创建功能原型系统是得到预算和从高层管理获得批准的重要步骤。在开始原型开发之前,考虑一下您所有需要的工具。另一个需要记住的重要原则是原型开发应该足够快速,不应该在原型系统上花费过多的时间,投 ...…

查看全部问答>

DC-DC buck降压不稳定请教

设计了一个5.0V输入,可调输出buck电路,1.5M固定频率但是在较大电流输出,并直接开关电源的时候,时不时出现不稳定情况不稳定时前几个占空比很大,直至输出电压过高仿真上非常稳定,PM也足够这可能是什么原因造成的?请教各位!…

查看全部问答>

具备图形加速能力的嵌入式应用系统

具备图形加速能力的嵌入式应用系统…

查看全部问答>

请问有4路24位的TTL电平信号的数据采集怎么设计和选型?

模拟信号都好采集,但是有的传感器是BCD码输出的,每个传感器的引脚是24条线输出,有4个,请问怎么设计和选型? 这里面可能要用到数据选择器或者寄存器;还有USB控制器…

查看全部问答>

硬盘分区

硬盘分区问题 我现在的分区不合理 我想重新分 比如我现在的F盘有三十G、 我想再为它加5G 我已经把这个盘中的所有数据转出来了 我加后会不会影响其它盘的数据? 就是把其它盘的数据搞丢? …

查看全部问答>

怎样将手机的摄像头作为Wince设备的USB设备

我的手机有一个摄像头,而且可以以USB接口连接到桌面计算机上,作为摄像头使用。请问怎样在WinCE设备里也可以这样用呢?需要怎样开发相关驱动?…

查看全部问答>

VS2005调试目标机上应用程序时,用TCP/IP方式连接总是“设备未就绪”??

使用VS2005开发win ce的应用程序,在调试的时间用TCP/IP方式连接到开发板,老说“设备未就绪”,该怎么解决啊?…

查看全部问答>

请教,关于ADS编译C++的问题

请教,我用ads1.2编译c++程序总是报一些头文件找不到,我把system path加了vc的库,结果有出了“only win32 and Mac supported\"这个问题,请问怎么办?ads1.2上可以编译c++吗?要怎么做? …

查看全部问答>