标题: 一个51单片机发送字符串程序 [打印本页]

作者: 759098270    时间: 2018-7-6 21:48
标题: 一个51单片机发送字符串程序
当P1为高电平串口发送字符串b,低电平发送a。现在要求当接受高低电平信号后只发送一次字符串就停止。等待下次再接收到信号再发送。还有消除单片机上电高电平的影响,就是单片机上电的时候不发送b。程序应该怎样改。



#include<reg52.h>
sbit shuru=P1^0;
unsigned char PuZh[16] = "a";
unsigned char BuZh[16] = "b";
void UsartConfiguration();
void Delay10ms(unsigned int c);   //误差 0us
void main()
{
        unsigned char i;
        UsartConfiguration();
        while(1)
        {
                if(shuru==0)
                {
                for(i=0; i<16; i++)
                {
                        SBUF = PuZh[i];   //将要发送的数据放入到发送寄存器
                        while(!TI);                  //等待发送数据完成
                        TI=0;                          //清除发送完成标志位
                        TR1  = 0;                                                            
      ES   = 0;                     
      EA   = 0;  
                }
                Delay10ms(500);                  //延时一下再发                     
        }
else
                for(i=0; i<16; i++)
        {
                        SBUF = BuZh[i];   //将要发送的数据放入到发送寄存器
                        while(!TI);                  //等待发送数据完成
                        TI=0;                          //清除发送完成标志位
                  TR1  = 0;                                                            
      ES   = 0;                     
      EA   = 0;  
        }
                Delay10ms(500);                  //延时一下再发       
}
}
/*******************************************************************************
* 函 数 名         :UsartConfiguration()
* 函数功能                   :设置串口
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void UsartConfiguration()
{
        SCON=0X50;                        //设置为工作方式1
        TMOD=0X20;                        //设置计数器工作方式2
        PCON=0X80;                        //波特率加倍
        TH1=0XFA;                    //计数器初始值设置,注意波特率是4800的
        TL1=0XFA;
//        ES=1;                                                //打开接收中断
//        EA=1;                                                //打开总中断
        TR1=1;                                            //打开计数器
}
void Delay10ms(unsigned int c)   //误差 0us
{
    unsigned char a, b;
    for (;c>0;c--)
        {
                for (b=38;b>0;b--)
                {
                        for (a=130;a>0;a--);
                }         
        }      
}


作者: yousunny    时间: 2018-7-6 23:53
这个上电不发送,可以实现的,你别打开串口中断先。加一点延时试一下,

     unsigned char i;
    P0=0x00;
        UsartConfiguration();              

作者: lzts88    时间: 2018-7-7 16:14
本帖最后由 lzts88 于 2018-7-8 11:12 编辑

加一个发送标志(发F_b), 上电置F_b=1(已发)。然后
if(shuru) {if(!F_b){发送b;  F_b = 1;} //高电平只发一次
else        {发送a; F_b = 0;} //低电平循环发




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1