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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4274|回復: 0
打印 上一主題 下一主題
收起左側

STC89C51紅外遙控實驗學習

[復制鏈接]
跳轉到指定樓層
樓主
ID:127247 發表于 2016-6-19 12:12 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
抱著對電子的愛好,用朋友閑置的51實驗板學習一下,初學者,不足之處多多見諒!

/*******************************************************************************
* 實驗名         : 數碼管顯示紅外線值實驗
* 使用的IO         : 紅外使用P3.2 數碼管使用P0,P2.2,P2.3,P2.4
* 實驗效果       : 數碼管顯示出讀取到的紅外線的值
*    注意                     :
*******************************************************************************/
#include<reg51.h>


#define GPIO_DIG P0

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

unsigned char code DIG_CODE[18]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0X71,0x76};
//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F、H的顯示碼
unsigned char DisplayData[8];

sbit IRIN=P3^2;

unsigned char IrValue[6];
unsigned char Time;
void IrInit();
void DelayMs(unsigned int );
void DigDisplay();
/*******************************************************************************
* 函數名         : main
* 函數功能           : 主函數
* 輸入           : 無
* 輸出              : 無
*******************************************************************************/

void main()
{
    IrInit();   
    while(1)
    {
        DisplayData[0] = DIG_CODE[17];
        switch(IrValue[2]){
            case 0x16:  
                DisplayData[1] = DIG_CODE[0];
                DisplayData[2] = DIG_CODE[0];
                break;
            case 0x0c:  
                DisplayData[1] = DIG_CODE[1];
                DisplayData[2] = DIG_CODE[0];
                break;
            case 0x18:  
                DisplayData[1] = DIG_CODE[2];
                DisplayData[2] = DIG_CODE[0];
                break;
            case 0x5e:  
                DisplayData[1] = DIG_CODE[3];
                DisplayData[2] = DIG_CODE[0];
                break;
            case 0x08:  
                DisplayData[1] = DIG_CODE[4];
                DisplayData[2] = DIG_CODE[0];
                break;
            case 0x1c:  
                DisplayData[1] = DIG_CODE[5];
                DisplayData[2] = DIG_CODE[0];
                break;
            case 0x5a:  
                DisplayData[1] = DIG_CODE[6];
                DisplayData[2] = DIG_CODE[0];
                break;
            case 0x42:  
                DisplayData[1] = DIG_CODE[7];
                DisplayData[2] = DIG_CODE[0];
                break;
            case 0x52:  
                DisplayData[1] = DIG_CODE[8];
                DisplayData[2] = DIG_CODE[0];
                break;
            case 0x4a:  
                DisplayData[1] = DIG_CODE[9];
                DisplayData[2] = DIG_CODE[0];
                break;
            default:
                DisplayData[1] = DIG_CODE[IrValue[2]%16];
                DisplayData[2] = DIG_CODE[IrValue[2]/16];

        }
   
   


        DigDisplay();
    }
}                                    
/*******************************************************************************
* 函數名         : DelayMs()
* 函數功能           : 延時
* 輸入           : x
* 輸出              : 無
*******************************************************************************/

void DelayMs(unsigned int x)   //0.14ms誤差 0us
{
unsigned char i;
  while(x--)
{
  for (i = 0; i<13; i++)
{}
}
}


/*******************************************************************************
* 函 數 名         : DigDisplay
* 函數功能           : 使用數碼管顯示
* 輸    入         : 無
* 輸    出         : 無
*******************************************************************************/
void DigDisplay()
{
    unsigned char i;
    unsigned int j;
    for(i=0;i<8;i++)
    {
        switch(i)     //位選,選擇點亮的數碼管,
        {
            case(0):
                LSA=0;LSB=0;LSC=0; break;//顯示第0位
            case(1):
                LSA=1;LSB=0;LSC=0; break;//顯示第1位
            case(2):
                LSA=0;LSB=1;LSC=0; break;//顯示第2位
            case(3):
                LSA=1;LSB=1;LSC=0; break;//顯示第3位
            case(4):
                LSA=0;LSB=0;LSC=1; break;//顯示第4位
            case(5):
                LSA=1;LSB=0;LSC=1; break;//顯示第5位
            case(6):
                LSA=0;LSB=1;LSC=1; break;//顯示第6位
            case(7):
                LSA=1;LSB=1;LSC=1; break;//顯示第7位   
        }
        GPIO_DIG=DisplayData[i];//發送段碼
        j=10;                         //掃描間隔時間設定
        while(j--);   
        GPIO_DIG=0x00;//消隱
    }
}
/*******************************************************************************
* 函數名         : IrInit()
* 函數功能           : 初始化紅外線接收
* 輸入           : 無
* 輸出              : 無
*******************************************************************************/

void IrInit()
{
    IT0=1;//下降沿觸發
    EX0=1;//打開中斷0允許
    EA=1;    //打開總中斷

    IRIN=1;//初始化端口
}
/*******************************************************************************
* 函數名         : ReadIr()
* 函數功能           : 讀取紅外數值的中斷函數
* 輸入           : 無
* 輸出              : 無
*******************************************************************************/

void ReadIr() interrupt 0
{
    unsigned char j,k;
    unsigned int err;
    Time=0;                     
    DelayMs(70);

    if(IRIN==0)        //確認是否真的接收到正確的信號
    {     
        
        err=1000;                //1000*10us=10ms,超過說明接收到錯誤的信號
        /*當兩個條件都為真是循環,如果有一個條件為假的時候跳出循環,免得程序出錯的時
        侯,程序死在這里*/   
        while((IRIN==0)&&(err>0))    //等待前面9ms的低電平過去         
        {            
            DelayMs(1);
            err--;
        }
        if(IRIN==1)            //如果正確等到9ms低電平
        {
            err=500;
            while((IRIN==1)&&(err>0))         //等待4.5ms的起始高電平過去
            {
                DelayMs(1);
                err--;
            }
            for(k=0;k<4;k++)        //共有4組數據
            {               
                for(j=0;j<8;j++)    //接收一組數據
                {

                    err=60;        
                    while((IRIN==0)&&(err>0))//等待信號前面的560us低電平過去
//                    while (!IRIN)
                    {
                        DelayMs(1);
                        err--;
                    }
                    err=500;
                    while((IRIN==1)&&(err>0))     //計算高電平的時間長度。
                    {
                        DelayMs(1);//0.14ms
                        Time++;
                        err--;
                        if(Time>30)
                        {
                            EX0=1;
                            return;
                        }
                    }
                    IrValue[k]>>=1;     //k表示第幾組數據
                    if(Time>=8)            //如果高電平出現大于565us,那么是1
                    {
                        IrValue[k]|=0x80;
                    }
                    Time=0;        //用完時間要重新賦值                           
                }
            }
        }
        if(IrValue[2]!=~IrValue[3])
        {
            return;
        }
    }            
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产成人影院 | 国偷自产av一区二区三区 | 日本精品视频 | 欧美亚洲国产一区二区三区 | 日日综合| 亚洲精品视频在线看 | 玖玖免费| www视频在线观看 | 欧美偷偷操 | 9久久精品| 久久久www成人免费精品 | 亚洲欧美一区二区三区在线 | 日韩第一夜| 成人精品视频在线观看 | 久久69精品久久久久久久电影好 | 久久久久久中文字幕 | 欧美日韩精品一区 | 99影视| 男人天堂网址 | 亚洲成人免费在线 | 精品久久久久久亚洲综合网 | 欧美日韩综合视频 | 国产欧美日韩一区二区三区在线观看 | 国产亚洲日本精品 | 欧美理论 | 一区二区三区日韩 | av中文字幕在线观看 | 日韩成人一区 | 99久久精品国产一区二区三区 | 成人网av | 日本精品一区二区三区在线观看视频 | 日本啊v在线 | 亚洲 中文 欧美 日韩 在线观看 | 国产精品永久免费视频 | 色婷婷综合久久久中文字幕 | 国产h视频| 91精品国产91久久久久游泳池 | 午夜免费影视 | 中文日韩在线视频 | 伊人国产精品 | 中文字幕一区二区三区在线观看 |