紅外線遙控c語言程序,紅外遙控的C程序

紅外遙控在生產和生活中應用越來越廣泛,不同的紅外遙控芯片有不同的發碼協議,但一般都是由引導碼,系統碼,鍵碼三部分組成.

引導碼是告訴接收機準備接收紅外遙控碼.系統碼是識別碼,不同的遙控芯片有不同的誤別碼,以免搞錯.

遙控器上不同的按鍵有不同的鍵碼,系統碼和鍵碼都是16位碼,8位正碼,8位反碼.如SC6122的系統碼是FF00,FF和00互為反碼,鍵碼1為

EF10也是互為反碼.關于SC6122的資料在我們的網頁資料下載上有.

SC6122的引導碼為低電平為9000微秒,高電平為4500微秒.當然高電平不可能精確為9000微秒,在8000微秒到10000微秒都看作是正常范圍,

低電平在4000-5000之間都看作是正常范圍.

引導碼后的32位編碼(16位系統碼和16位鍵碼)不管高低電平,載波時間都是560微秒,但低電平持續時間是1125微秒,高電平持續時間是2250

微秒,所以低電平除去載波時間大約是560微秒,高電平除去載波時間大約是1680微秒.低電平也有一個波動范圍,在400-700之間都看作是正常

的,具體多少可以通過示波器測量出來.高電平也有一個波動范圍,在400-2000之間都看作是正常的,具體多少也是根據經驗.當然范圍越寬,捕

捉紅外線的范圍也越寬,越精確.在捕捉到有高低電平之間,在560-1680之間取一個中間值1120微秒,認為小于1120微秒是低電平,大于1120微

秒是高電平.

下面有兩個經過實踐能在實驗板上顯示鍵碼的程序,一個是匯編寫的,一個是用C寫的,與大家一起探討遙控器.

以下程序能在LCD上顯示系統碼和鍵碼,按不同的按鍵,系統碼不變,變的是鍵碼.有不懂的地方可以在留言本上留言.

RS EQU P2.5???????????????? ;這幾個是LCD引腳.

RW EQU P2.6

E EQU P2.7

IRR EQU P3.3??????????????? ;紅外接收的輸出接P3.3.

BUF EQU 30H ;30H-33H保存解碼結果

;=============================================

ORG 0000H

AJMP MAIN

;=============================================

ORG 0030H

MAIN:

MOV SP,#70H ;堆棧指針設到70H的地方

ACALL INIT_LCD??????????????????????????????????? ;初始化LCD

MOV R7,#10

ACALL DELAY_MS

MOV DPTR,#MSG1

CALL DISPLAY_LINE1??????????????????????? ;在第一行顯示 Test8: IR Reader

MOV DPTR,#MSG2

CALL DISPLAY_LINE2??????????????????????? ;在第二行顯示www.mcuedu.com

MAIN_LOOP:

JB IRR,$ ;等待接收頭信號為低

ACALL GET_LOW ;測量引導脈沖低電平

CLR C

MOV A,R7

SUBB A,#(8000/50) ;SC6122的引導脈沖低電平為9000US,我們只要測到低電平的值在8000-10000US范圍內就認為合格的.

JC MAIN_LOOP ;如果小于8000US,不對,重新等待接收

CLR C

MOV A,R7

SUBB A,#(10000/50)

JNC MAIN_LOOP

ACALL GET_HIGH ;測量引導脈沖高電平

CLR C

MOV A,R7

SUBB A,#(4000/50)

JC MAIN_LOOP??????????????????? ;如果小于4000US,不對,重新等待接收

CLR C

MOV A,R7

SUBB A,#(5000/50)

JNC MAIN_LOOP??????????????????????? ;如果大于5000US,不對,重新等待接收

MOV R0,#BUF ;

MOV R5,#8 ;SC6122發的碼有32位,我們用4個字節來存放,每個字節有8位

IR_NEXT:

CALL GET_LOW

CLR C

MOV A,R7

SUBB A,#(300/50) ;300US

JC MAIN_LOOP??????????????????????????????? ;低電平小于300微秒認為不對,重新接收

CLR C

MOV A,R7

SUBB A,#(800/50) ;800US

JNC MAIN_LOOP??????????????????????????????? ;低電平大于800微秒認為不對,重新接收

ACALL GET_HIGH

CLR C

MOV A,R7

SUBB A,#(300/50) ;300US

JC MAIN_LOOP??????????????????????????????? ;高電平小于300微秒認為不對,重新接收

CLR C

MOV A,R7

SUBB A,#(2000/50) ;2000US

JNC MAIN_LOOP???????????????????????????????????? ;高電平大于2000微秒認為不對,重新接收

CLR C

MOV A,R7

SUBB A,#(1120/50) ;??????????????????????????? ;跟中間值1120進行比較

RRC A

MOV @R0,A??????????????????????????????????? ;通過CY移到間接地址R0中去

DJNZ R5,IR_NEXT??????????????????????????????????? ;8位移完了嗎

MOV R5,#8

INC R0

MOV A,R0

XRL A,#(BUF+4)

JNZ IR_NEXT ;如果不到4個字節,接收下一個

MOV DPTR,#MSG_6122

ACALL DISPLAY_LINE1 ;顯示格式名稱

ACALL DISPLAY_IR_CODE ;顯示碼

AJMP MAIN_LOOP

;============================================

MSG1: DB " Test8: IR Reader "

MSG2: DB " www.mcuedu.com "

MSG_6122: DB " Format: SC6122 "

;============================================

;轉為ASCII碼在LCD在顯示

TO_ASCII:

CJNE A,#0AH,TO_ASCII_1

TO_ASCII_1:

JC TO_ASCII_2 ;小于10

ADD A,#('A'-10)

RET

TO_ASCII_2:

ADD A,#'0'

RET

;============================================

DISPLAY_IR_CODE:

MOV A,#0C0H ;顯示在第二行

ACALL SEND_COMMAND_BYTE ;設置DDRAM地址

MOV R0,#BUF

DISPLAY_IR_CODE_NEXT:

MOV A,@R0

SWAP A

ANL A,#0FH??????????????????????????? ;分離出高字節

ACALL TO_ASCII??????????????????????????????? ;轉為ASCII碼

ACALL SEND_DATA_BYTE???????????????????????????? ;顯示

MOV A,@R0

ANL A,#0FH??????????????????????????? ;分離出低字節

ACALL TO_ASCII???????????????????????????????? ;轉為ASCII碼

ACALL SEND_DATA_BYTE??????????????????????????? ;顯示

MOV A,#' '

ACALL SEND_DATA_BYTE??????????????????????????????? ;顯示空格

INC R0

MOV A,R0

XRL A,#(BUF+4)

JNZ DISPLAY_IR_CODE_NEXT

MOV R0,#8 ;第2行共有20個字符,前面顯示用了12個,再用8個空格填滿

DISPLAY_IR_CODE_B:

MOV A,#' '

ACALL SEND_DATA_BYTE

DJNZ R0,DISPLAY_IR_CODE_B

RET

;============================================

;測量低電平時間,50US采樣一次,R7加1一次,比如低電平時間為9000US,測得R7的結果為180(0B4H)

;OUTPUT: R7

GET_LOW:

MOV R7,#00H

GET_LOW_NEXT:

MOV R6,#20 ;在晶振為11.0592M時,延50US需要46個機器周期,

DJNZ R6,$ ;這條指令執行需要2個機器周期

JB IRR,GET_LOW_RTN ;接收頭為高電平,結束測量

INC R7

MOV A,R7

JNZ GET_LOW_NEXT ;看R7是否有溢出

GET_LOW_RTN:

RET

;============================================

;測量高電平時間,50US采樣一次,R7加1一次,比如高電平時間為4500US,測得R7的結果為90

;OUTPUT: R7

GET_HIGH:

MOV R7,#00H

GET_HIGH_NEXT:

MOV R6,#20 ;在晶振為11.0592M時,延50US需要46個機器周期,

DJNZ R6,$ ;這條指令執行需要2個機器周期

JNB IRR,GET_HIGH_RTN ;接收頭為低電平,結束測量

INC R7

MOV A,R7

JNZ GET_HIGH_NEXT ;看R7是否有溢出

GET_HIGH_RTN:

RET

;============================================

;============================================

DELAY_MS:

MOV R6,#250

DELAY_MS_NEXT:

NOP

NOP

DJNZ R6,DELAY_MS_NEXT

DJNZ R7,DELAY_MS

RET

;============================================

;INPUT: R7

DELAY:

DJNZ R7,$

RET

;============================================

;向LCD寫一個命令字節

;INPUT: ACC

SEND_COMMAND_BYTE:

CLR RS

CLR RW

MOV P0,A

SETB E

NOP

NOP

NOP

NOP

NOP

NOP

CLR E

MOV R7,#100

ACALL DELAY

RET

;===============================================

;向LCD寫一個數據字節

;INPUT: ACC

SEND_DATA_BYTE:

SETB RS

CLR RW

MOV P0,A

SETB E

NOP

NOP

NOP

NOP

NOP

NOP

CLR E

MOV R7,#100

ACALL DELAY

RET

;======================================================

;初始化LCD

INIT_LCD:

MOV A,#30H

ACALL SEND_COMMAND_BYTE

ACALL SEND_COMMAND_BYTE

ACALL SEND_COMMAND_BYTE

MOV A,#38H ;設置工作方式

ACALL SEND_COMMAND_BYTE

MOV A,#0CH ;顯示狀態設置

ACALL SEND_COMMAND_BYTE

MOV A,#01H ;清屏

ACALL SEND_COMMAND_BYTE

MOV A,#06H ;輸入方式設置

ACALL SEND_COMMAND_BYTE

RET

;=======================================================

;在第一行顯示

;INPUT: DPTR指向要顯示的內容

DISPLAY_LINE1:

MOV A,#080H

DISPLAY_LINE1_A:

ACALL SEND_COMMAND_BYTE ;設置DDRAM地址

MOV R6,#20

DISPLAY_LINE1_NEXT:

CLR A

MOVC A,@A+DPTR

ACALL SEND_DATA_BYTE

INC DPTR

DJNZ R6,DISPLAY_LINE1_NEXT

MOV R7,#100

ACALL DELAY

RET

;=======================================================

;在第二行顯示

;INPUT: DPTR指向要顯示的內容

DISPLAY_LINE2:

MOV A,#0C0H

AJMP DISPLAY_LINE1_A

;=======================================================

END

下面是一個用C寫的遙控器程序.能在數碼管上顯示鍵碼.

#include

#define c(x) (x*110592/120000)

sbit Ir_Pin=P3^3;

unsigned char code Led_Tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,

0xf8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};??????????????????????? //共陽極數碼顯示碼0-F.

unsigned char code Led_Sel[]={0xe,0xd,0xb,0x7};

unsigned char Led_Buf[4]; //顯示緩沖區

char Led_Index;?????????????????? //位選

unsigned char Ir_Buf[4]; //用于保存解碼結果

//==============================================================

//數碼管掃描

timer0() interrupt 1 using 1

{

TL0=65536-1000;

TH0=(65536-1000)/256; //定時器0設定約1000us中斷一次,用于數碼管掃描

P0=0xff;

P2=Led_Sel[Led_Index];??????????????????????????? //位選

P0=Led_Tab[Led_Buf[Led_Index]];??????????????????? //段選

if(++Led_Index>3) Led_Index=0;??????????????????? //四個掃描完了,到第一個數碼管

}

//==============================================================

unsigned int Ir_Get_Low()

{

TL1=0;

TH1=0;

TR1=1;

while(!Ir_Pin && (TH1&0x80)==0);

TR1=0;

return TH1*256+TL1;

}

//=============================================================

unsigned int Ir_Get_High()

{

TL1=0;

TH1=0;

TR1=1;

while(Ir_Pin && (TH1&0x80)==0);

TR1=0;

return TH1*256+TL1;

}

//==============================================================

main()

{

unsigned int temp;

char i,j;

Led_Index=1;

TMOD=0x11;

TL0=65536-1000;

TH0=(65536-1000)/256; //定時器0設定約1000us中斷一次,用于數碼管掃描

EA=1;

ET0=1;

TR0=1;

Led_Buf[0]=0;

Led_Buf[1]=0;

Led_Buf[2]=0;

Led_Buf[3]=0; //顯示區設成0

do{

restart:

while(Ir_Pin);

temp=Ir_Get_Low();

if(tempc(9500)) continue;//引導脈沖低電平9000

temp=Ir_Get_High();

if(tempc(5000)) continue;//引導脈沖高電平4500

for(i=0;i<4;i++) //4個字節

for(j=0;j<8;j++) //每個字節8位

{

temp=Ir_Get_Low();

if(tempc(800)) goto restart;

temp=Ir_Get_High();

if(tempc(2000)) goto restart;

Ir_Buf[i]>>=1;

if(temp>c(1120)) Ir_Buf[i]|=0x80;

}

Led_Buf[0]=Ir_Buf[2]&0xf;

Led_Buf[1]=(Ir_Buf[2]/16)&0xf;

Led_Buf[2]=Ir_Buf[3]&0xf;

Led_Buf[3]=(Ir_Buf[3]/16)&0xf; //顯示結果

}while(1);

}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/371527.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/371527.shtml
英文地址,請注明出處:http://en.pswp.cn/news/371527.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Retrofit2 完全解析 探索與okhttp之間的關系

轉載請標明出處&#xff1a; http://blog.csdn.net/lmj623565791/article/details/51304204&#xff1b; 本文出自:【張鴻洋的博客】 之前寫了個okhttputils的工具類&#xff0c;然后有很多同學詢問這個工具類和retrofit什么區別&#xff0c;于是上了下官網&#xff0c;發現其底…

不變性真的意味著線程安全嗎?

我經常閱讀有關“如果對象是不可變的&#xff0c;則它是線程安全的”的文章。 實際上&#xff0c;我從未找到過一篇讓我相信不變的意味著線程安全的文章。 即使是Brian Goetz的Java Concurrency in Practice一書中關于不變性的一本書也沒有完全令我滿意。 在這本書中&#xff0…

c語言設計 數組的知識點,C語言程序設計知識點及示例.pdf

C語言程序設計知識點及示例四川大學錦江學院C語言程序設計知識點及示例知識點1&#xff1a;除了復合語句而外&#xff0c;C語言的語句都以分號結束。示例1&#xff1a;C語言的簡單語句 (非復合語句語句)必須以 結束。參考答案&#xff1a;分號知識點2&#xff1a;目標程序和可執…

移動端知識匯總

參見地址: https://github.com/jtyjty99999/mobileTech 轉載于:https://www.cnblogs.com/duanyue/p/7337789.html

在移動端設置overflow:hidden禁止滾動的解決方法

如果你是將overflow:hidden用在了body上那么不管用&#xff0c;因為移動端是基于touch事件。 兩種解決方法&#xff1a; 1、為html和body同時設置height:100%;overflow:hidden; html, body{height:100%;overflow:hidden; }2、使用touchmove $(document).on(touchmove,function …

單元測試線程代碼的5個技巧

這是一些技巧&#xff0c;說明如何進行代碼的邏輯正確性測試&#xff08;與多線程正確性相對&#xff09;。 我發現本質上有兩種帶有線程代碼的刻板印象模式&#xff1a; 面向任務–許多短期運行的同類任務&#xff0c;通常在Java 5執行程序框架內運行&#xff0c; 面向流程–…

jsp2

D:\Software\Tomcat7\work\Catalina\localhost 是緩存目錄&#xff0c;可以刪掉隱藏域&#xff1a;頁面表單中的一個元素&#xff0c;跟文本框一樣&#xff0c;但是用戶看不到1.建立test1--form表單需要它&#xff0c;而不需要用戶看到&#xff0c;用隱藏域<body><%re…

MongoDB MapReduce 的示例。

// JavaScript source code db.runCommand({mapreduce: "page",map: function Map() {emit(this.title, // how to group{ name: this.name } // associated data point (document));},reduce: function Reduce(key, values) {//reduce用來處理group出來是多條數…

c語言長空格的代碼是什么,c語言中表示空格的是什么代碼?

分析如下&#xff1a;不是所有字符都需要轉義的&#xff0c;空格直接就敲空格&#xff0c;或者使用ASCII碼值賦值為32。空格沒有轉義字符。合法轉義字符如下&#xff1a;\a 響鈴(BEL) 、\b 退格(BS)、\f 換頁(FF)、\n 換行(LF)、\r 回車(CR)、\t 水平制表(HT)、\v 垂直制表(VT)…

使用NoSQL實現實體服務–第1部分:概述

在過去的幾周中&#xff0c;我一直在進行一些研發工作&#xff0c;以了解使用NoSQL數據庫實現實體服務 &#xff08;也稱為數據服務&#xff09;的優勢。 實體服務是托馬斯埃爾&#xff08;Thomas Erl&#xff09;的《服務技術》叢書中提出的服務分類。 它用于描述高度不可知和…

IO注意事項

read()方法返回值為什么是int? 因為字節輸入流可以操作任意類型的文件,比如圖片音頻等,這些文件底層都是以二進制形式的存儲的,如果每次讀取都返回byte,有可能在讀到中間的時候遇到111111111,那么這11111111是byte類型的-1,我們的程序是遇到-1就會停止不讀了,后面的數據就讀不…

c語言用星號輸出沙漏,《算法筆記》學習日記——3.3 圖形輸出

3.3 圖形輸出問題 A: 輸出梯形題目描述輸入一個高度h&#xff0c;輸出一個高為h&#xff0c;上底邊為h的梯形。輸入一個整數h(1<h<1000)。輸出h所對應的梯形。樣例輸入web5樣例輸出數組*********************************************思路這一類的題目都比較簡單&#xf…

JavaOne 2012:101種改進Java的方法-開發人員參與為何如此重要

Bruno Souza &#xff0c; Martijn Verburg和Heather Vancura在希爾頓酒店的大陸宴會廳4中展示了“ 101種改進Java的方法&#xff1a;開發人員參與為何如此重要”。 他們將其分為自己最熟悉的領域。 SouJava的創始人兼協調員 Souza談到了通過用戶組的更大參與。 Verberg也在倫敦…

Java組合實體模式~

組合實體模式用于EJB持久化機制。 組合實體是表示對象圖的EJB實體bean。 當組合實體更新時&#xff0c;內部依賴對象bean將自動更新為由EJB實體bean管理。 以下是組合實體Bean的參與者。 組合實體 - 它是主要的實體bean。 它可以是粗粒度的或可以包含用于持久性目的的粗粒度對象…

python中的一些小知識

在最近學習python中遇到的一些小問題匯總一下&#xff1a; 1.在windows7下安裝python3.5版本時提示安裝不了&#xff0c;缺少ServicePack1. 解決辦法是&#xff0c;打開控制面板\系統和安全\Windows Update&#xff0c;下載和更新計算機安裝&#xff0c;然后卸載以前的python版…

在Java中衡量執行時間– Spring StopWatch示例

有兩種方法可以通過使用System.currentTimeinMillis&#xff08;&#xff09;或通過使用System.nanoTime&#xff08;&#xff09; 來測量Java中經過的執行時間 。 這兩個方法可用于測量 Java中兩個方法調用或事件之間的經過時間或執行時間 。 計算經過的時間是Java程序員要做的…

c語言getch在哪個頭文件,用getch()需要頭文件嗎?

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓#include #include #include "string.h"#includeusing namespace std;struct student{ int num;char name[10];char banji[10];float score[3];struct student *next;};struct student *creat(){struct student *head,*p…

My solution for Git Client Error: Permission denied (publickey)

在使用Git客戶端的過程中遇到的問題以及解決方案分享。 我之前已經安裝Git客戶端并且使用Git開發過公司項目&#xff0c;也已經正確生成PublicKey并且添加到SSH keys on github of my account&#xff0c;但是當我想從github上克隆另一個客戶端push的代碼的時候一直報錯&#x…

OutOfMemoryError:無法創建新的本機線程–問題神秘化

正如您從我以前的教程和案例研究中可能已經看到的那樣&#xff0c;要確定和解決Java Heap Space OutOfMemoryError問題可能很復雜。 我從Java EE生產系統中觀察到的常見問題之一是OutOfMemoryError&#xff1a;無法創建新的本機線程&#xff1b; HotSpot JVM無法進一步創建新的…

求10以內平均數的c語言,求助 給小學生出題,自己選加減乘除 做10題 10以內的數 然后統計分...

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓#include #include #include void Menu(void){printf("1,加法 2,減法 3,乘法 4,除法 5,退出\n");printf("請選擇題目類型:");}int Plus(void){int a, b;a rand() % 10 1;b rand() % 10 1;printf("%-2…