C51半双工通讯程序

发布者:岭南布衣最新更新时间:2021-07-05 来源: eefocus关键字:C51 手机看文章 扫描二维码
随时随地手机看文章

现在工程中大多使用485半双工通讯,今天有人问这样的程序,我翻找了一下以前写的程序,正好找到一个.这个程序控制灯的亮与闪烁,比较简单,通讯方面在发送端可以两种方式发送,接受端只是被动发送.具体工作方式看程序吧!

 

/*--------------------------------------

串口半双工发送程序

锦州硬盘之家


---------------------------------------*/


#include

#include


unsigned char data cn,s[7],f[7],intcount,*tp,sj,comcount;

bit done,sc,JSSS,BCS,TCS,JSSF,BCF,TCF,fkon,fkoff,halfms,rt,xyjss,xybc,spjss,spbc;


sbit LedJP=P0^3;

sbit LedJSS=P0^4;

sbit LedTC=P0^5;

sbit LedBC=P0^6;

sbit SPOUT=P0^7;


sbit SY=P3^2;

sbit XY=P1^3;

sbit JSS=P1^4;

sbit BC=P1^5;

sbit TC=P1^6;

sbit JP=P1^7;


sbit ComT=P3^3;


sbit Leden=P2^0;

sbit Ledcp=P3^6;


/*显示,报警程序*/

void display(void)

{

  if(JSSS!=JSSF)

  {

    if(halfms)

    {

      if(JSSF) {LedJSS=0;LedJP=1;}

      else {LedJSS=1;LedJP=0;}

    }

    else

    {

      LedJSS=0;

      LedJP=0;

    }

    if(JSSS) LedJP=1;

    else LedJSS=1;

    spjss=1;    

  }

  else

  {

    if(JSSS) { LedJSS=0;LedJP=1;}

    else {LedJSS=1;LedJP=0;}

    spjss=0;

    xyjss=0;

  }

  if(BCF!=BCS || TCF!=TCS)

  {

    if(halfms)

    {

      if(TCF) {LedTC=1;LedBC=0;}

      if(BCF) {LedBC=1;LedTC=0;}

    }

    else

    {

      LedTC=0;

      LedBC=0;

    }

    if(BCS) LedBC=1;

    if(TCS) LedTC=1;

    spbc=1;


  }

  else

  {

    LedBC=0;LedTC=0;

    if(BCS) {LedBC=1;LedTC=0;}

    if(TCS) {LedTC=1;LedBC=0;}

    spbc=0;

    xybc=0;        

  }

    if((spjss && (!xyjss)) || (spbc && (!xybc)))

  {

    SPOUT=1;

  }

  else

  {

    SPOUT=0;

  }

  if(!SY)

  {

    LedJSS=1;

    LedJP=1;

    LedTC=1;

    LedBC=1;

    SPOUT=1;    

  }

  Ledcp=1;

  _nop_();_nop_();_nop_();

  Ledcp=0;

}


/*键盘识别程序*/

void kexe(void)

{

if(!JSS) JSSF=0;

if(!JP) JSSF=1;

if(!BC) {BCF=1;TCF=0;}

if(!TC) {BCF=0;TCF=1;}

if(!XY) { xyjss=1;xybc=1;}

}


/* 键盘抗干扰程序 */

void key(void)

{

P1=0xfC;

_nop_();_nop_();

if (P1!=0xfC)

    {

     if (fkon)

        {

         if (!fkoff)

            {

             kexe();fkoff=1;

            }

        }

     else

        fkon=1;

    }

else

    {

     fkon=0;fkoff=0;

    }

}


/*发送一个字节*/

void send(unsigned char c)

{

TI=0;

SBUF=c;

while(!TI);

TI=0;

}

/*接收一个字节*/

unsigned char receive(void)

{

/*while(!RI);*/

RI=0;

return SBUF;

}

/*时间中断0中断程序*/        

void Dogtime() interrupt 1 /*using 1*/

{

    TR0=0;

    intcount++;

    if(intcount>=6)

    {

     halfms=!halfms;

     intcount=0;

    }

    comcount++;

    if(comcount>=39)

    {

     rt=1;

     ComT=1;

     comcount=0;

    }

    


    done=1;

    TH0=0x4B;TL0=0xFF;TR0=1;/*50mS*/

}


/*串口接收中断程序*/

void recom(void) interrupt 4 /*using 3*/

{

  if(RI)

  {

    unsigned char c;

    c=receive();

    if(!sc)

    {

      if(c=='$')

      {

        sc=1;

        cn=0;

      }

    }

    else

    {

      if(cn<=3)

      {

        s[cn]=c;

        cn++;

      }

      else

      {

        if(s[1]==',')

        {

          if(s[0]=='1') JSSS=0;

          if(s[0]=='0')  JSSS=1;

          if(s[2]=='0') BCS=0;    

          if(s[2]=='1') BCS=1;    

          if(s[3]=='0') TCS=0;

          if(s[3]=='1') TCS=1;

        }

        sc=0;

        rt=1;

        ComT=1;_nop_();_nop_();_nop_();_nop_();_nop_();

        comcount=0;

      }

      }

  }

}


/*初始化51寄存器*/

void _init51()

{

/*波特率4800--11.0592*,可以串行中断,串行中断优先*/

TMOD=0x21;TL1=0xFA;TH1=0xFA;PCON=0x00;TR1=1;SCON=0x50;ES=1;IP=0x10;

/*50mS--11.0592*/

EA=1;ET0=1;/*TMOD=0x01;*/TH0=0x4B;TL0=0xFF;TR0=1;

}


/* 初始化变量*/

void _initdata()

{

f[0]='$';

f[1]='0';

f[2]=',';

f[3]='0';

f[4]='0';

f[5]=0x0d;

f[6]=0x0a;

P1=0xFC;

halfms=0;

Leden=0;

Ledcp=0;

LedBC=0;

LedTC=0;

ComT=1;

JSSF=1;

JSSS=1;

}


/*主程序*/

void main(void)

{

_initdata();

_init51();

while(1)

{

     while(!done){};

     done=0;

     key();

     display();

        /*操车位置系统*/

     if(rt)

     {

        if(JSSF) f[1]='1';

        else f[1]='0';

        /*发动机系统*/

        if(BCF) f[3]='1';

        else f[3]='0';

        if(TCF) f[4]='1';

        else f[4]='0';

        for(sj=0;sj<7;sj++)

        {

         send(f[sj]);

         }

    rt=0;

    ComT=0;

  }

}

}

/*--------------------------------------

串口半双工接收程序

锦州硬盘之家


---------------------------------------*/


#include

#include


unsigned char data cn,s[7],f[7],intcount,*tp,sj;

bit done,sc,JSSS,BCS,TCS,JSSF,BCF,TCF,fkon,fkoff,halfms,rt,xyjss,xybc,spjss,spbc;


sbit LedJP=P0^3;

sbit LedJSS=P0^4;

sbit LedTC=P0^5;

sbit LedBC=P0^6;

sbit SPOUT=P0^7;


sbit SY=P1^2;

sbit XY=P1^3;

sbit JSS=P1^4;

sbit BC=P1^6;

sbit TC=P1^5;

sbit JP=P1^0;


sbit ComT=P3^3;


sbit Leden=P2^0;

sbit Ledcp=P3^6;


/*显示,报警程序*/

void display(void)

{

  if(JSSS!=JSSF)

  {

    if(halfms)

    {

      if(JSSF) {LedJSS=0;LedJP=1;}

      else {LedJSS=1;LedJP=0;}

    }

    else

    {

      LedJSS=0;

      LedJP=0;

    }

    if(JSSS) LedJP=1;

    else LedJSS=1;

    spjss=1;        

  }

  else

  {

    if(JSSS) { LedJSS=0;LedJP=1;}

    else {LedJSS=1;LedJP=0;}

    spjss=0;

    xyjss=0;

  }

  if(BCF!=BCS || TCF!=TCS)

  {

    if(halfms)

    {

      if(TCF) {LedTC=1;LedBC=0;}

      if(BCF) {LedBC=1;LedTC=0;}

    }

    else

    {

      LedTC=0;

      LedBC=0;

    }

    if(BCS) LedBC=1;

    if(TCS) LedTC=1;

    spbc=1;        

  }

  else

  {

    LedBC=0;LedTC=0;

    if(BCS) {LedBC=1;LedTC=0;}    

    if(TCS) {LedTC=1;LedBC=0;}

    spbc=0;

    xybc=0;        

  }

    if((spjss && (!xyjss)) || (spbc && (!xybc)))

  {

    SPOUT=1;

  }

  else

  {

    SPOUT=0;

  }

  if(!SY)

  {

    LedJSS=1;

    LedJP=1;

    LedTC=1;

    LedBC=1;

    SPOUT=1;    

  }

  Ledcp=1;

  _nop_();_nop_();_nop_();

  Ledcp=0;

}


/*键盘识别程序*/

void kexe(void)

{

if(!JSS) JSSS=0;

if(!JP) JSSS=1;

if(!BC) {BCS=1;TCS=0;}

if(!TC) {BCS=0;TCS=1;}

if(!XY) { xyjss=1;xybc=1;}    

}


/* 键盘抗干扰程序 */

void key(void)

{

P1=0x7D;

_nop_();_nop_();

if (P1!=0x7D)

    {

     if (fkon)

        {

         if (!fkoff)

            {

             kexe();fkoff=1;

            }

        }

     else

        fkon=1;

    }

else

    {

     fkon=0;fkoff=0;

    }

}


/*发送一个字节*/

void send(unsigned char c)

{

TI=0;

SBUF=c;

while(!TI);

TI=0;

}


/*接收一个字节*/

unsigned char receive(void)

{

/*while(!RI);*/

RI=0;

return SBUF;

}

/*时间中断0中断程序*/        

void Dogtime() interrupt 1 using 1

{

    TR0=0;

    intcount++;

    if(intcount>=6)

    {

     halfms=!halfms;

     intcount=0;

    }

    done=1;

    TH0=0x4B;TL0=0xFF;TR0=1;/*50mS*/

}


/*串口接收中断程序*/

void recom(void) interrupt 4 using 3

{

if(RI)

{

unsigned char c;

c=receive();

if(!sc)

{

    if(c=='$')

    {

     sc=1;

     cn=0;

    }

}

else

{

     if(cn<=3)

     {

        f[cn]=c;

        cn++;

     }

     else

     {

        if(f[1]==',')

        {

         /*if((check(&s[0],0x08))==((uchange(s[9]))*0x10+(uchange(s[10]))))

         {*/

            if(f[0]=='1') JSSF=1;

     if(f[0]=='0')  JSSF=0;

     if(f[2]=='1') BCF=1;    

     if(f[2]=='0') BCF=0;    

[1] [2]
关键字:C51 引用地址:C51半双工通讯程序

上一篇:c51模拟串口
下一篇:C51里的函数指针

推荐阅读最新更新时间:2024-11-13 13:59

C51的XTAL1,XTAL2的外接电源经验
C51的XTAL1,XTAL2的外接电源经验: 1.XTAL1 XTAL2 外接由两个电容与晶振的并联谐振时钟电路 C1,C2 选30pF,晶振选1.2-12MHz,设计时,当使晶振各电容尽可能的与C51单片机靠近,以保证稳定可靠 2.或用外部振荡器接至XTAL2,XTAL1接地,注意:XTAL1如果不接地的话,Electrical Rule Check会给出错误如下下: ELECTRICAL RULES CHECK REPORT ============================= Design: D:\proteus-design\yx-design\IO-1.DSN Doc. no.: NONE Revi
[单片机]
C51_单片机开发_XBYTE的使用
【实例】 百度结果:这个主要是在用C51的P0,P2口做外部扩展时使用,其中XBYTE ,P2口对应于地址高位,P0口对应于地址低位。一般P2口用于控制信号,P0口作为数据通道。 如:P2.7接WR,P2.6接RD,P2.5接CS,那么就可以确定个外部RAM的一个地址,想往外部RAM的一个地址写一个字 节时,地址可以定为XBYTE ,其中WR,CS为低,RD为高,那就是高位的4,当然其余的可以根据情况自己定,然后通过 XBYTE = 57。这赋值语句,就可以把57写到外部RAM的0x4000处了,此地址对应一个字节。 【汇总】 1、The XBYTE macro accesses individual byte
[单片机]
Keil C51对C语言的关键词扩展之四: bit
bit关键词可定义位变量,可用于函数参数、返回值类型。 static bit done_flag = 0; /* 位变量*/ bit testfunc ( /* 返回值类型为位变量 */ bit flag1, /* 参数类型为位变量 */ bit flag2) { . . . return (0); } 位变量位于8051单片机内部RAM位寻址区,由于位寻址区为16字节,因此最多可定义128个位变量。 如果要指定位变量的存储类型,只能使用data 或者idata,其他存储类型声明无效。 bit关键词的使用受限情况: 1)不能声明指向bit变量的指针。 bit
[单片机]
PID算法调节C51程序(4)
typedef struct PID { double SetPoint; // Desired Value double Proportion; // Proportional Const double Integral; // Integral Const double Derivative; // Derivative Const double LastError; // Error double PrevError; /
[单片机]
C51_LCD1602显示
#include #include #define uchar unsigned char #define uint unsigned int sbit rs=P2^6; sbit rw=P2^5; sbit en=P2^7; uchar shuma ={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09}; // 0 1 2 3 4 5 6 7 8 void delay(uchar a) { uint i,j; for(i=0;i =110;i++) for(j=
[单片机]
C51单片机学习笔记之LCD1602
简介 简单说LCD1602这玩意就是液晶显示屏。 引脚功能: 写操作时序 读操作时序 指令集 cgrom表 原理图 代码部分 LCD1602.C #include reg52.h #include intrins.h sbit RS = P2^0; sbit RW = P2^1; sbit EN = P2^2; #define RS_CLR RS = 0 #define RS_SET RS = 1 #define RW_CLR RW = 0 #define RW_SET RW = 1 #define EN_CLR
[单片机]
<font color='red'>C51</font>单片机学习笔记之LCD1602
C51编程几个有用的模块-键盘扫描模块
键盘扫描模块有两种工作方式, 一种为自动的由时钟模块调用, 另一种是由程序员自行调用。 1) 由时钟模块自动调用的方式 将时钟模块实现文件(Timer.h)及键盘扫描模块的实现文件(KBScan。c)包含进工程, 在Config.h 文件中添加TIMER_KBSCANDELAY宏。 时钟模块自动对时钟中断进行计数, 当达到TIMER_KBSCANDELAY宏所定义的值后, 自动调用键盘扫描模块中的函数KBScanProcess()进行键盘扫描,也就是说,这个宏的值可以决定按键消抖动的时间。 用户应该提供两个回调函数OnKBScan()及onKeysPressed()。 在函数OnKBScan中进行键盘扫描, 并返回扫描
[单片机]
LCD 240*128 T6963C C51程序
主程序 /***********************************/ /* LCM(RT-240128TA)显示程序 */ /* LCM 控制芯片 T6963C 带32KRAM */ /* MCU 型号: STC 89C52RD2 */ /* 时钟频率: 11.0592 MHz */ /* 接口方式: 直接接口(总线方式) */ /* 开发环境: Keil C51 V7.03 */ /* 开发日期: 2006.07.01 */ /* 程序编写: liu1234 */ /***********************************/ #define t696
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved