日志档案

发表于 2007-7-30 18:44:25

2

标签: 无标签

串口通信

功能:使用串口调试软件,可以在电脑上显示“tongxin sucess",但程序不是很规范,希望高手指点。

//desisned by lianghongzhi
//2007.7.29
#include"reg52.h"
#include"stdio.h"
#include"absacc.h"
#include<intrins.h>
void  init_com(void)
{
      SCON="0x50";              //串行方式1,
      TMOD="0x20";               //定时器工作于方式2  
      PCON="0X80";              //波特率4800
      ES="1";                     //开串行口中断
      TH1=0xF3;
      TL1=0xF3;
      TR1=1;                    //启动定时器1
      EA="1";      //开cpu中断
}
 void delay(void)                       //10ms延时
{
       int i,j;
   for(i=38;i>0;i--)
         for(j=130;j>0;j--);
}
void serial()interrupt 4 using 3
{
 unsigned char ch;
 if(RI)
 {
  RI=0;
  ch=SBUF;
  TI=1;
       switch(ch)
  {
   case 0x01:
   printf("A");TI=0;
   break;
   case 0x02:
   printf("B");TI=0;
   break;
   default:
   printf(" #tongxin sucess");
   TI=0;
   break;
  }
    }
}       
void main ()
{
 init_com();
 while(1);
}

系统分类: 单片机   |   用户分类: 单片机程序   |   来源: 原创   |   【推荐给朋友】

    阅读(936)    回复(2)  

投一票您将和博主都有获奖机会!

  • 2007-8-10 18:42:27

    谢谢

  • 幻雪

    2007-8-5 21:26:27

    #include<reg52.h>
    #include <intrins.h>
    #include <string.h>

    /*宏定义*/
    #define uchar unsigned char
    #define uint unsigned int

    /* 握手信号宏定义
    #define CALL 0x24  // 主机呼叫
    //#define BUSY 0x15  // 从机忙
    #define OK 0x00   // 从机准备好
    #define SUCC 0x2A  // 接收成功
    #define RENEW 0xF0  // 重发指令
          */
    #define CALL 0x41  // 主机呼叫
    //#define BUSY 0x15  // 从机忙
    #define OK 0x42   // 从机准备好
    #define SUCC 0x243  // 接收成功
    #define RENEW 0x44  // 重发指令   
    #define WAIT 0x00//等待
    #define D_LEN 0x01//数据长度状态
    #define DATA 0x02//数据状态
    #define CHECK 0x03//校验状态
    #define STOP 0x04//停止
    #define HAND 0x05//握手状态

     

     


    /*全局变量声明*/
    uchar s_str[] = "abcdefghijklmnopqrstuvwxyz";
    uchar i_str[32];

    sbit P1_0=P1^0;
    sbit key="P3"^2;
    uchar tmp="0x20";
    uchar i;
    uchar s_len;
    uchar i_len;

    uchar incept_sign=WAIT;//接收标志信号
    uchar send_sign=STOP;//接收标志信号
    uchar s_ecc;
    uchar i_ecc;
    uchar c_time;

     


    void delayms(unsigned char ms) 
    // 延时子程序
    {      
     unsigned char i;
     while(ms--)
     {
      for(i = 0; i < 120; i++);
     }
    }

     

     

     

     

     


    /*
    void f_call()
    {
     if(c_time++<1)
     {
      send_sign=HAND;
      SBUF=CALL;
      
     }
     else
     {
      c_time=0;
      send_sign=STOP;
     }
    }


      */

     

     

     

    void send_len()
    {
     s_len=strlen(s_str);
     s_ecc=s_len;
     SBUF=s_len; 
    }

     

     

     

     

     

     

    void send_data()
    {
     static uchar i;
     //if(s_str[i] != '\0')
     
      s_ecc = s_ecc^(s_str[i]);  // 异或运算
      SBUF = s_str[i];
      //i++;     // 下一个字符
      if (++i==s_len)
       {
        i=0;
        send_sign=CHECK;
       }

    }


    void incept_data()
    {
     static uchar i;

      i_str[i]=SBUF;
      i_ecc = i_ecc^(i_str[i]);  // 异或运算

      if(++i==i_len)
      {
       i=0;
       incept_sign=CHECK;
      }    

    }

     

     

     

     

    void get_disp() interrupt 4 using 1
    {

     if (RI)
      {
          RI="0";
       P1=SBUF;
         switch (incept_sign)
         {
          case WAIT://等待状态
               switch (SBUF)
             {
              case CALL:
            incept_sign=D_LEN;//跳转到接收data_len状态;
               SBUF=OK;//回复OK握手信号;
               
               break;
              case OK:
               c_time=0;//CALL超时标志清零;
               send_sign=D_LEN;//跳转发送data_len状态;
             TI=1;
               break;
               case RENEW://收到重发命令
                send_sign=D_LEN;//跳转到发送data_len状态;
                //send_len();
             TI=1;
                break;
               case SUCC://收到接收成功指令
                send_sign=STOP;//复位发送标志位
                break;

              default:
               ;
               break;
             }
             break;
           
           
           
           
          case D_LEN://接收data_len状态
           i_len=SBUF;//接收len
           i_ecc=i_len;
           incept_sign=DATA;//跳转接收data状态
           break;
          case DATA://接收data状态
            incept_data();//判断是否接收完毕
            // incept_sign=CHECK;//跳转接收check状态
           break;
          case CHECK:
           if (i_ecc!=SBUF)//验证数据
            {
             SBUF=RENEW;//不正确发送renew指令
             incept_sign=D_LEN;//跳转到接收data_len状态
            }
           else
            {
             incept_sign=WAIT;//接收成功跳转接收等待状态 
             SBUF=SUCC;
        // SBUF=CALL;
            }
            break;
           default:
            break;
        }
      }
        
      
      
      
     else
      {
      TI=0;
      switch (send_sign)
        {
         case STOP://停止发送状态
          break;
    //     case HAND://握手状态
    //      f_call();
    //      break;
         case D_LEN://发送data_len状态
          send_len();
          send_sign=DATA;//跳转到发送data状态
          break;
         case DATA:
         send_data();
          break;
         case CHECK:
          SBUF=s_ecc;//发送验信息
          send_sign=STOP;//发送完毕停止发送
          break;
         default:
          break;
        }
      }
    }

     

    /*中断程序0*/
    void int0(void) interrupt 0 using 1
    {
     //s_len=strlen(s_str);
     P1_0=~P1_0;
    // f_call();
    SBUF=CALL;

    }

     

     

    /*主程序*/
    void main(void)
    {

     SCON=0x50; //MODER1,REN=1;
     TMOD=0x20; //TIMER1 MODER2;
     TH1=0xf3;  //bode=9600
     TL1=0xf3;
    // ET1=1;
     TR1=1;
     EX0=1;
     IT0=1;
     EA=1;
     ES=1; 
    //SBUF=tmp++;
    //f_call();

     while(1)
     {
    //   f_call();   
    //  delayms(1000);

    /*  if(key==0)
       {
        delayms(10);
        if(key==0)
         {
          P1_0=~P1_0;
          SBUF=tmp++;
         }
       }*/ 
       
       
       //delayms(100);
       //SBUF=tmp++;
       //IE0=1;

     }
    }