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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4248|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

STC89C51紅外遙控實驗學習

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

/*******************************************************************************
* 實驗名         : 數(shù)碼管顯示紅外線值實驗
* 使用的IO         : 紅外使用P3.2 數(shù)碼管使用P0,P2.2,P2.3,P2.4
* 實驗效果       : 數(shù)碼管顯示出讀取到的紅外線的值
*    注意                     :
*******************************************************************************/
#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();
/*******************************************************************************
* 函數(shù)名         : main
* 函數(shù)功能           : 主函數(shù)
* 輸入           : 無
* 輸出              : 無
*******************************************************************************/

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();
    }
}                                    
/*******************************************************************************
* 函數(shù)名         : DelayMs()
* 函數(shù)功能           : 延時
* 輸入           : x
* 輸出              : 無
*******************************************************************************/

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


/*******************************************************************************
* 函 數(shù) 名         : DigDisplay
* 函數(shù)功能           : 使用數(shù)碼管顯示
* 輸    入         : 無
* 輸    出         : 無
*******************************************************************************/
void DigDisplay()
{
    unsigned char i;
    unsigned int j;
    for(i=0;i<8;i++)
    {
        switch(i)     //位選,選擇點亮的數(shù)碼管,
        {
            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];//發(fā)送段碼
        j=10;                         //掃描間隔時間設(shè)定
        while(j--);   
        GPIO_DIG=0x00;//消隱
    }
}
/*******************************************************************************
* 函數(shù)名         : IrInit()
* 函數(shù)功能           : 初始化紅外線接收
* 輸入           : 無
* 輸出              : 無
*******************************************************************************/

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

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

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

    if(IRIN==0)        //確認是否真的接收到正確的信號
    {     
        
        err=1000;                //1000*10us=10ms,超過說明接收到錯誤的信號
        /*當兩個條件都為真是循環(huán),如果有一個條件為假的時候跳出循環(huán),免得程序出錯的時
        侯,程序死在這里*/   
        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組數(shù)據(jù)
            {               
                for(j=0;j<8;j++)    //接收一組數(shù)據(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表示第幾組數(shù)據(jù)
                    if(Time>=8)            //如果高電平出現(xiàn)大于565us,那么是1
                    {
                        IrValue[k]|=0x80;
                    }
                    Time=0;        //用完時間要重新賦值                           
                }
            }
        }
        if(IrValue[2]!=~IrValue[3])
        {
            return;
        }
    }            
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日本不卡免费新一二三区 | 中文字幕第一页在线 | 女生羞羞网站 | 欧美黄色性生活视频 | 视频三区 | 国产第一亚洲 | 日韩成人在线播放 | av一区二区三区四区 | 国产免费一区二区 | 夜夜艹 | 国产一区日韩在线 | 在线国产一区二区 | 精品一区二区三区在线播放 | 国产精品一区二区免费看 | 日本高清视频在线播放 | 精品视频一区二区在线观看 | 在线免费视频一区 | 午夜精品一区二区三区免费视频 | 婷婷色国产偷v国产偷v小说 | 免费中文字幕 | 性色综合 | www国产亚洲精品久久网站 | 欧美一级片在线观看 | 亚欧洲精品在线视频免费观看 | 精品久久久久久久久久 | 欧美一级久久久猛烈a大片 日韩av免费在线观看 | 国产九九精品视频 | 欧美一级全黄 | 九九在线视频 | 国产一区二区免费 | 色视频在线免费观看 | 精品在线免费看 | 欧美精品一区二区三区在线播放 | 精精国产视频 | 欧洲免费毛片 | 狠狠草视频 | 伊人影院在线观看 | 久久不卡视频 | 天堂一区二区三区 | 日韩免费一区 | 日本黄色的视频 |