找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4386|回复: 2
打印 上一主题 下一主题
收起左侧

一个51单片机发送字符串程序

[复制链接]
跳转到指定楼层
楼主
ID:347716 发表于 2018-7-6 21:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
当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--);
                }         
        }      
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:308437 发表于 2018-7-6 23:53 | 只看该作者
这个上电不发送,可以实现的,你别打开串口中断先。加一点延时试一下,

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

使用道具 举报

板凳
ID:341045 发表于 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;} //低电平循环发
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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