#include <reg51.h>
#include <string.h>
#define uchar unsigned char
#define length 13 //数据长度
unsigned char FlagGetDataNumber;
unsigned char read_buf[6];
unsigned int write_buf[13]={0xAA,0x0A,0xEA,0x00,0x28,0x01,0x02,0x01,0x00,0x00,0x01,0xCB,0xCC};
unsigned int i,j;
bit read_flag = 0; //取数标记
bit flag=0;
void delay_50ms(int t) //延时子程序ms
{
int j;
for(t;t>0;t--)
for(j=6000;j>0;j--);
}
void init(void)
{
P1=0xff;
P3=0xff;
TMOD =0x20; //定时器0工作在模式1,GATE=0,C/T=0,16位模式
SCON =0x50; //串口方式1
PCON = 0x80; //SMOD=1,表示数据传输率加倍
TH1=0xfA; //定时器1初值,设置波特率9600 MAO
ET1 =0;
//TH1=0xfd;
//TL1=0xfd; //MAO
ES=1; //串口中断允许 工作于方式1 MAO
TR1=1; //启动定时器1
PS=1; //设计串行口中断优先级 MAO
TH0=(65536-50000)/256; //设定时器0高8位初值 0x3C=60(10)
TL0=(65536-50000)%256; //设定时器0低8位初值 0xB0==176(10)
ET0=1; //允许定时器0中断
TR0=1; //启动定时器0
IT0=1; //外部中断0下降沿触发方式
IT1=1; //外部中断1下降沿触发方式
EX0=1; //开外部中断0
EX1=1; //开外部中断1
EA=1; //开总中断
count_i=0; //dog count num
}
/* 向串口发送一个字符 */
void send_char( unsigned char x)
{
SBUF=x;
while (TI== 0 );
TI= 0;
}
/* 向串口发送一个字符串,string_length为该字符串长度 */
void send_string_com( unsigned char *s, unsigned int string_length)
{
unsigned int i= 0;
do
{
send_char(*(s + i)); //向串口发送一个字符
i++;
}
while ( i<string_length);
}
/* 串口接收中断函数 */
void serial () interrupt 4 using 3
{
if (RI)
{
RI = 0;
read_buf[FlagGetDataNumber]=SBUF;
FlagGetDataNumber++;
if(6==FlagGetDataNumber){
FlagGetDataNumber=0;
if(0x69==jiaoyan1(4)){
read_flag=1; //就置位取数标志
}
}
}
/////////***********主函数**********///////////
void main()
{
wrsr(0x30); //看门狗设置
delay_50ms(10);// jinyong
init(); //初始化
send_string_com(write_buf,length); //测试
test=~test; //测试
delay_50ms(10);// 500mS test
while(1)
{
if(read_flag) //如果取数标志已置位,就将读到的数从串口发出
{
read_flag=0;
{
send_string_com( write_buf, 13);//发送13个byte数据
}
}
}
unsigned char jiaoyan1 (unsigned int m) // 校验函数
{
int i,buf;
buf=read_buf[1];
for(i=2;i<=m;i++)
buf=buf^read_buf[i];
return buf;
}
发的命令:AA 03 E0 8A 69 CC
回的命令:AA 0A EA 00 28 01 02 01 00 00 01 CB CC |