[讨论] i/o模拟串口

huoji   2015-1-6 22:34 楼主
最近在学习i/o模拟传口语,但是由于比较菜,不知怎么弄接收部分,,只能接收一个字节,,求指导,我的程序如下:#include "stm32f10x.h"
#include "sys.h"
#include "stdio.h"
  


//加入以下代码,支持printf函数,而不需要选择use MicroLIB          
#if 1
#pragma import(__use_no_semihosting)            
//标准库需要的支持函数                 
struct __FILE
{
        int handle;

};

FILE __stdout;      
//定义_sys_exit()以避免使用半主机模式   
_sys_exit(int x)
{
        x = x;
}
#endif       
//重定义fputc函数
int fputc(int ch, FILE *f)
{  
    void SendOneByte(u8 Byte);
        SendOneByte((uint8_t) ch);   
        return ch;
}

#define POWER12V_high()                GPIO_SetBits(GPIOA, GPIO_Pin_0)
#define POWER12V_low()                GPIO_ResetBits(GPIOA, GPIO_Pin_0)
#define TXD_high()                GPIO_SetBits(GPIOB, GPIO_Pin_12)
#define TXD_low()                GPIO_ResetBits(GPIOB, GPIO_Pin_12)

#define datalen                         200
u8  RX_BUF[datalen];
u16 RX_STA;

static void POWER12V_Configuration(void);
static void TXD_Configuration(void);
static void RXD_Configuration(void);
void SendOneByte(u8 BYte);
void RXDBYTE(void);
void SendOneByte(u8 Byte)
{
        u8 i=8,tmp;
        TXD_low();//发送起始位
        delay_us(104);
        //发送8位数据
        for(i=0;i<8;i++)
        {
                tmp        = (Byte >> i) & 0x01;  //低位在前

                if(tmp == 0)
                {
                        TXD_low();
                        delay_us(104);        //0               
                }
                else
                {
                        TXD_high();
                        delay_us(104);        //1               
                }
                }

         TXD_high();
         delay_us(104);
     }



void SendBytes(u8 *str,u8 len)        //发送数组最好用这个,也可发送字符串
{
  u16 i;
  for(i=0;i   {
           SendOneByte(str[i]);
  
  }

}
//
//void SendStr(u8 *str) //发送字符串,发送数组如果带0x00就中断发送了
//{
// while(*str)
// SendOneByte(*str++);
//
//}

int main(void)
{
        delay_init();
        RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE);
    POWER12V_Configuration();
    TXD_Configuration();
        SendOneByte(0X55);
    RXD_Configuration();
    delay_us(104);

       
   while(1)
   {            u16 RX_STA=0;
                 u8 RX_BUF[datalen];
             u8 i=9,DATA=0X00;       
          u8 kk;
          kk=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12);       
      while(kk!=1)
       {
          delay_us(30);
          while(i--)
          {
                  DATA >>=1;
            if(GPIOB->IDR&0x1000) DATA |=0x80;       
                delay_us(104);               
          }
            
         DATA=(~DATA);
       RX_BUF[ 200]=DATA;
       RX_STA++;        
      TXD_Configuration();
         SendBytes(RX_BUF,RX_STA);
    RXD_Configuration();
        

   }

  }

static void POWER12V_Configuration(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
        GPIO_SetBits(GPIOA, GPIO_Pin_0);
}

static void TXD_Configuration(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
        GPIO_SetBits(GPIOB, GPIO_Pin_12);
}

static void RXD_Configuration(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
        GPIO_SetBits(GPIOB, GPIO_Pin_12);
}

回复评论 (4)

为什么要模拟串口呢?
硬件的多好使
So TM what......?
点赞  2015-1-6 22:49
引用: ljj3166 发表于 2015-1-6 22:49
为什么要模拟串口呢?
硬件的多好使
看到网上有人弄过,所以学学



点赞  2015-1-6 22:52
引用: huoji 发表于 2015-1-6 22:52
看到网上有人弄过,所以学学


  不如学习IO模拟IIC或者SPI。串口直接用外设吧,字符串的处理才是要命的
So TM what......?
点赞  2015-1-6 22:55
还是要利用好单片机上的资源,有些东西不是模拟能替代的
点赞  2015-1-12 22:56
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复