我们从2011年坚守至今,只想做存粹的技术论坛。  由于网站在外面,点击附件后要很长世间才弹出下载,请耐心等待,勿重复点击不要用Edge和IE浏览器下载,否则提示不安全下载不了

 找回密码
 立即注册
搜索
查看: 539|回复: 4

1602红外显示

[复制链接]

该用户从未签到

11

主题

48

回帖

1

积分

二级逆天

积分
1

终身成就奖特殊贡献奖

QQ
发表于 2016-6-19 15:59:04 | 显示全部楼层 |阅读模式
/*******************************************************************************
* 实验名               : 1602显示红外线值实验
* 使用的IO         : 电机用P1口,键盘使用P3.0、P3.1、P3.2、P3.3
* 实验效果       : LCD1602显示出读取到的红外线的值
*    注意                     :
*******************************************************************************/
#include<reg51.h>
#include"lcd.h"

sbit IRIN=P3^2;

unsigned char code CDIS1[13]={" Red Control "};
unsigned char code CDIS2[13]={" IR-CODE:--H "};
unsigned char IrValue[6];
unsigned char Time;
void IrInit();
void DelayMs(unsigned int );
/*******************************************************************************
* 函数名         : main
* 函数功能           : 主函数
* 输入           : 无
* 输出              : 无
*******************************************************************************/

void main()
{
    unsigned char i;
    IrInit();   
    LcdInit();
    LcdWriteCom(0x80);
    for(i=0;i<13;i++)
    {
        LcdWriteData(CDIS1);   
    }
    LcdWriteCom(0x80+0x40);
    for(i=0;i<13;i++)
    {
        LcdWriteData(CDIS2);   
    }
    while(1)
    {
        IrValue[4]=IrValue[2]>>4;              //高位
        IrValue[5]=IrValue[2]&0x0f;        //低位   
        if(IrValue[4]>9)
        {
            LcdWriteCom(0xc0+0x09);            //设置显示位置
            LcdWriteData(0x37+IrValue[4]);    //将数值转换为该显示的ASCII码
        }
        else
        {
            LcdWriteCom(0xc0+0x09);
            LcdWriteData(IrValue[4]+0x30);    //将数值转换为该显示的ASCII码
        }   
        if(IrValue[5]>9)
        {
            LcdWriteCom(0xc0+0x0a);
            LcdWriteData(IrValue[5]+0x37);        //将数值转换为该显示的ASCII码
        }
        else
        {
            LcdWriteCom(0xc0+0x0a);
            LcdWriteData(IrValue[5]+0x30);        //将数值转换为该显示的ASCII码
        }   
    }
}                                    
/*******************************************************************************
* 函数名         : DelayMs()
* 函数功能           : 延时
* 输入           : x
* 输出              : 无
*******************************************************************************/

void DelayMs(unsigned int x)   //0.14ms误差 0us
{
unsigned char i;
  while(x--)
{
  for (i = 0; i<13; i++)
{}
}
}
/*******************************************************************************
* 函数名         : 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;
        }
    }            
}
回复

使用道具 举报

该用户从未签到

20

主题

2875

回帖

3960

积分

二级逆天

积分
3960

社区居民忠实会员社区劳模最爱沙发终身成就奖优秀斑竹奖

QQ
发表于 2016-6-19 20:39:02 | 显示全部楼层
红外显示显示的是什么呢
回复

使用道具 举报

该用户从未签到

11

主题

48

回帖

1

积分

二级逆天

积分
1

终身成就奖特殊贡献奖

QQ
 楼主| 发表于 2016-6-21 11:41:18 | 显示全部楼层
让LCD1602显示出读取到的红外线的值
回复

使用道具 举报

该用户从未签到

11

主题

48

回帖

1

积分

二级逆天

积分
1

终身成就奖特殊贡献奖

QQ
 楼主| 发表于 2016-6-22 07:41:56 | 显示全部楼层
其实这个代码,并不是很重要的,知识方便别人只需而也!
回复

使用道具 举报

该用户从未签到

11

主题

48

回帖

1

积分

二级逆天

积分
1

终身成就奖特殊贡献奖

QQ
 楼主| 发表于 2016-6-24 22:29:20 | 显示全部楼层
其实这个代码很简单的,我的目的就是想通过外部传感器对它控制,大家完全可以对照写一下对其他的控制
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

论坛开启做任务可以
额外奖励金币快速赚
积分升级了


Copyright ©2011-2024 NTpcb.com All Right Reserved.  Powered by Discuz! (NTpcb)

本站信息均由会员发表,不代表NTpcb立场,如侵犯了您的权利请发帖投诉

平平安安
TOP
快速回复 返回顶部 返回列表