历史上的今天
返回首页

历史上的今天

今天是:2025年08月17日(星期日)

2020年08月17日 | STC12C5A60S2双串口通讯基础程序

2020-08-17 来源:51hei

程序9600波特率 下 STC单片机双串口通讯发基础程序,程序内容,各自中断接收,中断转发接收到的数据。需要两个串口同时工作的可以用的上。


单片机源程序如下:


/*-----------------------------------------------

  名称:STC12C5A60S2双串口通信

  编写:Nico

  日期:2009.5

  修改:无

  内容:9600波特率 双串口收发

        接线:串口1 发送P3.1,接收P3.0

              串口2 发送P1.3,接收P1.2

------------------------------------------------*/


#include"stc12c5a60s2.h"

#include"delay.h"


#define S2RI 0x01   //串口2接收中断中断请求标志位

#define S2TI 0x02   //串口2发送中断请求标志位

unsigned char flag1,flag2,temp1,temp2;

unsigned char uart2Receive[100];

unsigned char uart1Receive[100];

unsigned int point1=0,point2=0;

unsigned char i;

/*------------------------------------------------

                   函数声明

------------------------------------------------*/

//void SendStr(unsigned char *s);

void UART_1SendOneByte(unsigned char c);

void UART_2SendOneByte(unsigned char c);

void uart1SendStr(unsigned char *s);

void uart2SendStr(unsigned char *s);

/*------------------------------------------------

                    串口初始化

------------------------------------------------*/

void InitUART  (void)

{


    SCON  = 0x50;                        // SCON: 模式 1, 8-bit UART, 使能接收  

    TMOD |= 0x20;               // TMOD: timer 1, mode 2, 8-bit 重装

    TH1   = 0xFD;               // TH1:  重装值 9600 波特率 晶振 11.0592MHz  

    TR1   = 1;                  // TR1:  timer 1 打开                    

   EA    = 1;                  //打开总中断

    ES    = 1;                  //打开串口中断

       

        S2CON = 0x50;   //  

    BRT = 0xFD;    //  9600

    AUXR = 0x10;    //

    IE2 =0x01;  //

}                           

/*------------------------------------------------

                    主函数

------------------------------------------------*/

void main (void)

{


  InitUART();

        DelayMs(100);

        uart1SendStr("串口1初始化成功");

        DelayMs(100);

  uart2SendStr("串口2初始化成功");



while (1)                       

    {

                        if(flag1==1)  

        {  

            flag1=0;

                                       

           // uart2SendStr("串口1中断,串口2发送串口1接收的数据:");                               

            uart1SendStr(uart1Receive);

                                          for(i=0;i<=100;i++)

                                                {

                                                        uart1Receive[i]=0;

                                                        }

        }  

                        if(flag2==1)  

        {  

                                        flag2=0;   

                                //        uart1SendStr("串口2中断,串口1发送串口2接收的数据:");

            uart2SendStr(uart2Receive);  

                                         for(i=0;i<=100;i++)

                                                {

                                                        uart2Receive[i]=0;

                                                        }

        }  

    }

}


/*------------------------------------------------

                    1发送字符串

------------------------------------------------*/

void uart1SendStr(unsigned char *s)

{

while(*s!='')// 表示字符串结束标志,

                //通过检测是否字符串末尾

  {

  UART_1SendOneByte(*s);

  s++;

  }

}

/*------------------------------------------------

                    2发送字符串

------------------------------------------------*/


void uart2SendStr(unsigned char *s)

{

while(*s!='')// 表示字符串结束标志,

                //通过检测是否字符串末尾

  {

  UART_2SendOneByte(*s);

  s++;

  }

}


void UART_1SendOneByte(unsigned char c)  

{  

    SBUF = c;  

    while(!TI);    //?TI=0,????  

    TI = 0;   

}



/****************串口2发送一个字符****************/  

void UART_2SendOneByte(unsigned char c)  

{  

    S2BUF = c;  

    while(!(S2CON&S2TI));  //?S2TI=0,????  

    S2CON&=~S2TI;     //S2TI=0  

}  

/************串口1中断函数*************/  

void UART_1Interrupt(void) interrupt 4  

{  

    if(RI==1)  

    {  

        RI=0;  

        flag1=1;  

        temp1=SBUF;

                                uart1Receive[point1++]=temp1;

                        if(temp1=='n')

                        {

                                flag1=1;

                                point1=0;

                        }

                        if(point1==100)

                        {

                                point1=0;

      }

    }  

}  

/************串口2中断函数*************/  

void UART_2Interrupt(void) interrupt 8  

{  

         EA    = 0;                  //打开总中断

    if(S2CON&S2RI)  

    {  

        S2CON&=~S2RI;         

        temp2=S2BUF;

                        uart2Receive[point2++]=temp2;

                        if(temp2=='n')

                        {

                                point2=0;

                                flag2=1;

                        }

                        if(point2==100)

                        {

                                point2=0;

      }

    }

EA    = 1;                  //打开总中断               

}


推荐阅读

史海拾趣

Horn公司的发展小趣事

自1969年成立以来,Horn公司便致力于开发和生产切槽、侧铣和槽铣刀具。起初,公司聚焦于为小型机械加工企业提供高质量的工具解决方案。在创始人Paul Horn的领导下,公司迅速建立了技术团队,专注于刀具材料的研发与生产工艺的改进。这一时期,Horn公司凭借其出色的产品质量和定制化的服务,在行业内逐渐树立了良好的口碑。

AC Interface Inc公司的发展小趣事

ABC Electronics Inc. 起初是一家小型电子元件供应商,专注于为本地市场提供基本的电子零部件。然而,随着技术的快速发展,公司创始人意识到,只有不断创新才能在竞争激烈的市场中立足。于是,ABC Electronics 开始投入大量资源研发具有竞争力的新产品。经过数年的努力,公司成功推出了一款具有高效能、低能耗特点的电源管理芯片,迅速获得了市场的认可。这一创新产品不仅为公司带来了可观的利润,也奠定了其在电子行业的技术领先地位。

Ercona Corp公司的发展小趣事

随着国内市场的饱和,ABC Electronics Inc. 开始寻求国际化的发展道路。公司首先在欧洲设立了分支机构,通过参加国际电子展会、与欧洲企业建立合作伙伴关系等方式,逐步打开了欧洲市场。随后,公司又进军北美和亚洲市场,通过本地化运营和定制化服务,满足了不同国家和地区的需求。这一国际化战略不仅拓展了公司的市场份额,也提升了其品牌影响力。

Displaytech公司的发展小趣事

2008年,Displaytech推出了HDP Power,这是一项创新的电力解决方案,旨在支持公司客户的电力需求。这一举措不仅体现了Displaytech对客户需求的深刻洞察,也展示了公司在电源领域的技术实力。

天钰(FITIPOWER)公司的发展小趣事

2008年,Displaytech推出了HDP Power,这是一项创新的电力解决方案,旨在支持公司客户的电力需求。这一举措不仅体现了Displaytech对客户需求的深刻洞察,也展示了公司在电源领域的技术实力。

Active-Semi公司的发展小趣事

随着公司业务的不断发展,Displaytech于1997年在加利福尼亚州圣地亚哥成立了销售办事处,名为SEACOMP。这一举措标志着公司开始向国际市场进军。SEACOMP的成立不仅为公司带来了更多的商业机会,也促进了公司在全球范围内的技术交流与合作。

问答坊 | AI 解惑

最新无线收发模块资料总结

本帖最后由 paulhyde 于 2014-9-15 04:09 编辑 :P :P :P :P :P :P :P :P :P :P :P :P 好东西与各位分享!  …

查看全部问答>

请教各位WinCE/WinMobile上的security部分的csp和ssp[进者有分]

    大家都知道,ce和mobile上有很多的安全策略,可能比较常用的有模块验证(CertifyModule)。     请教大家个问题,安全策略中的csp和ssp最大的差别是什么,都用来做什么?能不能举一个例子来说明它们的典型应用?   & ...…

查看全部问答>

基于UCOS-II的串口程序问题

小弟最近正在研究基于UCOS-II的串口程序,开发环境是IAR,我将IAR自带的UART程序移植到UCOS-II下时发现有一些问题: 比如:在uart.h文件下 DWORD UARTInit( DWORD Baudrate ); __irq __nested __arm void UART0Handler( void ); void UARTSend( ...…

查看全部问答>

华为EM200模块通讯

可能是网络问题,在发送数据过程中连接会自动关闭,可是连接关闭后,服务器并没有自动断开(此时已经不能发送数据了) 为什么呀??如果有谁在做EM200通讯,请与我联系qq:273498325 不胜感激~~~~~…

查看全部问答>

sql ce与sqlserver 2000同步,困惑中......

正在开发ppc版的进销存和客户关系管理系统,对数据同步问题不明白:数据库的建立是在ppc端建立,还是在sqlserver 2000端建立?如果在ppc端建立,同步的时候sqlserver2000端能否自动建立?…

查看全部问答>

uclinux编译问题

今天成功运行了我烧出来的内核,给大家分享点资料。…

查看全部问答>

dsp28335地址线的问题

我用dsp外接一个处理芯片,想用读外接芯片片内的寄存器值,地址线连14根,0-9,12-15,dsp里配置引脚的话,这几根选择XA,其他的地址线没用到如10,11等引脚,配置成什么呢,pull up么? 还有就是我选用的14根地址线从地位到高位,是不是默认按数字 ...…

查看全部问答>

printf()肿么了

折腾完 notepad++加上 gcc编译器以后,很爽地在上边玩程序。可是,我发现一个问题,很要命的问题。那就是,程序里写的printf语句,程序运行时,printf内容的顺序不对头。比如说,应该先printf信息再按照信息输入的,结果它没printf出来,非要等到我 ...…

查看全部问答>

为什么整流桥中通过直流电压后压降比较大

由于我的电路中需要通过交直流两种,所以,电路前端用了整流桥KBP307。测量发现,当输入电压为24V,电流为0.5A的时候,压降有1.8V。这个压降太大了吧?这个什么原因呢? …

查看全部问答>

开关电源考试题和答案

开关电源考试题和答案…

查看全部问答>