最近學習了網上的紅外解碼程式儲存學習一下
使用的是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中能看到...