| 
 
| 本帖最后由 zhangxxyuan 于 2010-5-28 21:52 编辑 
 主机每200ms向从机发送一次数据,从机接收到后,如果判断数据接收没有错误,就将数据返回到主机使主机的LED1灯亮。但是现在发送和接收都实现不了,我看到SBUF里没有数据。好像一用定时器定时发送数据就有问题,不知道是怎么回事。
 1,主机程序:
 #include<REG52.H>
 sbit         LED1=P0^0;
 unsigned char data1[6]; //发送协议
 unsigned char data2[6]; //接收协议
 void init_serial0();         //定时器0初始化
 void init_serial1(); // 串口初始化
 unsigned char ecc=0x00;
 int i,a=0;
 
 /****************** 发送数据 **********************/
 void send_data(unsigned char *data1)
 {
 /* 发送数据 */
 for(i=0; i<5; i++)
 {
 TI = 0;
 SBUF = data1; // 发送数据
 while(!TI);
 TI = 0;
 }
 }
 /****************初始化串口 ********************/
 void init_serial1()
 {
 TMOD = 0x20;        //定时器T1使用工作方式2
 TH1 = 250; // 设置定时器T1初值250,是波特率为4800bps,
 TL1 = 250;
 TR1 = 1; // T1开始计时
 PCON = 0x80; // SMOD = 1        ,波特率4800加倍
 SCON = 0x50;        //工作方式1,波特率9600bps,允许接收
 }
 /* *****************定时器0 **********************/
 void init_serial0()
 {
 TMOD = 0x10;        //定时器T0使用工作方式1
 TH0 = 0xB8; // 设置定时器T0初值20ms,
 TL0 = 0x00;
 TR0 = 1; // T0开始计时
 ET0=1;        //允许定时器0中断
 EA=1;        //CPU开放中断
 }
 /*************** T0溢出中断,使用工作模式1,每20ms发送一次数据*********** */
 void timer0_int () interrupt 1 //using 0         // T0溢出中断,使用工作模式1
 {
 TH0 = 0xB8; // 重新装入初值
 TL0 = 0x00;
 a++;
 if(a==10)
 {
 send_data(data1);//发送数据
 a=0;
 }
 /* **********************主程序******************** */
 void main(void)
 {
 
 data1[0]=0xC5;//包头
 data1[1]=0x08;//数据内容
 data1[2]=0xF6;
 data1[3]=0xC8;
 data1[4]=0xC5+ data1[1]+ 0xF6+0xC8;//校验字节,和自动溢出取最低8位
 init_serial1(); // 串口初始化
 init_serial0(); //定时器0初始化
 TI=0;
 RI=0;
 IE=0x9A; //开所有中断
 IP=0x01; //定时器0中断优先
 
 while(1)        //循环等待
 {
 
 }
 }
 
 void Serial_INT() interrupt 4        //串口中断服务程序
 {        int i;
 /* 接收数据 */
 for(i=0; i<5; i++)
 {         RI=0;
 while(!RI);
 data2 = SBUF; // 接收数据
 RI = 0;
 }
 ecc=0xC5+ data1[1]+ 0xF6+0xC8;//校验字节,和自动溢出取最低8位
 data2[5]=0;         // 表示数据结束
 
 /* 进行数据校验《若正确则控制相对应的指示灯 */
 if((data2[0]==0xC5)&&(data2[4]==ecc))
 {
 if((data2[1]&0x80)==0x80) //高电平灭
 LED1=1;
 else
 LED1=0;         //低电平亮
 }
 }
 
 2,从机程序:
 #include<REG52.H>
 sbit         LED1=P0^0;
 unsigned char data2[6]; //接收协议
 void init_serial0();         //定时器0初始化
 void init_serial1(); // 串口初始化
 unsigned char ecc=0x00;
 int i;
 
 /****************** 发送数据 **********************/
 void send_data(unsigned char *data1)
 {
 int i;
 /* 发送数据 */
 for(i=0; i<5; i++)
 {
 TI = 0;
 SBUF = data1; // 发送数据         while(!TI);
 TI = 0;
 }
 }
 /****************初始化串口 ********************/
 void init_serial1()
 {
 TMOD = 0x20;        //定时器T1使用工作方式2
 TH1 = 250; // 设置定时器T1初值250,是波特率为4800bps,
 TL1 = 250;
 TR1 = 1; // T1开始计时
 PCON = 0x80; // SMOD = 1        ,波特率4800加倍
 SCON = 0x50;        //工作方式1,波特率9600bps,允许接收
 }
 /* **********************主程序******************** */
 void main(void)
 {
 init_serial1(); // 串口初始化
 TI=0;
 RI=0;
 IE=0x98; //开所有中断(除过定时器0)
 IP=0x10; //串口中断优先
 
 while(1)        //循环等待
 {
 
 }
 }
 
 void Serial_INT() interrupt 4        //串口中断服务程序
 {
 /* 接收数据 */
 for(i=0; i<5; i++)
 {         RI=0;
 while(!RI);
 data2 = SBUF; // 接收数据
 RI = 0;
 }
 ecc=0xC5+ data2[1]+ 0xF6+0xC8;//校验字节,和自动溢出取最低8位
 data2[5]=0;         // 表示数据结束
 /* 进行数据校验,若正确则返回到主机 */
 if((data2[0]==0xC5)&&(data2[4]==ecc))
 send_data(data2);
 
 }
 | 
 |