⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 eye124.c

📁 《单片机应用系统开发实例详解》 光盘 程序
💻 C
字号:
/*=========================================================
  这是单片机通信测试系统中下位机(或称分站)一侧的应用程序,它
是在AT89C2051单片机上运行,用C51语言开发的程序。文件名为
eye124.c。它可与本章6.2.5介绍的通信程序-文件名为tongx3.c
配套使用。用T1作通信波特率发生器,波特率为9600。分站地址可
在(1-255)间设定。
 ========================================================*/
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
void timedelay(uint timess);
void delay2(void); 
                        
uchar n;
uchar  rbut[12];
uchar  tbut[16];
uchar kc1,kc2,aa,coni,flag,addr;

sbit addr0=P1^0;
sbit addr1=P1^1;
sbit addr2=P1^2;
sbit addr3=P1^3;
sbit addr4=P1^4;
sbit addr5=P1^5;
sbit addr6=P1^6;
sbit addr7=P1^7;

sbit p34=P3^4;
sbit p35=P3^5;
sbit p37=P3^7;

void addr_re(void) /*地址设定*/
 {
   addr=0;
   if(addr0==1)
     {addr=addr+128;}
   if(addr1==1)
     {addr=addr+64;}
   if(addr2==1)
     {addr=addr+32;}
   if(addr3==1)
     {addr=addr+16;}
   if(addr4==1)
     {addr=addr+8;}
   if(addr5==1)
     {addr=addr+4;}
   if(addr6==1)
     {addr=addr+2;}
   if(addr7==1)
     {addr=addr+1;}
 }
void timedelay(uint timess)  /* 延时程序 */
{
 uint tj;
 for (tj=timess;tj>0;tj--){;}
}
                    /*串行通信口中断服务子程序*/
sio0() interrupt 4  using 1
{
  if (RI==0) {
      if  (TI==0) {RI=0;TI=0;return;}
      SBUF=tbut[kc1];
      kc1++;
      if (kc1!=16) {RI=0;TI=0;return;}
      kc1=0;
      p37=1;       //恢复为接收方式
      SCON=0xf0;
      loo1:if (TI==0) goto loo1;
      RI=0;
      TI=0;
  }
  if (SM2==0) {
    rbut[kc2]=SBUF;
    kc2++;
    if (kc2!=10) {RI=0;TI=0;return;}
    rbut[1]=rbut[2]+rbut[3]+rbut[4];  //累加和校验
    if (rbut[1]!=rbut[5]) {flag=1; }  //如累加和校验错置标志位
    kc2=0;
    p37=0;         //准备发送
    SCON=0xe8;
   SBUF=addr;     /*地址可设定*/
    TB8=0;
    SM2=0;
    RI=0;
    TI=0;
  }
  if (SBUF!=addr) {RI=0; return;} /*地址设定 */
  SM2=0;
  RI=0;
}
void main()   /*主程序 */
{
  SP=0x70;
  p34=0;     //红灯
  p35=1;     //绿灯
  timedelay(10000);
  timedelay(10000);
  addr_re();
  kc1=0;
  kc2=0;
  EA=0;

  flag=0;
  tbut[0]=0x03;
  tbut[1]=0x1;/* tbut[1]-tbut[4]放第1待传数值(4字节,长整型)*/
  tbut[2]=0x2;
  tbut[3]=0x3;
  tbut[4]=0x4;
  tbut[5]=0x5;/*tbut[5]-tbut[8]放第2待传数值(4字节,浮点)*/
  tbut[6]=0x6;
  tbut[7]=0x7;
  tbut[8]=0x8;
  tbut[9]=0x9;/* tbut[9]-tbut[12]放第3待传数值(4字节,浮点)*/
  tbut[10]=0xa;
  tbut[11]=0xb;
  tbut[12]=0xc;
  tbut[13]=78;/* tbut[13]放以上12个字节累加和*/
  tbut[14]=addr; 

  TMOD=0x20;  /*设定定时器T1作为串行通信口的波特率发生器*/
  PCON=0x0;
  TL1=0xfd;
  TH1=0xfd;    //11.0592mhz,smod=0;9600==0xfd
  TR1=1;
  SCON=0xf0;
  ES=1;
  p37=1;       //准备接收
  EA=1;
loop:;
  p34=1;   //红灯  
  p35=0;   //绿灯   
  timedelay(10000);
  goto loop;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -