紅外解碼數碼管顯示+串口接收

2021-01-16 電子產品世界

#include

本文引用地址:http://www.eepw.com.cn/article/201611/315934.htm

//***********************************************************
// TC9012 紅外遙控接收數碼管顯示+串口接收成功! *
//***********************************************************
#define uchar unsigned char //定義一下方便使用
#define uint unsigned int
//unsigned char code dgw[] = {0xfe,0xfd,0xfb,0xf7};//數碼管控制
unsigned char scan[4]={0xf7,0xfb,0xfd,0xfe};//p1位選擇
unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
unsigned char code led_tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char disbuf[4];//數碼管顯示緩衝
uchar irdate[33];
char DAT[4]={0};

uchar temp,keynum,ledstop=8,irtime;
uchar startfleg,bitnum,irallok;
uchar irok;
uchar ircode[4];
uchar jia,flog;

void delay(unsigned char x) ;//x*0.14MS
//sbit sm = P1^0;
sbit BEEP = P3^7 ; //聲音輸出接口


/*
紅外接收,並識別遙控上的數字 P3.7聲音輸出接口
P0數碼管段選 P1數碼管位選 P3.2紅外輸入端

*/

void delay1ms(int n) //誤差 0us
{
unsigned char a,b;
int m;
for(m=0;m {
for(b=9;b>0;b--)
for(a=1;a>0;a--);
}

}


void DELAY_MS (unsigned int a)//延時程序
{
unsigned int i;
while( --a != 0)
{
for(i = 0; i < 125; i++);
}
}

////////////////////////
//簡化顯示函數
void disp(int x)
{
int i,temp = 0x01;
DAT[0]=x/1000;
DAT[1]=x/100%10;
DAT[2]=x/10%10;
DAT[3]=x%10;
for(i=0;i<4;i++)
{
P1 = ~temp;
P0 = tab[DAT[i]];
DELAY_MS(4);
temp = temp<<1; //左移位
}

}

void irwork() // disbuf[0]=(((KeyValue&0xf0)>>4)&0x0f);//機器碼,取高4位
{
// 16進位顯示(鍵值)
disbuf[0] = (((ircode[1]&0xf0)>>4)&0x0f);
disbuf[1] = ircode[1]&0x0f;

disbuf[2] = (((ircode[2]&0xf0)>>4)&0x0f);
disbuf[3] = ircode[2]&0x0f;

//以下是十進位顯示(鍵碼)
//disbuf[0] = ircode[2]; //通過緩衝得到數值
//disbuf[1] = ircode[3];


}


void LedDisp()//鍵值顯示
{
unsigned char i;
for(i=0;i<4;i++)
{
P0=tab[disbuf[i]];
P1 = scan[i];
DELAY_MS(5);
P1=0xff;
}
}

void irtimeA() //中斷初始化
{
TMOD = 0X22;//設定時器0並用工作方式2
TH0 = 0;//高位賦初值
TL0 = 0;//低位賦初值 //使定時器256us中斷一次
EA = 1;//開啟總中斷開關
ET0 = 1;//啟動定時中斷
TR0 = 1;//開啟定時器
EX0 = 1;//打開外部中斷
IT0 = 1;//選擇外部中斷方式1

TH1 = 0XF3;//定時器初值高8位設置
TL1 = 0XF3;//定時器初值低8位設置
TR1 = 1;//啟動定時器
SM0 = 0;
SM1 = 1;//設置串口工作方式
REN = 1;//使串口接收使能
//EA = 1;//打開總中斷開關
ES = 1;//打開串口中斷
PCON = 0x80;//波特率倍頻(屏蔽本句波特率為2400)
//IP = 0x10;
}

void beep()
{
unsigned char i ;
for (i=0 ;i<100 ;i++)
{
delay1ms(10);
BEEP=!BEEP;
}
BEEP=1 ;
}

void irpros(void) //對接收到的數據處理
{
uchar k,value, i,j;
k=1;
for(j=0;j<4;j++)
{
for(i=0;i<8;i++) //循環8次得到一段8位的碼
{
value = value>>1;
if(irdate[k]>6) //判斷有幾個irtime=255us 大於6個是1
{
value = value | 0x80;

}
k++;
}
ircode[j] = value; //將一段8位的碼存入數組中
}

irallok = 1;

}


main()
{
//uchar wx=0x01,js;
irtimeA();

while(1)
{
if(irok==1)
{
irpros();
irok = 0;
}
if(irallok==1)
{
irwork();
//ircal();
irallok = 0;
beep();

ES = 0;//關閉串口中斷

///////////////////解碼完畢串口接收顯示///
flog = 0;
SBUF = ircode[0]; //單片機向pc發送數據////
while(!TI);//等待數據發送完畢 ////
TI = 0; //發送標誌位置0 ////
ES = 1;//打開串口中斷 ////
//DELAY_MS(5);
//////////////////////////////////////////
flog = 0;
SBUF = ircode[1]; //單片機向pc發送數據////
while(!TI);//等待數據發送完畢 ////
TI = 0; //發送標誌位置0 ////
ES = 1;//打開串口中斷 ////
//DELAY_MS(5);
//////////////////////////////////////////
flog = 0;
SBUF = ircode[2]; //單片機向pc發送數據////
while(!TI);//等待數據發送完畢 ////
TI = 0; //發送標誌位置0 ////
ES = 1;//打開串口中斷 ////
//DELAY_MS(5);
//////////////////////////////////////////
flog = 0;
SBUF = ircode[3]; //單片機向pc發送數據////
while(!TI);//等待數據發送完畢 ////
TI = 0; //發送標誌位置0 ////
ES = 1;//打開串口中斷 ////
//////////////////////////////////////////發送完畢標誌位
flog = 0;
SBUF =0x64; //單片機向pc發送數據////
while(!TI);//等待數據發送完畢 ////
TI = 0; //發送標誌位置0 ////
ES = 1;//打開串口中斷 ////
//////////////////////////////////////////

}
LedDisp();
//disp(shiyan);
//disp(disbuf[1]);
//ledshine();
//ledshines();
}
}

void timer0() interrupt 1 //定時器0中斷
{
irtime++;
}
void inter0() interrupt 0 //外部中斷
{

if(startfleg)
{
if(irtime>32) //判斷引導碼是否發送完畢
{
bitnum = 0;

}
irdate[bitnum] = irtime; //接收數據並把數據存入數組
irtime = 0;
bitnum++;
if(bitnum==33)
{
bitnum = 0;
irok = 1;

}
}
else
{
startfleg = 1; //是否接收到數據標誌位
irtime = 0;

}

//serial() interrupt 4;
}


void serial() interrupt 4 //串口中斷函數
{
//a = SBUF;

RI = 0; //中斷接收標誌位置0
flog = 1;


}

相關焦點

  • 詳細解讀紅外遙控解碼
    紅外遙控就是以紅外線為傳輸介質的遙控。 紅外遙控器是怎麼工作的?其實它內部就是有一個單片機,單片機的I/O口控制一個紅外LED燈(當然一般會加外部放大電路以增大傳輸距離),在內部編碼後發送出去,然後電視或者空調之類的可以用紅外遙控控制的電器在接收到紅外信號後就會進行解碼,並根據制定好的協議執行特定動作,比如電視可能換臺、調節音量等。
  • RS232串口轉紅外通訊電路原理剖析
    特別是在電子電力行業,使用紅外技術進行通訊的產品越來越多,人們可以利用紅外技術對產品進行短距離抄控,非常簡潔方便。串口是計算機上一種非常通用設備通信的協議,大多數計算機包含一個基於RS232的串口。串口通信的概念非常簡單,串口按位(bit)發送和接收字節。本文所講的通信使用3根線完成:地線;發送;接收。由於串口通信是異步的,埠能夠在一根線上發送數據同時在另一根線上接收數據。
  • 紅外通信原理
    為了減少幹擾,採用的是價格便宜性能可靠的一體化紅外接收頭(HS0038, 它接收紅外信號頻率為38kHz,周期約26μs) 接收紅外信號,它同時對信號進行放大、檢波、整形得到TTL 電平的編碼信號,再送給單片機,經單片機解碼並執行去控制相關對象。如圖1 所示:
  • 參考:日曆及時鐘顯示接口電路 & 單片機紅外通訊原理電路圖
    1) 日曆及時鐘顯示接口電路 在電子血壓計中的應用   如圖所示,由EEPROM24C256和日曆時鐘晶片
  • 控制器用紅外接收頭的失效分析與研究
    發射系統對紅外輻射源進行調製後發射紅外信號,而接收系統用光學裝置和紅外探測器進行接收。紅外接收頭一般是接收、放大、解調一體頭,紅外信號經接收頭解調後,數據0和1的區別通常體現在高、低電平的時間長短或信號周期上,晶片解碼時,重點是找到數據0與1間的波形差別,晶片裡需要相應的讀取程序。
  • 億光電子紅外發射管接收頭在智能音箱上面的應用
    其中使用億光EVERLIGHT紅外發射管與接收頭,下面我們詳細了解下!小愛音箱萬能遙控版拆解我們首先取下音箱底部四角的防滑膠墊。外罩半透明,利於紅外線的接收、發射。這是音箱的紅外線發射管。左上角的是紅外接收器,右下角的是紅外發射管,用於接收反饋遙控器信息。
  • #51單片機#8位數碼管(74HC595晶片)的使用方法
    數碼管基本屬性:1.採用2片595驅動數碼管,需要單片機3路IO口,根據數碼管動態掃描原理進行顯示;2.寬工作電壓3.3V到5V;3.PCB板尺寸:71mm*22mm
  • 基於紅外遙控的arduino遙控小車
    我們只需要記錄下來每個按鍵對應的碼值,然後就可以像按鍵那樣寫程序啦,就是if(串口接收到是) 那麼.那麼如何測出每個按鍵的碼值呢?我們先來連接線路吧一、接線:(1)紅外遙控接線:(irReceiverPin); // 設置irReceiverPin定義的埠為紅外信號接收埠decode_results results; // 定義results變量為紅外結果存放位置void rev(void); void scan(void); //---// void setup(){ Serial.begin(9600); //9600(PC端使用) motor_pinint
  • Stm32RS485串口通信——中斷接收發送數據
    ; //CS_485GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推輓輸出GPIO_Init(GPIOE, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //管腳
  • 紅外遙控功能的實現
    目錄:涉及知識點一體化紅外接收頭VS1838B簡介應用場景
  • 8段數碼管引腳圖,8段數碼管動態顯示詳解
    打開APP 8段數碼管引腳圖,8段數碼管動態顯示詳解 發表於 2016-09-13 18:12:25   數碼管也稱LED數碼管
  • 詳細解析:紅外遙控編碼與解碼
    一般而言,一個通用的紅外遙控系統由發射和接收兩大部分組成,如圖1 所示: 其中發射部分主要包括鍵盤矩陣、編碼調製、紅外發射管;接收部分包括光、電信號的轉換以及放大、解調、解碼電路。
  • 紅外遙控發射與接收電路
    目前,人們的物質文化生活水平日益提高,各種各樣的家用電器走進了千家萬戶,其中,大多數的家用電器都紅外遙控作為人機互動的輸入信號。在空調的應用中主要是用了紅外遙控技術(部分有用射頻遙控),部分就紅外遙控器的原理與常見故障作詳細的剖析,希望能給大家帶來一些幫助。
  • labview串口被動接收數據
    一、電機轉數在機械廠成功獲取電機轉數,在串口接線時,把VCC、RXD、TXD、GND四根線都接上,其中VCC-8,GND-9,RXD-10,TXD-11。
  • UART IDLE 中斷使用-接收不定長串口數據
    不定長數據接收本次製作的工程是基於HAL庫。使用STM32CubeMX生成實驗工程工程的配置如下圖:1.系統始終配置為100MHz2.配置USART2為Asynchrones,管腳配置為PA2,PA3。
  • 基於DS1302+AT89C2051製作的紅外遙控LED電子鐘
    IC3為三腳的塑封一體化紅外接收頭。LED1-4 為高亮度共陽數碼管。89C2051所用的晶振Y1如果沒有10MHz也可以用其他12M以內的代替, 只要修改程序中YS1和YS2的延時參數,讓其保持延時長度不變就行。調整R2可以改變數碼管 亮度。P1口接數碼管的八欄位。數碼管左兩位顯示小時,右兩位顯示分,當顯示的是鬧鈴時 間時閃動。
  • 億光紅外發射管IR928-6C參數特徵及配對接收管
    IR928-6C是臺灣everlight億光電子生產的平頭紅外線發射管是一款高強度的二極體,塑造一個水透明塑膠包裝。微型一邊--面對裝置有晶片,從側面能發出紅外光。 配對紅外接收管型號及應用 IR928-6與PT928-6C配對,運用在滑鼠,光電開關,紅外應用系統
  • 簡單紅外線解碼
    :IRsend發送IR遠程數據包,而IRrecv接收和解碼IR消息。紅外檢測器經過特殊過濾以防紅外線,它們不擅長檢測可見光。另一方面,光電管擅長檢測黃/綠可見光,而不擅長紅外光紅外檢測器內部有一個解調器,用於尋找38 KHz的調製IR。只是無法檢測到紅外LED發光,它必須以38KHz的PWM頻率閃爍。
  • 正點原子開拓者FPGA開發板資料連載第十一章 靜態數碼管顯示實驗
    以共陽極數碼管為例,當我們想讓數碼管顯示數字「8」,可以給a、b、c…g七個引腳送低電平,數碼管就顯示「8」,顯示數字「1」,就給b、c引腳低電平,其餘引腳(除公共端)給高電平,數碼管就顯示「1」。對於靜態顯示還有一種是數碼管的每一個碼段都由一個單獨的I/O埠進行驅動,其優點是編程較為簡單,顯示亮度較高;缺點是佔用I/O較多,當數碼管較多時,必須增加解碼驅動器進行驅動,或使用串口轉並口晶片來拓展埠。