久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

紅外解碼程序(用1602顯示碼值)

作者:我行天下   來源:本站原創   點擊數:  更新時間:2014年03月31日   【字體:

#include<reg52.h> 
#define uchar unsigned char
#define uint unsigned int
sbit beep=P1^7;
bit startflag;  //定義一個掃描開始標志位
bit irreceok;//紅外接收OK標志位
bit irprosok;//紅外接收處理OK標志位
uchar irdata[33];//定義一個存放編碼的數組。引導碼1位,客戶碼8位,客戶反碼8位,數據碼8位,數據反碼8位 ,共33位
uchar bitnum;//接收到的第幾位數據的標志位
uchar irtime;//定義紅外掃描時間
uchar ircode[4];//為四個碼值定義一個數組存放,把四位碼分開
uchar disp[8];//四組數據,每組拆成高四位和低四位,共八個元素
/**************1602部分******************/
sbit lcden=P1^2;
sbit lcdrs=P1^0;
sbit lcdrw=P1^1;
/*char code Tab[]={'0','1','2','3','4','5','6','7','8',
'9','A','B','C','D','E','F'};*/
char code Tab[]="0123456789abcdef";
void delay(uint z) //延時子程序
{
  uint x,y;
  for(x=z;x>0;x--)
     for(y=220;y>0;y--);
}

void write_com(uchar com)//定義一個帶參數的寫命令子程序
{
 lcdrs=0; //1602的rs為0時,接收命令,為1時接收數據
 P0=com;//把void write_com(uchar com)中的COM中的數據給P0口
 delay(2);
 lcden=1;
 delay(2);
 lcden=0;
 delay(2);
}

void init_1602()//定義一個初始化子程序
{
 lcden=0;
 lcdrw=0;
 write_com(0x38);//調用 write_com子程序并把0x38賦給P0口,顯示模式打開
 write_com(0x0f);//調用 write_com子程序并把“開顯示,顯示光標,光標閃爍”指令碼賦給P0口
 write_com(0x06);//調用 write_com子程序并把“地址指針加1,整屏不移動”指令碼賦給P0口
 //write_com(0x80+0x10);//數據指針初始化,讓指針指向可顯示的最右端
 write_com(0x80);//數據指針初始化,讓指針指向最左端,顯示從第一行開始
 write_com(0x01);//調用 write_com子程序并把"清零指"令碼賦給P0口
 }
 
void write_dat(uchar dat)//定義一個帶參數的寫數據子程序
{
 lcdrs=1; //1602的rs為0時,接收命令,為1時接收數據
 P0=dat;//把void write_shu(uchar shu)中的COM中的數據給P0口
 delay(2);
 lcden=1;
 delay(2);
 lcden=0;
 delay(2);
}
 
void delayms(uint t)
{
 uint i,j;
 for(i=t;i>0;i--)
  for(j=110;j>0;j--);
}
void timer0init()//定時器O初始化
{
 TMOD=0x02;//定時器設成方式2,因為方式2可以自動重裝初值
 TH0=0x00;//高位設為O
 TL0=0x00;//低位設為O
 ET0=1; //中斷打開
 EA=1;//總中斷打開
 TR0=1;//定時器打開
}

void int0init()//外部中斷O初始化,按P3。2
{
 IT0=1;//設為下降沿觸發方式。IT0=0為低電平觸發。因為紅外輸入高時,接收為低,要從低開始計時
 EX0=1;//外部中斷打開
 EA=1;//總中斷打開
}

void irpros()//紅外提取處理程序
{
  uchar i,k,j,irvalue;
  k=1;//第一k=0是引導碼,不須要。所以從K=1開始提取編碼,把K=0的引導碼去掉
 for(j=0;j<4;j++)//共有四個碼,所以循環四次
   {
     for(i=0;i<8;i++)//每個碼八位,循環八次
    {
     irvalue=irvalue>>1;//irvalue低位在前,高位在后,所以右移,判斷8次,右移7次
   if(irdata[k]>6)//如果兩個中斷的時間為1.125MS,說明傳的是0,1.125/0.255=4.4個irtime,
   //如果兩個中斷的時間為1.125MS,說明傳的是1,2.25/0.255=8.8個irtime,
   //我取中斷值6;如果irdata大于6,說明是1,小于6說明是0;
    {
     irvalue=irvalue|0x80;
    }
    k++;//每提一次,K自增一次,一共要33次
  }
  ircode[j]=irvalue;
   }
  irprosok=1;
  beep=0;
  delay(3);
  beep=1;
}
void irwork()
{
 disp[0]=ircode[0]/16;//取高四位
 disp[1]=ircode[0]%16;//取低四位
 disp[2]=ircode[1]/16;//取高四位
 disp[3]=ircode[1]%16;//取低四位
 disp[4]=ircode[2]/16;//取高四位
 disp[5]=ircode[2]%16;//取低四位
 disp[6]=ircode[3]/16;//取高四位
 disp[7]=ircode[3]%16;//取低四位
}
void display()
{
 write_com(0x80);
 write_dat(Tab[disp[0]]);
 write_dat(Tab[disp[1]]);
 write_dat(Tab[disp[2]]);
 write_dat(Tab[disp[3]]);
 write_dat(Tab[disp[4]]);
 write_dat(Tab[disp[5]]);
 write_dat(Tab[disp[6]]);
 write_dat(Tab[disp[7]]);
}
void main()
{
 init_1602();
 timer0init();
 int0init();
   while(1)
     {
  if(irreceok)//判斷接收是否OK
     {
   irpros();//接收OK就要處理.把數據從irdata中提出來
         irreceok=0;//要把irreceok清0,為下一次接收做準備
  }
  if(irprosok)
     {
   irwork();//如果處理OK,把數據分離,可以去顯示
   irprosok=0;//要把irprosok清0,為下一次處理做準備
  }
    display();//顯示函數還沒寫,有待完善
  
  }
 
}

void timer0() interrupt 1//定時器0中斷函數
{
irtime++;/*irtime為字符型,最大為255,輸入開始時讀一次irtime
然后清0,結束再讀一次,irtime乘以255就是一次掃描定時的時間*/
}
void int0() interrupt 0//外部中斷0函數,這是關鍵
{
 if(startflag)//如果startflag=1就開始接數據
  {
     if(irtime>30) //接收引導碼,引導碼有9MS,9/0.256=33.15,在這就取32即可
                //說明這時檢測到了引導碼
  {
    bitnum=0;//收到引導碼后,bitnum清O準備裝數據
  }
  irdata[bitnum]=irtime;//第1個bitnum=0的數據被裝入數組。
  irtime=0;//清0就不會對下次有影響
     bitnum++; //不停地給數組加入新數據
 
   if(bitnum==33)//如果bitmun=33,說明一幀數據傳完
    {
     bitnum=0;//bitnum清0為接收下一幀做準備
     irreceok=1;//主函數只要判斷irreceok是否為1做出后面的決定
    }
     
  }
else //
    {
  startflag=1;
  irtime=0;
 }
}

關閉窗口

相關文章

主站蜘蛛池模板: 天天操天天操 | 亚洲欧美日韩在线 | 免费久草 | 国产国产精品 | 国产最新精品视频 | 亚洲免费视频一区 | 久久成人午夜 | 亚洲91av| 国产精品久久久久久久久久久久久 | 久久久久国产一区二区三区 | 日本久久一区 | 免费精品| 国偷自产av一区二区三区 | av中文字幕在线 | 亚洲精品在线播放 | 国产精品久久久久久久久久三级 | 亚洲 欧美 另类 综合 偷拍 | 日韩欧美视频在线 | 欧美精品欧美精品系列 | 国产男女精品 | 久久中文一区二区 | 国产一区二区三区 | 久久久久亚洲精品 | 99精品久久久国产一区二区三 | 成人久久18免费网站麻豆 | 欧美一级二级在线观看 | 天天操天天操 | 成人在线视频一区 | 女同av亚洲女人天堂 | 日本天天色 | 亚洲高清久久 | 久久99精品久久久久久 | 久久99久久久久 | 精品久久久久久久 | 日本福利视频免费观看 | 91黄在线观看 | 欧美性受xxx | 欧美日韩国产精品一区 | 91在线视频观看免费 | 91精品国产一区二区三区 | 午夜精品福利视频 |