📄 fr-send-t0.c
字号:
// *****************************
// *****************************
// ** 广 东 海 利 集 团 **
// ** I C 技 术 部 **
// ** FR-SEND-38K 主 程 序 **
// *****************************
/*
利用T0产生38K频率做载波发送出编码信号
发送数据顺序为:'B'+原码(低位在先)+反码(低位在先)+'E';
*/
//----------------包涵文件------------------
#include "ioS3C9454.h" //包涵文件
//----------------系统设置------------------
__code const volatile unsigned char SmartOption[4] @0x003c = {0x0,0x0,0x0b0,0x3};
//*************************************************************************
//----------------各变量定义------------------
unsigned char tem=0,tem10=0,tem100=0,tem1000=0; //10ms时钟
unsigned char av_data=0; //要发送的值
unsigned char sycd=20; //声音长度
unsigned int test=0; //测试值
//----------------初始化程序------------------
void chushi(void)
{
BTCON = 171; //128分频 |=3清除计数器和分频器 BTCNT>=31.25即1ms
CLKCON = 0x18; // CPU clock=0SC
P0PND = 0x0; //P0/INT 关闭
P0CONH = 234; //AD(电位器),OUT,OUT,OUT
P0CONL = 170; //ALL OUT
P0 = 0x0;
P1CON = 10; //ALL OUT
P1=0;
P2CONH = 106; //OUT,OUT(SPK),OUT(LED)
P2CONL = 34; //IN(KEY),OUT,IN(控制相连),OUT(控制输出) |=1(即T0匹配输出)
P2 = 0;
PWMDATA = 0;
PWMCON = 0;
T0DATA = 42; //13.15us 相当于38k频率
T0CON = 200; //TMR0 start count,f=fosc 无中断 |=8 清除计数值
ADCON = 115; //启动AD7
}
//----------------红外发射------------------
//close_time为关闭t0匹配输出的时间(Unit:us)
//高电平为120us 'b'(12000),'1'(4800),'0'(2400),'e'(7200)
void T0_ctrol(char info)
{
unsigned int close_time;
if('b'==info || 'B'==info)
close_time=12000; //1%
else if('1'==info)
close_time=4800; //2.5%
else if('0'==info)
close_time=2400; //5%
else if('e'==info || 'E'==info)
close_time=7200; //1.6%
close_time=close_time/40;
//----------------------------------高电平发出
P2 |= 1; //high
P2CONL |= 1; //产生PWM
BTCON |= 3;
while(BTCNT<=3);
//----------------------------------低电平发出
P2CONL &= 255-1; //停止PWM
P2 &= 255-1; //low
if(close_time>=255)
{
BTCON |= 3;
while(BTCNT<=253); //停止PWM
BTCON |= 3;
while(BTCNT<=close_time-253); //停止PWM
}
else
{
BTCON |= 3;
while(BTCNT<=close_time); //停止PWM
}
}
//----------------红外发射------------------
void ir_send(unsigned char data)
{
unsigned char i=0;
unsigned int send_data=0;
//----------------------------------计算原码和反码 低位为原码(反码在高8位)
send_data = (~data);
send_data <<= 8;
send_data |= data;
//----------------------------------发'B'
T0_ctrol('B');
//----------------------------------再发送数据码(原码+反码 低位在先)
for(i=0;i<16;i++) //低位在先,先发原码再发反码
{
if(0x01==(send_data&0x01))
{
//----------------------------------发'1'
T0_ctrol('1');
}
else
{
//----------------------------------发'0'
T0_ctrol('0');
}
send_data >>= 1;
}
//----------------------------------发'e'
T0_ctrol('E');
}
//----------------键盘处理程序------------------
unsigned char keyys=0,keyok=0;
void jianpan(void)
{
if(0==(P2&8))
{
keyys++;
if((keyys>=10)&(keyok==0))
{
keyok = 1;
keyys = 0;
sycd = 5;
ir_send(test++); //发送测试码
if(test>=256)
test=0;
}
}
if(0!=(P2&8))
{
keyok=0;
keyys=0;
}
}
//----------------声音处理程序------------------
void shenyin()
{
if(sycd>0)
{
P2 |= 32; //声音
sycd--;
}
else
{
P2 &= 255-32; //关闭声音
}
}
//----------------AD转换程序------------------
void adzh(void)
{
if(0!=(ADCON&8))
{
ADCON=115;
} //如果转化完成,再启动下一次转换
}
void get_av(void)
{
if(ADDATAH<3)
{
if(av_data>=ADDATAH+3)
{
av_data=ADDATAH;
ir_send(av_data);
}
}
else if(ADDATAH>252)
{
if(av_data<=ADDATAH-3)
{
av_data=ADDATAH;
ir_send(av_data);
}
}
else //得到ADC的值大于等于0+3而且小于等于255-3.
{
if(av_data>=ADDATAH+3 || av_data<=ADDATAH-3)
{
av_data=ADDATAH;
ir_send(av_data);
}
}
}
//----------------主程序------------------
main()
{
//***填充系统SMART OPTION***/
unsigned char buffer = SmartOption[0];
chushi();
for(;;)
{//主循环
if(BTCNT>=25) tem+=1,BTCON|=3;
//******************10ms
if(tem10==1)tem10=0;
if(tem>=10){tem10=1;tem=0;}
//***********************
if(tem10==1)
//***********************************************************************<节拍程序>
{//节拍10
tem100+=1;
if(tem100>=10)
{//节拍100
tem100=0;
tem1000+=1;
if(tem1000>=10)
{//节拍1000
tem1000=0;
P2^=16; //秒灯闪动显示
}//节拍1000END
get_av();
//100Ms
}//节拍100END
jianpan();
shenyin();
}//节拍10END
adzh();
}//主循环
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -