N76E003紅外解碼程式

2021-10-05 10:47:37 字數 4167 閱讀 8238

最近學習了網上的紅外解碼程式儲存學習一下

使用的是n76e003晶元

借鑑了好多地方

只是簡單的啟動led燈

使用的是日本 nec協議

外部定時器中斷1

定時器模式2,8位自動重灌 256步溢位一次

16m晶振

判斷語句那裡自己集合了好多想了乙個案例

定義乙個16位數字

將**的使用者碼反碼和鍵碼正碼一起判斷

嘿嘿嘿

uint i;

i = ircord[2]

<<8;

i |= ircord[1]

;//將第乙個使用者反碼和按鍵碼結合判斷

這裡就是我寫的全部的程式

只是乙個簡單的驅動程式

#include

"n76e003.h"

#include

"sfr_macro.h"

#include

"function_define.h"

#include

"common.h"

#include

"delay.h"

#define uchar unsigned char

#define uint unsigned int

sbit ir = p1^7;

//定義紅外脈衝資料介面 外部中斷1輸入口

sbit sclk = p3^0;

//初始時鐘

sbit rst = p1^6;

//ce端

sbit data = p0^7;

//資料讀寫端

uchar irtime;

//檢測紅外高電平持續時間(脈寬)

uchar ircord[4]

;//此陣列用於儲存分離出來的4個位元組的資料(使用者碼2個位元組+鍵值碼2個位元組)

uchar irdata[33]

;//此陣列用於儲存紅外的33位資料(第一位為引導碼使用者碼16+鍵值碼16)

bit irpro_ok, irok;

//第乙個用於紅外置收4個位元組完畢。irok用為檢測脈寬完畢

void

init_t1()

void

time1

() interrupt 3

//定義定時器1

void

ext1_t1

() interrupt 2

//定義外部中斷1

}else

}void

ircordpro()

ircord[i]

= value;

//每處理完乙個位元組把它放入ircord陣列中。

value =0;

//清零value方便下次在存入資料

} irpro_ok =1;

//接收完4個位元組後irpro ok置1表示紅外解碼完成

}void

init_gpio()

void main ()}

}}}

上面是之前多次寫的這裡新增按鍵長短按程式,抄寫了其他人的程式

原文**:

#include

"n76e003.h"

#include

"common.h"

#include

"delay.h"

#include

"sfr_macro.h"

#include

"function_define.h"

//【使用者必填項:user_h、user_l、check_en、cpu_fosc、ir】

#define user_h 0x80

//使用者碼高8位

#define user_l 0x7f

//使用者碼低8位

#define check_en 0

//是否要校驗16位使用者碼:不校驗填0,校驗則填1

#define cpu_fosc 16000000

//輸入主頻,自適應解碼(單位:hz,範圍:6mhz ~ 40mhz)

#define ca_s 8

//長按時間設定,單位:108ms(即 108ms整數倍,10倍以上為宜)

sbit ir = p1^7;

//定義紅外脈衝資料介面 外部中斷1輸入口

//無符號型別

#define uint8 unsigned char

#define uint16 unsigned int

/*┈┈┈┈┈┈┈┈┈┈ 基準 ┈┈┈┈┈┈┈┈┈┈┈*/

#define boot_limit (((9000+4500) +2000)/step)

//引導碼週期上限

#define boot_lower (((9000+4500) -2000)/step)

//引導碼週期下限

#define bit1_limit ((2250 +800)/step)

//「1」週期上限

#define bit0_limit ((1125 +400)/step)

//「0」週期上限

#define step 400

//紅外取樣步長:400us

#define th_h ((65536 - step*(cpu_fosc/300)/40000)/256)

//定時器高8位基準賦值

#define th_l ((65536 - step*(cpu_fosc/300)/40000)%256)

//定時器低8位基準賦值

uint8 ir_bt;

//解碼效果返回:0無效,1有效,2短按,3長按

uint8 nec[4]

=0;//解碼存放:16位使用者碼、操作碼正反碼

uint8 cntca;

//長按計數

uint16 cntstep;

//步數計

bit ira,irb;

//電位狀態儲存

bit irsync;

//同步標誌

uint8 bitn;

//位碼裝載數

void

kz0();

//短按處理

void

kz1();

//長按處理

void

ir_init()

;void

ir_nec()

;/***************** 主函式 ********************/

void

main

(void)}

else

} ir_bt =0;

//清有效標誌}}

void

ir_init()

/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈

函式:紅外線nec週期取樣解碼法(定時中斷,下降沿查詢週期時間)

全域性變數:ir_bt = 0無效

1有效,待繼續判斷長、短按(如不需要判斷長、短按,則直接使用)

2短按3長按

┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/

void

ir_nec()

else

if(cntstep > boot_lower)

//同步位置1,裝載位碼數

else

if(irsync)

//解碼有效,接下來判斷:短按?長按?

#else

if(nec[2]

==~nec[3]

)//校驗操作碼正反碼

#endif

}elseif(

(bitn &

0x07)==

0)//nec[3]每裝滿8位,移動儲存一次(即 bitn%8 == 0)}}

cntstep =0;

//步數計清0}}

/********************** 定時器1斷函式************************/

void

time0

(void

) interrupt 1

N76E003低功耗的處理

低功耗是專案中非常重要的一部分,尤其是對於一些使用電池供電的裝置。n76e003支援兩種低功耗模式,一種是空閒模式,一種是掉電模式,從字面意思一看就知道如果要最求最低的功耗,一定是需要使用掉電模式。在掉電模式下,作者對當前的專案應用中測試出來的最低的功耗是5ua,這個值本人認為已經是非常不錯的。針對...

N76E003控制雙路步進電機(開環)

實驗材料 類目型號 mcun76e003 步進電機 42步進 步進電機驅動器 設定800細分 電源24v ttlch340 1.1 程式採用pwm中斷,實現對pwm脈衝計數,由此實現開環控制步進電機,設定為下降沿觸發。1.2 步進電機驅動器提供en pulse dir com四個介面,其中com接微...

N76E003編譯陣列記憶體不連續的問題

編譯的時候關閉外部編輯器,不然可能有記憶體共用問題。我使用keil c51編譯n76e003發現陣列記憶體不連續問題,這裡特意記錄下來。編譯情況 乙個16位的陣列,前3個元素是連續的位址,從第4個開始,出現不連續。用指標取陣列每乙個元素的位址能看出來。但是,debug直接把陣列放到watch中能看到...