×
单片机 > 单片机程序设计 > 详情

51单片机普通IO口模拟串口源程序

发布时间:2020-08-27 发布时间:
|

大家放心用,但是你们程序要好好看看,容易中断冲突,现在我们也在解决中,接收和发送字符串的程序有需要的邮箱给你们发送过去

东西是好东西,我们遇到了中断问题,有点麻烦,数据采集上来后用模拟串口挂到485总线,向一个控制单片机发送数据,用12864显示,但是控制单片机的串口通信的中断和模拟串口中断冲突,上位机和下位机没有办法通信,今天下午实在没有办法了,又做了一块单片机最小系统,让采集板上的数据之间和这块最小系统板进行通信12864上显示,现在还没有想到好的解决办法,等解决之后再告诉大家,还有就是接受字符串的时候,先进行解包,再进行标识位检测,这个程序发程序的方法是一个一个字符发送的,接收的时候要先放进数组里面,要是有需要的可以单独联系我,希望大家共同进步。

这两天项目结项,一直比较忙,没来得及回复大家,这个程序非常有用吗,毕竟大部分的单片机串口都是一个到两个,有时候功能扩展的时候,不可避免的要使用串口,当你发现串口不够用的时候,你可以使用这个程序,我把接收函数给大家参考一下

   while(1)
  {
    if(StartBitOn())
    {
          Msg[i_L]=PGetChar();
          if(Msg[i_L]!='a')
          {
            i_L++;
          }
          else
          {  
                i_L=0;
                chinese_disp(0,2,"温度");//这个是12864液晶显示函数大家不用管
          }
         }
        }

说实话,这东西用起来虽然挺好,但是能不用就不要用,现在单片机大都是双串口的,一般都够用,我们做的东西,用52单片机模拟串口通信,模拟modbus通信,三个定时器全开,中断全用,时序容易出错,所以建议大家不要过多依赖模拟的东西,能花点钱买个好点片子,减少开发周期,上策。

#include "reg52.h"

#include "intrins.h"  

#include "math.h"     

#include "stdio.h"

sbit BT_SND =P1^5;

sbit BT_REC =P1^6;

sbit LED =P1^7;

bit  LED_flage=1;

//IO 口模拟232通讯程序

//使用两种方式的C程序 占用定时器0

#define MODE_QUICK

#define F_TM F0

#define TIMER0_ENABLE  TL0=TH0; TR0=1;

#define TIMER0_DISABLE TR0=0;

sbit ACC0=   ACC^0;

sbit ACC1=   ACC^1;

sbit ACC2=   ACC^2;

sbit ACC3=   ACC^3;

sbit ACC4=   ACC^4;

sbit ACC5=   ACC^5;

sbit ACC6=   ACC^6;

sbit ACC7=   ACC^7;


void IntTimer0() interrupt 1

{

  F_TM=1;

}

//发送一个字符

void PSendChar(unsigned char inch)

{

#ifdef MODE_QUICK

    ACC=inch;

    F_TM=0;

    BT_SND=0; //start bit

    TIMER0_ENABLE; //启动

    while(!F_TM);

    BT_SND=ACC0; //先送出低位

    F_TM=0;

    while(!F_TM);

    BT_SND=ACC1;

    F_TM=0;

    while(!F_TM);

    BT_SND=ACC2;

    F_TM=0;

    while(!F_TM);

    BT_SND=ACC3;

    F_TM=0;

    while(!F_TM);

    BT_SND=ACC4;

    F_TM=0;

    while(!F_TM);

    BT_SND=ACC5;

    F_TM=0;

    while(!F_TM);

    BT_SND=ACC6;

    F_TM=0;

    while(!F_TM);

    BT_SND=ACC7;

    F_TM=0;

    while(!F_TM);

    BT_SND=1;

    F_TM=0;

    while(!F_TM);

    TIMER0_DISABLE; //停止timer

    #else

    unsigned char ii;

     ii=0;

     F_TM=0;

     BT_SND=0; //start bit

     TIMER0_ENABLE; //启动

     while(!F_TM);

     while(ii<8)

        {

          if(inch&1)

         {

          BT_SND=1;

         }

         else

         {

          BT_SND=0;

         }

          F_TM=0;

        while(!F_TM);

          ii++;

         inch>>=1;

    }

         BT_SND=1;

         F_TM=0;

         while(!F_TM);

    #endif

    TIMER0_DISABLE; //停止timer

}

//接收一个字符

unsigned char PGetChar()

{

        #ifdef MODE_QUICK

        TIMER0_ENABLE;

        F_TM=0;

        while(!F_TM); //等过起始位

        ACC0=BT_REC;

        TL0=TH0;

        F_TM=0;

        while(!F_TM);

        ACC1=BT_REC;

        F_TM=0;

        while(!F_TM);

        ACC2=BT_REC;

        F_TM=0;

        while(!F_TM);

        ACC3=BT_REC;

        F_TM=0;

        while(!F_TM);

        ACC4=BT_REC;

        F_TM=0;

        while(!F_TM);

        ACC5=BT_REC;        

        F_TM=0;

        while(!F_TM);

        ACC6=BT_REC;        

        F_TM=0;

        while(!F_TM);

        ACC7=BT_REC;

        F_TM=0;

        while(!F_TM)

    {

                if(BT_REC)

                {

                  break;

                }

    }

        TIMER0_DISABLE; //停止timer

        return ACC;

        #else

        unsigned char rch,ii;

        TIMER0_ENABLE;

        F_TM=0;

        ii=0;

        rch=0;

        while(!F_TM); //等过起始位

        while(ii<8)

    {

            rch>>=1;

                if(BT_REC)

                {

                rch|=0x80;

                }                                        

                ii++;

                F_TM=0;

                while(!F_TM);        

    }

        F_TM=0;

         while(!F_TM)

    {

                if(BT_REC)

                {

                   break;

                }

    }

        TIMER0_DISABLE; //停止timer

        return rch;

        #endif

}

//检查是不是有起始位

bit StartBitOn()

{

  return (BT_REC==0);

}

//定时器1初始化

void Time1_Init(void)

{

   TMOD=0x22; //定时器1为工作模式2(8位自动重装),0为模式2(8位自动重装) 

   PCON=00;

   TR0=0; //在发送或接收才开始使用

   TF0=0;

   TH0=(256-96); //9600bps 就是 1000000/9600=104.167微秒 执行的timer//104.167*11.0592/12= 96

   TL0=TH0;

   ET0=1;

   EA=1;

}

//发送字符串

void Send_Char(char *byte)

{

   int i=0;

   for(i=0;*(byte+i)!='';i++)

   {

      PSendChar(*(byte+i));

   }

}

//void delay(int x)

//{

//        int a,b;

//        for(a=x;a>0;a--)

//                for(b=10;b>0;b--); 

//}

//void main()

//{

//   unsigned char gch;

//   Time1_Init();

//   LED=0;

//  // Send_Char("S00.0C00.0%E00.0C00.0%L00000lx");

//   while(1)

//  {          

//      

//          PSendChar('1');

//          delay(1000);

////      if(StartBitOn())

////          {

////            gch=PGetChar();

////            if(gch=='1')

////                {

////                  LED=LED_flage;  

////                  delay(1000);

////                  LED_flage=~LED_flage;

////


关键字:51单片机  普通IO口  模拟串口

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM 汇编的必知必会