钻石会员
主题
帖子
积分11931
阅读权限50
注册时间2009-7-18
最后登录1970-1-1
在线时间 小时
|
/***********************************************************************************
用51单片机模拟HS2240发码
CPU: 89S52
波特率:9600
晶振: 11.0592M
不用一个定时器来检测串口丢包
用串口助手以字符方式发送以下代码,串口会返回如下代码,并在P1.0端口输出对应的高低电平
当发码为1则高电平975uS/低电平325uS;当发码为0则低电平325uS/高电平975uS;按HS2240的
编码方式在发码前会先发一个同步位即低电平325uS/高电平10mS。
以下为四个按键码,前面20个为地址码,后面4个为键码,E为串口发码指令码
*******************0001E
*******************0100E
*******************0010E
*******************1000E
按下k1发出:*******************0001 撒防键码
按下k2发出:*******************0100 寻车键码
按下k3发出:*******************0010 启动键码
按下k4发出:*******************1000 设防键码
星号是本人遥控器的地址码用0或1代替
以下时序是HS2240的1~8脚的振荡电阻为2M供12V时的
2M供12V时规格上说发送1位数据的(高+低电平)为1360uS ± 20%
一帧码的宽度为32*1360uS
程序设计:红尘有你 QQ:691477940 2013-06-10
/***********************************************************************************/
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
//以下为11.0592Mhz晶振时用逻辑分析仪实测的定时初值(按键与串口)
#define HTH0_975uS (65536 - 870) / 256; //端口输出高电平时专用
#define HTL0_975uS (65536 - 870) % 256; //端口输出高电平时专用854
#define LTH0_975uS (65536 - 838) / 256; //端口输出低电平时专用854
#define LTL0_975uS (65536 - 838) % 256; //端口输出低电平时专用
#define HTH0_325uS (65536 - 282) / 256; //端口输出高电平时专用
#define HTL0_325uS (65536 - 282) % 256; //端口输出高电平时专用265
#define LTH0_325uS (65536 - 248) / 256; //端口输出低电平时专用265
#define LTL0_325uS (65536 - 248) % 256; //端口输出低电平时专用
#define TH0_10mS (65536 - 9200) / 256; //端口输出低电平时专用
#define TL0_10mS (65536 - 9200) % 256; //端口输出低电平时专用
/***********************************************************************************/
#define RxIn 25 //串口接收数据长度
sbit P2240 = P1^0;
sbit LED = P1^7;
sbit k1 = P3^4; //撒防
sbit k2 = P3^5; //寻车
sbit k3 = P3^6; //启动
sbit k4 = P3^7; //设防
char SBUF_DATA[RxIn];
code char k1dat[24] = "*******************0001"; //撒防
code char k2dat[24] = "*******************0100"; //寻车
code char k3dat[24] = "*******************0010"; //启动
code char k4dat[24] = "*******************1000"; //设防
/***********************************************************************************/
void Delay10ms() //@11.0592MHz
{
uchar i,j;
i = 18;
j = 235;
do
{
while(--j);
} while(--i);
}
/***********************************************************************************/
void p2240_0() //发射0 函数
{
P2240 = 1;
TH0 = HTH0_325uS; //
TL0 = HTL0_325uS; //
TR0 = 1;
while(TR0); //高电平 $
P2240 = 0;
TH0 = LTH0_975uS; //
TL0 = LTL0_975uS; //
TR0 = 1;
while(TR0); //低电平 $
}
/***********************************************************************************/
void p2240_1() //发射1 函数
{
P2240 = 1;
TH0 = HTH0_975uS; //
TL0 = HTL0_975uS; //
TR0 = 1;
while(TR0); //高电平 $
P2240 = 0;
TH0 = LTH0_325uS; //
TL0 = LTL0_325uS; //
TR0 = 1;
while(TR0); //低电平 $
}
/***********************************************************************************/
void p2240_e() //发射同步
{
P2240 = 1;
TH0 = HTH0_325uS; //
TL0 = HTL0_325uS; //
TR0 = 1;
while(TR0); //高电平 $
P2240 = 0;
TH0 = TH0_10mS; //
TL0 = TL0_10mS; //
TR0 = 1;
while(TR0); //低电平 $
}
/***********************************************************************************/
void PUTF(char STR)
{
if(STR == '0')
p2240_0(); //= 0发射0 函数
else if(STR == '1')
p2240_1(); //= 1发射1 函数
}
/***********************************************************************************/
void send_char_com(unsigned char ch)
{
SBUF = ch;
while(TI == 0);
TI = 0 ;
}
/***********************************************************************************/
void test() //发射数据
{
static uchar i,j;
ES = 0;
for(j = 0;j <= 4;j++) //发送5次
{
p2240_e(); //发射同步码
for(i = 0;i < 24;i++) //发送24个数据
{
PUTF(SBUF_DATA);
}
}
for(i = 0;i < 24;i++) //发送24个数据
{
send_char_com(SBUF_DATA); //发送回电脑端
}
SBUF_DATA[24] = 0;
ES = 1;
}
/***********************************************************************************/
void send_dat(uchar *k)
{
static uchar i,j;
ES = 0;
for(j = 0;j <= 4;j++) //发送5次
{
p2240_e(); //发射同步码
for(i = 0;i < 24;i++) //发送24个数据
{
PUTF(k);
}
}
ES = 1;
}
/***********************************************************************************/
void init()
{
TMOD = 0x21;
SCON = 0x50;
TH1 = TL1 = 0xFD; //11.0592MHz波特率设为9600
TH0 = TL0 = 0x00;
TR0 = RI = TI = 0; //清发送标志
ET0 = TR1 = ES = EA = 1;
}
/***********************************************************************************/
bit UART_RI = 0;
void main()
{
P2240 = 0;
init();
while(1)
{
if(UART_RI)
{
UART_RI = 0;
test(); //发射数据
}
if(!k1)//撒防
{
Delay10ms();
if(!k1)//撒防
{
send_dat( & k1dat);
}
while(!k1);
}
if(!k2)//寻车
{
Delay10ms();
if(!k2)//寻车
{
send_dat( & k2dat);
}
while(!k2);
}
if(!k3)//启动
{
Delay10ms();
if(!k3)//启动
{
send_dat( & k3dat);
}
while(!k3);
}
if(!k4)//设防
{
Delay10ms();
if(!k4)//设防
{
send_dat( & k4dat);
}
while(!k4);
}
}
}
/***********************************************************************************/
void ser() interrupt 4//以下方式不用个定时器来检测丢包
{
uint bt;uchar i;
ES = 0;
if(RI)
{
for(i = 0;i < RxIn;i++) //接收24数据
{
for(bt = 0;(bt < 200)&&(!RI);bt++);//判断bt本身和RI后再加bt
if(bt >= 199) //接收超时,结束接收
{
if(SBUF_DATA[24]== 'E')
{
UART_RI = 1;
}
break;
}
RI = 0;
SBUF_DATA = SBUF;
}
if(SBUF_DATA[24]== 'E')
{
UART_RI = 1;
}
else
{
UART_RI = 0; //接收成功标志位置1
}
}
else if(TI) TI = 0; //如果是发送中断将标志位清0
ES = 1;
}
/***********************************************************************************/
void Timer1() interrupt 1//TR0
{
TR0 = 0;
}
/***********************************************************************************/
|
|