2020-01-27 11:34发布
zhxshseu 发表于 2013-4-11 11:17 http://www.amobbs.com/thread-5528272-1-1.html 我这里做了,去吧工程文件下下来,里面的Send.uv2就是你想 ...
zjx_arm 发表于 2013-4-11 16:28 你的这个send我看过了啊,我的程序就是按照你的这个修改的,我怎么算都算不出38k的载波啊。。。。9ms 也 ...
最多设置5个标签!
我这里做了,去吧工程文件下下来,里面的Send.uv2就是你想要的~
你的这个send我看过了啊,我的程序就是按照你的这个修改的,我怎么算都算不出38k的载波啊。。。。9ms 也没有,4.5ms也没有,反正我觉得那个程序乱七八糟的
可能计算的值不一定对吧~我是仿真中看的~现在的参数看到的时间值大致是符合的~
/*****************************************************************************************
红外发射接收原理:
发射波形(38kHZ代替高电平) 接收波形(接受到的电平反向)
38kHZ 38kHZ 发射 ____1__________ ______1_________
||||||_____0________||||||___0_______------------->___0__| |___0__|
------------->
定时器工作方式
在方式2中把16位的计数器拆分成两个8位计数器,底8位作计数器用以保存计数初值。方式2适合用于比较精确的脉冲信号发生器,和波特率发生器
方式2计算初值X,X=256-tfosc/12(或6)
12和6是分频,一般情况下取12;t为所设计时时间单位为s,fosc为晶振单位为Hz。
计数器每加1耗费一个机器机器周期,一个机器周期等于12个振荡脉冲周期即如果震荡周期为1s计数器加一要花12s ,若晶振为fosc=12MHz计数频率
为fcont=fosc/12为1MHz即计数器加1消耗1us ,每计1所华的时间为 t=T=1/fcont=1(fosc/12)=12/fosc
/**********************************************************/
#include "reg51.h"
#include "keyscan.c"
sbit TR_DATA=P2^7;
/***********************************************
函数名:delay_ms
子函数:无
输 入:n
输 出:无
功 能:延迟nMS子程序24MHz,n MS经滤波器检测非常精确
------------------------------------------------
************************************************/
void delay_ms(unsigned int n)
{
unsigned int i=218;
for(;n>0;n--)
{
while(i--);
i=218;
}
}
/***********************************************
函数名:TransData
子函数:无
输 入:_data
输 出:无
功 能:发送数据 9ms38k 4ms低电平
说明:开始时序:9ms38kHz方波接着4ms低电平 |||||||||||||||||||||||____0___
信号"1"时序:1ms的38kHZ方波接着1ms低电平
信号"0"时序:1ms的38kHZ方波接着3ms低电平
结束时序:5ms的38kHZ
************************************************/
void TransData(unsigned char _data)
{
unsigned char i;
TR0=1; //启动38K发生器
delay_ms(9); //9ms的启动38KHz脉冲
TR0=0; //关闭38K发生器
TR_DATA= 0; //输出0
delay_ms(5); //5ms的启动低电平
for(i=0;i<8;i++)
{
TR0=1; //启动38K发生器
delay_ms(1); //产生1ms的38k脉冲供红外发射管发射
TR0=0; //关闭38K发生器
TR_DATA= 0; //输出0
if(_data&(1<<i))delay_ms(1); //1左移i位 ,先发低位
//如果发送1 则高低电平比为1:1
else delay_ms(3); //如果发送0 则高低电平比为1:3
}
TR0=1; //启动38K发生器
delay_ms(5); //5ms的结束38K方波
TR0=0; //关闭38K发生器
TR_DATA= 0; //输出0
}
//主函数
void main()
{
unsigned char key;
TMOD=0x02; //定时器T0工作方式2
TH0=0xE6;
TL0=0xE6; //自动重载
EA=1;
ET0=1;
while(1)
{
TR_DATA=0;
while(!key_on()); //等待按下按键
key=key_scan();
if(key == 20)continue;//如果key=20结束本次循环
TransData(key);
while(key_on()); //等按键松开
}
}
//定时器零产生38K方波
void T0_interrupt(void) interrupt 1
{
TR_DATA=~TR_DATA;
TR0=1;
}
一周热门 更多>