标题:
简单8数码管显示红外编码 单片机程序
[打印本页]
作者:
Elison
时间:
2019-4-13 02:31
标题:
简单8数码管显示红外编码 单片机程序
无需复杂的电路,使用8个数码管既可显示出红外遥控的编码,电路简单,代码少,适合新手玩,不知道论坛有没有人发过,新人新帖
单片机源程序如下:
/***************************************************************************
标题: 红外遥控解码器数码管显示 使用12mhz晶振
管脚:P33红外接收数据,P0口数码管数据口,P10数码管千位,P11数码管百位,P12数码管十位,P13数码管个位
效果: 运行程序,按遥控器按键,在数码管上显示相应的地址码-控制码(以16进制显示)
分两段,前段是地址码,后段为控制码,用点隔开,显示两字节,忽略反码,使用共阴数码管
******************************************************************************/
#include <reg51.h>
sbit SMG_0 = P1^0; //定义数码管(千万位)
sbit SMG_1 = P1^1; //定义数码管(百万位)
sbit SMG_2 = P1^2; //定义数码管(十万位)
sbit SMG_3 = P1^3; //定义数码管(万位)
sbit SMG_4 = P1^4; //定义数码管(千位)
sbit SMG_5 = P1^5; //定义数码管(百位)
sbit SMG_6 = P1^6; //定义数码管(十位)
sbit SMG_7 = P1^7; //定义数码管(个位)
/********数据定义*************************************************************/
sbit hwx=P3^3; //红外接收数据引脚,
code unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //数码管段值表 0-9 a-f
unsigned char ly_disdate[8]={0,0,0,0,0,0,0,0}; //显示缓冲
unsigned char ly_lhj[4]; //保存NEC的四个字节数据
unsigned char ly_ct=0; //计数时间
bit ly_flag=1; //成功接收标志
//函数声明:
void display();//定义显示函数,直接显示缓冲区数值
void delay(void);
void delay100us(void);
/***********外中断1入口函数,P33引脚,红外线接收IC数据脚**************************/
void hongwai(void) interrupt 2
{
unsigned char i,ia;
/**************开始判断是否为NEC波形引导码的前9MS和后4.5MS******************************/
ly_ct=0; //计数时间清0
while(!hwx) //hwx红外管脚
delay100us(); //调用0.1MS延时计数,ly_ct每调用一次加1
if(ly_ct<80||ly_ct>100) //NEC引导码前9MS,ly_ct约等于90,给个误差值,用80-100之间来判断
return;
ly_ct=0; //计数时间请0
while(hwx)
{
delay100us();
if(ly_ct>50) //NEC引导码引导码的后4.5MS,ly_ct约45
return;
}
if(ly_ct<40) //NEC引导码引导码的后4。5MS,ly_ct约45
return;
/***********开始接收四个字节内容**************************************/
for(i=0;i<4;i++)
{
for(ia=0;ia<8;ia++)
{
while(!hwx); //低电平开始,不处理只等待高电平接收
ly_ct=0;
while(hwx) //高电平开始,
{
delay100us();
if(ly_ct>20)
return;
}
//高电平结束,判断数据1或0向变量移入
ly_lhj[i]>>=1; //数据由高位移入低位
if(ly_ct>10) //时间量TH1高于10,即高于1MS判断为1
ly_lhj[i]|=0x80;
}
}
ly_flag=1; //接收成功
TF1=0;
}
//显示函数,参数为显示内容,只显示两位数
void display()
{
SMG_0=0; //选择千万位数码管
P0=table[ly_disdate[0]]; //
delay(); //
P0=0XFF; //
SMG_0=1; //
SMG_1=0; //选择百万位数码管SMG_b
P0=table[ly_disdate[1]]|0x80; //加上小数点
delay(); //延时
P0=0XFF; //
SMG_1=1; //
SMG_2=0; //选择十位数码管
P0=table[ly_disdate[2]]; //
delay(); //
P0=0XFF; //
SMG_2=1; //
SMG_3=0; //选择个位数码管
P0=table[ly_disdate[3]]|0x80; //加上小数点; //
delay(); //
P0=0XFF; //
SMG_3=1; //
SMG_4=0; //选择千万位数码管
P0=table[ly_disdate[4]]; //
delay(); //
P0=0XFF; //
SMG_4=1; //
SMG_5=0; //选择百万位数码管SMG_b
P0=table[ly_disdate[5]]|0x80; //加上小数点
delay(); //延时
P0=0XFF; //
SMG_5=1; //
SMG_6=0; //选择十位数码管
P0=table[ly_disdate[6]]; //
delay(); //
P0=0XFF; //
SMG_6=1; //
SMG_7=0; //选择个位数码管
P0=table[ly_disdate[7]]; //加上小数点
delay(); //
P0=0XFF; //
SMG_7=1; //
}
//延时子函数,短暂延时
void delay(void)
{
unsigned char i=10;
while(i--);
}
void delay100us(void)
{
unsigned char i=15;
while(i--);
ly_ct++;
}
void main(void)
{
EA=1; //首先开启总中断
EX1=1; //开启外部中断1,红外接收数据引脚
IT1=1; //设置成下降沿触发方式
while(1)
{
if(ly_flag)
{ //接收成功处理显示缓冲,以16进制显示
ly_flag=0;
ly_disdate[0]=ly_lhj[0]/16;
ly_disdate[1]=ly_lhj[0]%16;
ly_disdate[2]=ly_lhj[1]/16;
ly_disdate[3]=ly_lhj[1]%16;
ly_disdate[4]=ly_lhj[2]/16;
ly_disdate[5]=ly_lhj[2]%16;
ly_disdate[6]=ly_lhj[3]/16;
ly_disdate[7]=ly_lhj[3]%16;
}
display();//显示缓冲内容
}
}
复制代码
所有资料51hei提供下载:
红外遥控解码8数码管显示.zip
(36.27 KB, 下载次数: 30)
2019-4-13 02:30 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
admin
时间:
2019-4-13 03:13
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
作者:
村雨
时间:
2019-4-13 09:55
大佬,牛逼了
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1