無需復雜的電路,使用8個數碼管既可顯示出紅外遙控的編碼,電路簡單,代碼少,適合新手玩,不知道論壇有沒有人發過,新人新帖
單片機源程序如下:
- /***************************************************************************
- 標題: 紅外遙控解碼器數碼管顯示 使用12mhz晶振
- 管腳:P33紅外接收數據,P0口數碼管數據口,P10數碼管千位,P11數碼管百位,P12數碼管十位,P13數碼管個位
- 效果: 運行程序,按遙控器按鍵,在數碼管上顯示相應的地址碼-控制碼(以16進制顯示)
- 分兩段,前段是地址碼,后段為控制碼,用點隔開,顯示兩字節,忽略反碼,使用共陰數碼管
- ******************************************************************************/
- #include <reg51.h>
- sbit SMG_0 = P1^0; //定義數碼管(千萬位)
- sbit SMG_1 = P1^1; //定義數碼管(百萬位)
- sbit SMG_2 = P1^2; //定義數碼管(十萬位)
- sbit SMG_3 = P1^3; //定義數碼管(萬位)
- sbit SMG_4 = P1^4; //定義數碼管(千位)
- sbit SMG_5 = P1^5; //定義數碼管(百位)
- sbit SMG_6 = P1^6; //定義數碼管(十位)
- sbit SMG_7 = P1^7; //定義數碼管(個位)
- /********數據定義*************************************************************/
- sbit hwx=P3^3; //紅外接收數據引腳,
- code unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //數碼管段值表 0-9 a-f
- unsigned char ly_disdate[8]={0,0,0,0,0,0,0,0}; //顯示緩沖
- unsigned char ly_lhj[4]; //保存NEC的四個字節數據
- unsigned char ly_ct=0; //計數時間
- bit ly_flag=1; //成功接收標志
- //函數聲明:
- void display();//定義顯示函數,直接顯示緩沖區數值
- void delay(void);
- void delay100us(void);
- /***********外中斷1入口函數,P33引腳,紅外線接收IC數據腳**************************/
- void hongwai(void) interrupt 2
- {
- unsigned char i,ia;
- /**************開始判斷是否為NEC波形引導碼的前9MS和后4.5MS******************************/
- ly_ct=0; //計數時間清0
- while(!hwx) //hwx紅外管腳
- delay100us(); //調用0.1MS延時計數,ly_ct每調用一次加1
- if(ly_ct<80||ly_ct>100) //NEC引導碼前9MS,ly_ct約等于90,給個誤差值,用80-100之間來判斷
- return;
- ly_ct=0; //計數時間請0
- while(hwx)
- {
- delay100us();
- if(ly_ct>50) //NEC引導碼引導碼的后4.5MS,ly_ct約45
- return;
- }
-
- if(ly_ct<40) //NEC引導碼引導碼的后4。5MS,ly_ct約45
- return;
- /***********開始接收四個字節內容**************************************/
- for(i=0;i<4;i++)
- {
-
- for(ia=0;ia<8;ia++)
- {
- while(!hwx); //低電平開始,不處理只等待高電平接收
- ly_ct=0;
- while(hwx) //高電平開始,
- {
-
- delay100us();
- if(ly_ct>20)
- return;
- }
- //高電平結束,判斷數據1或0向變量移入
- ly_lhj[i]>>=1; //數據由高位移入低位
- if(ly_ct>10) //時間量TH1高于10,即高于1MS判斷為1
- ly_lhj[i]|=0x80;
- }
- }
- ly_flag=1; //接收成功
- TF1=0;
- }
- //顯示函數,參數為顯示內容,只顯示兩位數
- void display()
- {
- SMG_0=0; //選擇千萬位數碼管
- P0=table[ly_disdate[0]]; //
- delay(); //
- P0=0XFF; //
- SMG_0=1; //
- SMG_1=0; //選擇百萬位數碼管SMG_b
- P0=table[ly_disdate[1]]|0x80; //加上小數點
- delay(); //延時
- P0=0XFF; //
- SMG_1=1; //
- SMG_2=0; //選擇十位數碼管
- P0=table[ly_disdate[2]]; //
- delay(); //
- P0=0XFF; //
- SMG_2=1; //
- SMG_3=0; //選擇個位數碼管
- P0=table[ly_disdate[3]]|0x80; //加上小數點; //
- delay(); //
- P0=0XFF; //
- SMG_3=1; //
-
- SMG_4=0; //選擇千萬位數碼管
- P0=table[ly_disdate[4]]; //
- delay(); //
- P0=0XFF; //
- SMG_4=1; //
- SMG_5=0; //選擇百萬位數碼管SMG_b
- P0=table[ly_disdate[5]]|0x80; //加上小數點
- delay(); //延時
- P0=0XFF; //
- SMG_5=1; //
- SMG_6=0; //選擇十位數碼管
- P0=table[ly_disdate[6]]; //
- delay(); //
- P0=0XFF; //
- SMG_6=1; //
- SMG_7=0; //選擇個位數碼管
- P0=table[ly_disdate[7]]; //加上小數點
- delay(); //
- P0=0XFF; //
- SMG_7=1; //
- }
- //延時子函數,短暫延時
- void delay(void)
- {
- unsigned char i=10;
- while(i--);
- }
- void delay100us(void)
- {
- unsigned char i=15;
- while(i--);
- ly_ct++;
- }
- void main(void)
- {
- EA=1; //首先開啟總中斷
- EX1=1; //開啟外部中斷1,紅外接收數據引腳
- IT1=1; //設置成下降沿觸發方式
- while(1)
- {
- if(ly_flag)
- { //接收成功處理顯示緩沖,以16進制顯示
- ly_flag=0;
- ly_disdate[0]=ly_lhj[0]/16;
- ly_disdate[1]=ly_lhj[0]%16;
- ly_disdate[2]=ly_lhj[1]/16;
- ly_disdate[3]=ly_lhj[1]%16;
- ly_disdate[4]=ly_lhj[2]/16;
- ly_disdate[5]=ly_lhj[2]%16;
- ly_disdate[6]=ly_lhj[3]/16;
- ly_disdate[7]=ly_lhj[3]%16;
- }
- display();//顯示緩沖內容
- }
- }
復制代碼
所有資料51hei提供下載:
紅外遙控解碼8數碼管顯示.zip
(36.27 KB, 下載次數: 30)
2019-4-13 02:30 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|