微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 菜鸟求助 单片机串口发送字符

菜鸟求助 单片机串口发送字符

时间:10-02 整理:3721RD 点击:
/********************************************************************
***********************************************************************/
#include<reg51.h>
sbit LED1=P1^0;
sbit LED2=P1^2;
/********************************************************************
* 名称 : Com_Init()
* 功能 : 初始化串口程序,晶振11.0592, 波特率9600
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Com_Init(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;                  //打开串口中断
}  
/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main()
{
Com_Init();
LED1=1;
LED2=1;
TI=0;
if(0==LED1)  //  如果LED1低电平  ,则单片机发送a到PC机
{   
SBUF='a';   
LED2 = 0;   
while(TI==0);
}
}

改程序能实现  LED1低电平  ,则单片机发送a到PC机,但是一直在发送,怎么控制 LED1低电平后,  只发一次。断开后,再让它低电平,再发送一次。

求解答 求修改

设置个全局变量,上电时为0,发送后置1,检测到为0时,才允许发送。

#include<reg51.h>
sbit LED1=P1^0;
sbit LED2=P1^2;
#define uchar unsigned char
#define uint unsigned int
/********************************************************************
* 名称 : Com_Init()
* 功能 : 初始化串口程序,晶振11.0592, 波特率9600
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Com_Init(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;                  //打开串口中断
}
/****************延时函数*********************************************/
void delayms(uchar z)
{
    uchar i,j;
        for(i=z;i>0;i--)
          for(j=110;j>0;j--);
}
/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main()
{
Com_Init();
LED1=1;
LED2=1;
TI=0;
if(!LED1)  //如果检测到低电平,说明按键按下          
     {
            delayms(5);
          if(!LED1)     //再次确认按键是否按下,没有按下则退出
              {            
            SBUF='a';   
            LED2 = 0;   
            while(TI==0);
                     while(!LED1);   //如果确认按下按键等待按键释放
               }
         }
}

我已经仿真过了 可以的  按键检测要注意  不然按键按下程序一直循环运行就会循环发送  
你忘了要检测按键按下了一次,当然你自己认为自己只是按下了一次,其实已经闭合了好几十ms以上
这样的话程序其实执行了很多次了 所以发送了很多  
你程序写的还是比较规范的  值得表扬


恩 ,!
谢谢大师啊!

一个字符可以这样控制,那么一个字符串呢?

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top