发 帖  
数码管显示红外线值实验
2018-7-19 06:57:09  172 数码管 红外线 51实验板
收藏 0 收藏 推荐 0 推荐
分享
抱着对电子的爱好,用朋友闲置的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;//发送段码
         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;
         }
     }            
}
2018-7-19 06:57:09   评论

只有小组成员才能发言,加入小组>>

268个成员聚集在这个小组

加入小组

创建小组步骤

关闭

站长推荐 上一条 /9 下一条

快速回复 返回顶部 返回列表
-

推荐专区

技术干货集中营

专家问答

用户帮助┃咨询与建议┃版主议事

工程师杂谈

项目|工程师创意

招聘|求职}工程师职场

论坛电子赛事

社区活动专版

发烧友活动

-

嵌入式论坛

ARM技术论坛

Linux论坛

单片机/MCU论坛

MSP430技术论坛

FPGA|CPLD|ASIC论坛

STM32/STM8技术论坛

NXP MCU 技术论坛

DSP论坛

嵌入式系统论坛

-

电源技术论坛

电源技术论坛

无线充电技术

-

硬件设计论坛

电路设计论坛

电子元器件论坛

传感技术

总线技术|接口技术

-

测试测量论坛

LabVIEW论坛

Matlab论坛

测试测量技术专区

-

EDA设计论坛

multisim论坛

PCB设计论坛

PADS技术论坛

Protel|AD|DXP论坛

Allegro论坛

proteus论坛|仿真论坛

Orcad论坛

-

综合技术与应用

电机控制

工程资源中心

汽车电子技术论坛

医疗电子论坛

-

开源硬件

-

无线通信论坛

物联网技术

天线|RF射频|微波|雷达技术

-

IC设计论坛

芯片测试与失效分析

Analog/RF IC设计

设计与制造封装测试

-

厂商专区

TI论坛

TI Deyisupport社区

-

检测技术与质量

电磁兼容(EMC)设计与整改

安规知识论坛

检测与认证

-

消费电子论坛

手机技术论坛

平板电脑/mid论坛

音视/视频/机顶盒论坛

-

电子论坛综合区

聚丰众筹官方社区

新人报道区

聚丰供应链

-

论坛服务区

-

高校联盟

深圳大学电子协会

西藏民族学院电子设计协会

西安电子科技大学西电实验室

桂林电子科技大学机电工程协会

鉴鹰电子科技协会

广东海洋大学科技创新协会

福建农林大学电子科技创新协会

湖北理工学院电子技术协会

深圳职业技术学院电子精英训练营

浙江科技学院Zuster

湘潭大学电子科技协会

青岛理工大学琴岛学院天宏开发团队

河南理工大学大学生电器开发部

广西科技大学电气信息创新协会

浙江机电职业技术学院电子制作协会

郑州大学西亚斯国际学院爱电工作室

新乡学院电子创新工作室

洛阳理工学院SmartTeam

苏州工业职业技术学院创新工作室

浙江工业大学GC315团队

杭电-微芯大学生科技创新孵化器

西安工业大学电信科协

商洛学院科技创新协会

大连民族学院创新工作室

南京信息工程大学帆木工作室

-

供求信息发布

方案交易

供需广告

芯片求购|供应发布区