McuPlayer 发表于 2013-10-23 15:58
你可以中断来调用函数(主程序不调用此函数),而不用函数调用中断
你的目标是协议级的事件驱动
你好,我把程序贴出来了。
/////wireless.h 用法发送一段完整的波形
#include <stc12c5a60s2.h>
#define uchar unsigned char
//IO口定义
sbit TRX=P2^0;//遥控器信号输出,(数据输出)
//变量定义
uchar TH0_12a=0xfa;
uchar TL0_12a=0xe2; //12a 宽脉冲 1310 t=1424.4092us proteus测1.46ms
uchar TH0_4a=0xfe;
uchar TL0_4a=0x3e; //4a 窄脉冲 450 t=488.28125us proteus测0.52ms
uchar TH0_124a=0xcb;
uchar TL0_124a=0x12; //124a 同步头 13550 t=14702.691us proteus测14.75ms
/*void init()
{
TMOD=0x10; //定时器T1工作于方式1,16位计数器
TH0=0x00;
TL0=0x00;
ET1=1; //定时器1中断允许
EA=1;
} */
void time1_interrupt() interrupt 1 // TF1=1,定时器1溢出产生中断
{
TR0=0; //关定时器
}
void bit_1() //1 12a低,4a高,12a低,4a高
{
TRX=0;
TH0=TH0_12a;
TL0=TL0_12a;
TR0=1;
while(TR0); //中断返回时TR0=0
TRX=1;
TH0=TH0_4a;
TL0=TL0_4a;
TR0=1;
while(TR0);
TRX=0;
TH0=TH0_12a;
TL0=TL0_12a;
TR0=1;
while(TR0); //中断返回时TR0=0
TRX=1;
TH0=TH0_4a;
TL0=TL0_4a;
TR0=1;
while(TR0);
}
void bit_0() //0 12a高,4a低,12a高,4a低
{
TRX=0;
TH0=TH0_4a;
TL0=TL0_4a;
TR0=1;
while(TR0);
TRX=1;
TH0=TH0_12a;
TL0=TL0_12a;
TR0=1;
while(TR0);
TRX=0;
TH0=TH0_4a;
TL0=TL0_4a;
TR0=1;
while(TR0);
TRX=1;
TH0=TH0_12a;
TL0=TL0_12a;
TR0=1;
while(TR0);
}
void bit_syn() //同步码 4a低,124a高
{
TRX=0;
TH0=TH0_4a;
TL0=TL0_4a;
TR0=1;
while(TR0);
TRX=1;
TH0=TH0_124a;
TL0=TL0_124a;
TR0=1;
while(TR0);
}
void trans_proc(uchar *mydata,uchar n)
{
uchar i,j,temp,temp_temp;
bit_syn();
for(i=0;i<n;i++)
{
temp=mydata;
for(j=0;j<8;j++)
{
temp_temp=temp;
temp_temp &=0x80;
if(temp_temp==0x80)
{
bit_1();
}
else
{
bit_0();
}
temp=temp <<1;
}
}
EA = 0; //防止不断发送而不能进行函数返回
}
////main.c 先通过串口接收一个字符,如果字符是'a',则发送一段波形
#include "wireless.h"
#define FOSC 11059200L
#define BAUD 9600
BYTE command;
////初始化函数将串口的初始和定时器0的初始化合在一起,定时器0与定时器1应该能分别独立工作吧?
void InitUart()
{
SCON = 0x5a; //8 bit data ,no parity bit
TMOD = 0x21; //T0 as 8-bit auto reload
TH1 = TL1 = -(FOSC/12/32/BAUD); //Set Uart baudrate
TH0 = TL0 = 0x00;
ET0 = 1;
TR1 = 1;
}
void RecvData(void) //查询方式接收命令
{
while(!RI);
RI=0;
command =SBUF;
}
void SendData(BYTE d) //发送一个字节的数据,形参d即为待发送数据。
{
while(!TI);
TI=0;
SBUF=d; //将数据写入到串口缓冲
}
void main()
{
InitUart();
while(1)
{
RecvData();
if(command == 'a')
{
SendData('a');
EA = 1;///我的理解是此时完全进入到发送波形的过程
trans_proc(0xd6,1);///EA=0,会让程序发送完一段波形就返回
}
if(command == 'b')
{
SendData('b');
}
}
}
以上程序运行的结果是,串口能够正常显示字符,但是不能进行无线通信,即另一块单片机收不到数据。不用串口而直接用wireless.h发送时,另一块单片机能够收到数据。是什么原因呢?
|