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

📄 txd.c

📁 单片机与计算机通讯源程序,含头文件,说明,本人亲自试过.
💻 C
字号:
//******************************显示一个字*********************************//
#include<math.h>
#include<reg51.h>
#include<intrins.h>
#include<absacc.h>
#define uchar unsigned char
#define DISP_C P1_7
#define DISP_D P1_6
#define Rt_de   P2_0
#define me_address 0x30
#define SAVE_D P1_5
#define SAVE_T P2_1
uchar stp_data[9];
uchar s_err_times;
uchar t_err_times;
void delay(unsigned int n)
     {
        unsigned int i;
        for(i=n*200;i>0;i--)
            ;
      }

void disp_one(unsigned char XSH_data)
  {
     char i;
     bit F_temp;
     for(i=0;i<8;i++)
         {
            F_temp=XSH_data&0x01;
            XSH_data=XSH_data>>1;
            if(F_temp)
              {
                 DISP_C=0;
                 DISP_D=1;
                 _nop_();
                 _nop_();
                 DISP_C=1;
                 _nop_();
                 _nop_();
                 _nop_();
                 DISP_C=0;
                 _nop_();
              }
            else
              {
                DISP_C=0;
                DISP_D=0;
                _nop_();
                _nop_();
                DISP_C=1;
                _nop_();
                _nop_();
                _nop_();
                DISP_C=0;
                _nop_();
              }
           }
    }
void error(uchar error_type)
    {
        char i;
        for(i=0;i<3;i++)
           {
             disp_one(error_type);
             disp_one(0x40);
             disp_one(0x50);
             disp_one(0x50);
             disp_one(0x79);
            }
        while(1);
     }


//停止
void stop(void)
   {
      SAVE_D=0;
      SAVE_T=1;
      _nop_();
      _nop_();
      _nop_();
      SAVE_D=1;
      _nop_();
      _nop_();
      _nop_();
      SAVE_T=0;
      SAVE_D=0;
    }


//发非应答信号
void n_ack(void)
   {
      SAVE_D=1;
      SAVE_T=1;
      _nop_();
      _nop_();
      _nop_();
      SAVE_T=0;
      SAVE_D=0;
    }
//读八位
uchar rd_8byt(void)
   {
      uchar receive=0;
      char i;
      for(i=0;i<8;i++)
         {
            receive=receive<<1;
            SAVE_D=1;
            SAVE_T=1;
            _nop_();
            if(SAVE_D)
               receive++;
            SAVE_T=0;
          }
       return(receive);
    }
//查应答
bit check(void)
   {
      bit aswer;
      SAVE_D=1;
      SAVE_T=1;
      _nop_();
      _nop_();
      aswer=SAVE_D;
      SAVE_T=0;
      return(aswer);
    }
//起始
void start(void)
   {
      SAVE_D=1;
      SAVE_T=1;
      _nop_();
      _nop_();
      _nop_();
      SAVE_D=0;
      _nop_();
      _nop_();
      _nop_();
      SAVE_T=0;
   }
void write_byt(uchar I_data)
   {
      char i;
      for(i=0;i<8;i++)
         {
            SAVE_D=(bit)(I_data&0x80);
            I_data=I_data<<1;
            SAVE_T=1;
            _nop_();
            _nop_();
            _nop_();
            SAVE_T=0;
         }
     }
uchar readone(uchar edd)
    {
      char i;
      uchar recivechar;
      edd=edd<<1;
      edd++;
      for(i=0;i<20;i++)
        {
          start();
          write_byt(edd);
          if(!check())
             goto bbb;
         }
        error(0x06);
   bbb:  recivechar=rd_8byt();
         n_ack();
         stop();
         return(recivechar);
     }
void Rs485_server(void)interrupt 4
   {
        uchar now_rec_dat;
        uchar i;
        int j;
        EA=0;
        if(~RI)                 //检测是否有接收中断
             goto Rs485_err;
        now_rec_dat=SBUF;
        if(now_rec_dat!=me_address)
                        goto Rs485_err;
        SM2=0;             //不允许多机通讯
        RI=0;
        TI=0;
        REN=0;             //发送数据时禁止接收
        Rt_de=1;       //483发送方式
        SBUF=me_address;   //发送本机地址
        while(~TI);        //等待
        TI=0;              //清除标志
        Rt_de=0;       //483接收方式
        REN=1;             //接收允许
        j=0;
        while((~RI)&&(j<2000))//等待接收数据,如果时间过长退出
                  j++;
        if(j>=2000)
                   goto Rs485_err;
        now_rec_dat=SBUF;  //读接收数据
        RI=0;
        TI=0;
        Rt_de=1;       //483发送方式
        REN=0;             //发送数据时禁止接收
        switch(now_rec_dat)
        {
             case 0x00://收到数据=0发送36组存储数据
                  SBUF=0x00;  //返回命令字
                  while(~TI);
                  TI=0;
                  for(i=0;i<108;i++)
                  {
                        SBUF=readone(i);
                        while(~TI);
                        TI=0;
                  }
                  break;
             case 0x01://收到数据=1发送超量程记录
                  SBUF=0x01;//返回命令字
                  while(~TI);
                  TI=0;
                  SBUF=t_err_times;//chao liang cheng
                  while(~TI);
                  TI=0;
                  SBUF=s_err_times;//chao liang cheng
                  while(~TI);
                  TI=0;
                  SBUF=0;//chao liang cheng
                  while(~TI);
                  TI=0;
                  break;
             case 0x02://收到数据=2发送3组表读数
                  SBUF=0x02;//返回命令字
                  while(~TI);
                  TI=0;


                 SBUF=0x88;//dang qian du shu
                 while(~TI);
                 TI=0;

                 /*
                  for(i=0;i<9;i++)
                  {
                        SBUF=stp_data[i];//dang qian du shu
                        while(~TI);
                        TI=0;
                  }
                  */
                  break;
             default:
                  SBUF=0xff;
                  while(~TI);
                  break;
         }
     Rs485_err: RI=0;
                TI=0;
                SM2=1;
                Rt_de=0;
                REN=1;
                EA=1;
   }
void main(void)
     {
         TL1=0xfd;/////通信初始化///////////
         TH1=0xfd;//////////////
         SCON=0xf0;/////////////;SM0=1,SM1=1,SM2=1,REN=1,工作方式3(9位UART,波特率可变),串行接收允许,
         TMOD=0x21;//////////////
         PCON=0x80;//////////////
         TR1=1;/////////////////
         Rt_de=0;
         IT0=1;
         PX0=1;
         IP=0xff;
         IE=0x97;////////通信初始化结束//////////////////////////////////////
         EA=0;
         EA=1;
         P2_4=1;
         P2_5=1;
         P2_6=1;
         P2_7=1;
   Loop:
         disp_one(0x3f);
         disp_one(0x06);
         disp_one(0x5b);
         disp_one(0x4f);
         disp_one(0x66);
	    //disp_one(0x6D);
        // disp_one(0x7D);
        // disp_one(0x07);
         delay(100);    
         goto Loop;
      }

⌨️ 快捷键说明

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