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