亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码
標(biāo)題:
msp430單片機(jī)紅外遙控 編碼 解碼源程序
[打印本頁(yè)]
作者:
51hei學(xué)習(xí)技術(shù)中
時(shí)間:
2017-3-3 02:47
標(biāo)題:
msp430單片機(jī)紅外遙控 編碼 解碼源程序
0.png
(67.72 KB, 下載次數(shù): 90)
下載附件
2017-3-3 02:46 上傳
完整源碼下載:
完整源代碼:紅外編解碼.rar
(3.01 KB, 下載次數(shù): 33)
2017-3-3 02:46 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
主程序預(yù)覽:
/***************************紅外編解碼.c***************************************/
// * NAME : 紅外編解碼.c
// * FUNCTION : 紅外的編碼與解碼
// * PROGRAMMED : 劉中原
// * DATE(ORG) : 2010.10.12
// * PROJECT : 430紅外遙控,數(shù)據(jù)傳輸
// * OS : 所使用的操作系統(tǒng)
// * HISTORY :
// * ID --- DATE -----------NOTE--------------------------
// * 00 94.04.14 初期完成
// * 01 94.05.14 第二版 XX機(jī)能修改(追加)
//
//編解碼波形(NEC)
//________________ __ __ __
// | | | | | |
// | | | | | |
// | | | | | |
// | | | | | |
// | | | | | |.....................................
// | | | | | |
// | | | | | |
// |________| |_| |__| "0"高:0.56ms+低:0.565ms=1.125ms
//|<- 9ms ->|<-4.5ms>|"0"| "1"| "1"高:0.56ms+低:1.69ms =2.25ms
//|<- 引導(dǎo)碼 ->|<-起始碼|<-8位地址->|<-8位地址->|8位數(shù)據(jù)->|<-數(shù)據(jù)反碼->|
//
//可以完成編碼 解碼 注釋掉#define DECODE移去解碼部分 #define ENCODE移去編碼
//sendFlg是發(fā)送完成標(biāo)志,完成后置1 未完成時(shí)連發(fā)數(shù)據(jù)無(wú)效
//
//占用資源:TB CCR0中斷 CCR4 CCR5中斷 CCR0賦值為1125 時(shí)鐘1MHz
//紅外輸出端P2.0 32768Hz
//P2.1為紅外輸入端口
//
/******************************************************************************/
//
#define DECODE //解碼
#define ENCODE //編碼
#include "msp430x16x.h"
#include "紅外編解碼.h"
/**********************************宏定義**************************************/
#ifdef ENCODE /*=======編碼=======*/
#define BIT_0 P2SEL&=~BIT0 //紅外編碼后的低電平
#define BIT_1 P2SEL|=BIT0 //紅外編碼后的高電平
#define SENDDAT TBCCTL0|=CCIE //啟動(dòng)數(shù)據(jù)發(fā)送 發(fā)送已存入addr0和dat0的數(shù)據(jù)
//發(fā)送數(shù)據(jù)位高位部分 開(kāi)始發(fā)數(shù)據(jù)位
#define SENDBIT TBCCR4=565-1;TBCCTL4|=CCIE
#define SEND_END TBCCTL0&=~CCIE;TBCCTL4&=~CCIE //發(fā)送結(jié)束 關(guān)中斷
#endif /*=======編碼=======*/
#ifdef DECODE /*=======解碼=======*/
#define DATIN ((P2IN&BIT1)>>1) //數(shù)據(jù)輸入
#endif /*=======解碼=======*/
/******************************************************************************/
#ifdef DECODE /*=======解碼=======*/
//解碼后保存數(shù)據(jù)
char addr1;
char dat1;
char readFlg = 0; //成功讀紅外數(shù)據(jù)標(biāo)志
#endif /*=======解碼=======*/
#ifdef ENCODE /*=======編碼=======*/
//要編碼的數(shù)據(jù) 發(fā)送緩存
char addr0;
char dat0;
char sendFlg = 1; //發(fā)送完成標(biāo)志
#endif /*=======編碼=======*/
//初始化TB
void int_TB()
{
TBCTL = TBSSEL_2 + TBCLR + MC_1; //TB時(shí)鐘源:SMCLK 增模式
TBCCR0 = 1125 - 1;
TBCCTL5 |= CCIE;
TBCCR5 = 450;
}
//有關(guān)端口初始化
void int_io()
{
#ifdef ENCODE /*=======編碼=======*/
//ACLK輸出作為編碼的載波
P2OUT &=~ BIT0;
P2DIR |= BIT0;
#endif /*=======編碼=======*/
#ifdef DECODE /*=======解碼=======*/
//解碼輸入端口P2.1
/*P2IES |= BIT1;
P2IFG &=~ BIT1;
P2IE |=BIT1;*/
#endif /*=======解碼=======*/
}
//初始化紅外相關(guān)資源
void int_hw()
{
int_TB();
int_io();
}
#ifdef ENCODE /*=======編碼=======*/
//編碼發(fā)送數(shù)據(jù),eos標(biāo)志最后數(shù)據(jù)一般為1,發(fā)送多字節(jié)數(shù)據(jù)時(shí),最后一字節(jié)是1
void sendDat(char addr,char dat)
{
if(sendFlg) //上次發(fā)送完成
{
//數(shù)據(jù)存入發(fā)送緩存
addr0 = addr;
dat0 = dat;
//開(kāi)始發(fā)送
SENDDAT;
}
}
#endif /*=======編碼=======*/
#ifdef DECODE
//紅外數(shù)據(jù)解碼函數(shù)
void datDecode(unsigned int tAddr, unsigned int tDat)
{
if(((tAddr>>8)&0xff)==(tAddr&0xff)) //地址高位低位相等 地址位數(shù)據(jù)正確
{
addr1 = tAddr&0xff;
if(((tDat>>8)&0xff)==((~tDat)&0xff)) //數(shù)據(jù)高位低位反 數(shù)據(jù)位數(shù)據(jù)正確
{
dat1 = ~(tDat&0xff);
readFlg = 1;
}
else
{
readFlg = 2;
}
}
else
{
readFlg = 2;
}
}
#endif
//中斷
#ifdef ENCODE /*=======編碼=======*/
//TB0中斷 編碼
#pragma vector=TIMERB0_VECTOR
__interrupt void Timer_B (void)
{
static char i = 0; //計(jì)數(shù) 起始
static char state = 0; //狀態(tài) 起始:0 數(shù)據(jù):1
static char cnt = 0; //發(fā)送計(jì)數(shù)
if(state==0)
{
if(i==0)
{
BIT_1;
//完成標(biāo)志置0 開(kāi)始發(fā)送
sendFlg = 0;
}
else if(i==8)
{
BIT_0;
}
else if(i==11)
{
SENDBIT;
state = 1;
i = 255;
}
}
else if(state==1)
{
BIT_0;
if(cnt<8) //地址高位
{
if(addr0&(1<<(7-cnt))) //從高位到低位 是1延時(shí)+2:2.25ms
{
if(i==1)
{
SENDBIT;
i = 255;
cnt++; //發(fā)送加1
}
}
else
{
SENDBIT;
i = 255;
cnt++; //發(fā)送加1
}
}
else if(cnt<16) //地址低位
{
if(addr0&(1<<(15-cnt))) //從高位到低位 是1延時(shí)+2:2.25ms
{
if(i==1)
{
SENDBIT;
i = 255;
cnt++; //發(fā)送加1
}
}
else
{
SENDBIT;
i = 255;
cnt++; //發(fā)送加1
}
}
else if(cnt<24) //數(shù)據(jù)
{
if(dat0&(1<<(23-cnt))) //從高位到低位 是1延時(shí)+2:2.25ms
{
if(i==1)
{
SENDBIT;
i = 255;
cnt++; //發(fā)送加1
}
}
else //是0延時(shí)+1:1.125ms
{
SENDBIT;
i = 255;
cnt++; //發(fā)送加1
}
}
else if(cnt<32) //數(shù)據(jù)反碼
{
if((~dat0)&(1<<(31-cnt))) //從高位到低位 反碼是1延時(shí)+2:2.25ms
{
if(i==1)
{
SENDBIT;
i = 255;
cnt++; //發(fā)送加1
}
}
else //是0延時(shí)+1:1.125ms
{
SENDBIT;
i = 255;
cnt++; //發(fā)送加1
}
}
/*else if(cnt==32) //最后多發(fā)一位0,否則無(wú)法識(shí)別最后一位
{
SENDBIT;
i = 255;
cnt++; //發(fā)送加1
}*/
else
{
//完成標(biāo)志置1
sendFlg = 1;
//變量歸零
state = 0;
cnt = 0;
i = 255;
SEND_END; //停止發(fā)送
BIT_0;
}
}
i++; //計(jì)數(shù)加1
TBCCTL4 &=~ CCIFG; //中斷標(biāo)志清除
}
#endif /*=======編碼=======*/
//TB1中斷
#pragma vector=TIMERB1_VECTOR
__interrupt void Timer_B1(void)
{
static int i = 0; //計(jì)數(shù)變量 接收用
static char state = 0; //代表接收狀態(tài)的變量
static char cnt = 0; //讀取位數(shù)計(jì)數(shù)
switch( TBIV )
{
case 0x08: // TBCCR4 編碼發(fā)送數(shù)據(jù)位部分
#ifdef ENCODE /*=======編碼=======*/
BIT_1;
TBCCTL4 &=~ CCIE;
#endif /*=======編碼=======*/
break;
case 0x0a: // TBCCR5 解碼用
#ifdef DECODE /*=======解碼=======*/
TBCCR5 = (TBR+440>1124)?(TBR+440-1124):(TBR+440);
if(TBCCR5>1124) TBCCR5 = 1124; //防止TBCCR5出界
i++;
if(DATIN==0&&readFlg>0) //上次讀取完成(可能有錯(cuò)誤 readFlg=2 錯(cuò)誤數(shù)據(jù)) 又有數(shù)據(jù)到來(lái)
{
readFlg = 0;
i = 0;
}
if(state==0&&readFlg == 0) //起始碼
{
if(i<15&&DATIN) //引導(dǎo)碼有高電平 錯(cuò)誤數(shù)據(jù)幀
{
readFlg = 2;
}
else if(i>26&&DATIN==0X01) //引導(dǎo)碼正確 準(zhǔn)備讀數(shù)據(jù)
{
state = 1; //1狀態(tài) 讀數(shù)據(jù)
i = 0;
}
}
else if(state==1) //數(shù)據(jù)
{
static unsigned int tAddr = 0; //地址位臨時(shí)變量
static unsigned int tDat = 0; //數(shù)據(jù)位臨時(shí)變量
static char datFlg = 0;
if(cnt<16) // 地址 位
{
if(DATIN==0x00&&datFlg==0)
{
datFlg = 1; //有數(shù)據(jù)
i = 0;
}
if((i==2||i==3)&&datFlg&&DATIN==0X00)
{
tAddr |= (0X00)<<(15-cnt);
i = 0;
datFlg = 1;
cnt++;
return;
}
else if((i==3)&&DATIN==0X01&&datFlg)
{
tAddr |= (0X01)<<(15-cnt);
i = 0;
datFlg = 0;
cnt++;
}
else if(i>3)
{
readFlg = 2;
cnt = 0;
datFlg = 0;
tAddr = 0;
tDat = 0;
state = 0;
}
}
else if(cnt<32) //數(shù)據(jù)位接收
{
if(DATIN==0x00&&datFlg==0)
{
datFlg = 1; //有數(shù)據(jù)
i = 0;
}
if((i==2||i==3)&&datFlg&&DATIN==0X00)
{
tDat |= (0X00)<<(31-cnt);
i = 0;
datFlg = 1;
cnt++;
return;
}
else if((i==3)&&DATIN==0X01&&datFlg)
{
tDat |= (0X01)<<(31-cnt);
i = 0;
datFlg = 0;
cnt++;
}
else if(i>3)
{
readFlg = 2;
cnt = 0;
datFlg = 0;
tAddr = 0;
tDat = 0;
state = 0;
}
}
else
{
datDecode(tAddr, tDat);
//解碼結(jié)束
i = 0;
cnt = 0;
state = 0;
datFlg = 0;
tAddr = 0;
tDat = 0;
}
}
#endif /*=======解碼=======*/
break;
case 0x0e: //overflow 溢出,未用
break;
}
}
/*
#ifdef DECODE =======解碼=======*/
//PORT2中斷 此中斷僅解碼接收數(shù)據(jù)用
/*#pragma vector=PORT2_VECTOR
__interrupt void PORT2_ISR(void)
{
switch(DATIFG&BIT1)
{
case 2:
//開(kāi)始接收數(shù)據(jù)
DATREAD;
break;
}
DATIFG = 0; //清除標(biāo)志位
}
#endif =======解碼=======*/
復(fù)制代碼
作者:
草莓咖啡因
時(shí)間:
2017-5-18 14:11
感謝分享,就是下載資料好貴啊
歡迎光臨 (http://www.denmoz.com/bbs/)
Powered by Discuz! X3.1