原创 串口通信

2007-7-30 18:44 2624 7 9 分类: MCU/ 嵌入式

功能:使用串口调试软件,可以在电脑上显示“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);
}

PARTNER CONTENT

文章评论2条评论)

登录后参与讨论

用户67386 2007-8-10 18:42

谢谢

用户371268 2007-8-5 21:26

#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;

 }
}

相关推荐阅读
用户3493 2008-06-09 10:42
其实有很多……
      前几天刚跟中海油签约,培训一年,一年工作六个月,大致正式工作以后,除去税收一年5到6万,但是需要出海,一次一个月,然后就有一个月的时间自己安排,刚才看了我的托业成绩,本来以为可以考很高的成...
用户3493 2008-02-23 19:12
好久不来了
好久没有来了,很生疏了,最近正在忙我的两个项目,但是这几天来到学校没有什么动力学习,有点气人,我要开始正式学习,然后还要5月跟7月的飞思卡尔比赛,但是自己还是很不熟悉,我得努力啊!5月份还有托业考试,...
用户3493 2007-10-17 19:04
塞翁失马,焉知非福!
今天中午回宿舍,发现自己又得了另一个助学金1500元,感觉挺好的,生活如此美好,中午看了一会电影就睡觉了,(不过根本睡不着,同学们玩游戏,乱七八糟的),下午还是实习,本来我是第一个做完作品的,但是出现...
用户3493 2007-10-04 22:20
华为硬件技术工程师标准
有好资料不敢独享,与大家分享...
用户3493 2007-09-29 21:28
应该写点什么
首先庆祝博客量超过1万,然后再说点别的:课程太紧啊,累死人呢,大三了,还有一年就要抉择了,考研啊,努力呢...
用户3493 2007-09-16 10:56
MSP430+LCD1602
 #include  <msp430x14x.h>#include "lcd1602_h.h"void delay_nms(void); void main(void){    WDTCT...
EE直播间
更多
我要评论
2
7
关闭 站长推荐上一条 /3 下一条