红外解码数码管显示+串口接收

发布者:正在搬砖的河马71最新更新时间:2016-09-08 来源: eefocus关键字:红外解码  数码管显示  串口接收 手机看文章 扫描二维码
随时随地手机看文章
#include

#include

//***********************************************************
//    TC9012 红外遥控接收数码管显示+串口接收-----成功!     *
//***********************************************************
#define uchar unsigned char //定义一下方便使用
#define uint  unsigned int
//unsigned char code dgw[] = {0xfe,0xfd,0xfb,0xf7};//数码管控制
unsigned char scan[4]={0xf7,0xfb,0xfd,0xfe};//p1位选择
unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
unsigned char code led_tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char disbuf[4];//数码管显示缓冲
 uchar  irdate[33];
char DAT[4]={0};

uchar temp,keynum,ledstop=8,irtime;
uchar startfleg,bitnum,irallok;
uchar irok;
uchar ircode[4];
uchar jia,flog;

void delay(unsigned char x) ;//x*0.14MS
//sbit sm = P1^0; 
sbit BEEP = P3^7 ; //声音输出接口


/*
红外接收,并识别遥控上的数字 P3.7声音输出接口
P0数码管段选 P1数码管位选 P3.2红外输入端

*/

void delay1ms(int n)   //误差 0us
{
    unsigned char a,b;
  int m;
  for(m=0;m   {
    for(b=9;b>0;b--)
        for(a=1;a>0;a--);
  }
    
}


void DELAY_MS (unsigned int a)//延时程序
{
 unsigned int i;
 while( --a != 0)
 {
  for(i = 0; i < 125; i++);
 }
}

////////////////////////
//简化显示函数
void disp(int x)
{
 int i,temp = 0x01;
 DAT[0]=x/1000;
 DAT[1]=x/100%10;
 DAT[2]=x/10%10;
 DAT[3]=x%10;
 for(i=0;i<4;i++)
 {
  P1 = ~temp;
  P0 = tab[DAT[i]];
  DELAY_MS(4);
  temp = temp<<1; //左移位
 }

}

void irwork()    // disbuf[0]=(((KeyValue&0xf0)>>4)&0x0f);//机器码,取高4位
{
 // 16进制显示(键值)
 disbuf[0] = (((ircode[1]&0xf0)>>4)&0x0f);
 disbuf[1] = ircode[1]&0x0f;

 disbuf[2] = (((ircode[2]&0xf0)>>4)&0x0f);
 disbuf[3] = ircode[2]&0x0f;
 
//以下是十进制显示(键码)
 //disbuf[0] = ircode[2]; //通过缓冲得到数值
 //disbuf[1] = ircode[3];
 


}

 


void LedDisp()//键值显示

    unsigned char i;
    for(i=0;i<4;i++)
    {   
     P0=tab[disbuf[i]];
     P1 = scan[i];
     DELAY_MS(5);
     P1=0xff;
 }
}

void irtimeA()  //中断初始化
{
 TMOD = 0X22;//设定时器0并用工作方式2 
 TH0 = 0;//高位赋初值
 TL0 = 0;//低位赋初值  //使定时器256us中断一次
 EA = 1;//开启总中断开关
 ET0 = 1;//启动定时中断
 TR0 = 1;//开启定时器
 EX0 = 1;//打开外部中断
 IT0 = 1;//选择外部中断方式1
 
 TH1 = 0XF3;//定时器初值高8位设置
 TL1 = 0XF3;//定时器初值低8位设置
 TR1 = 1;//启动定时器
 SM0 = 0;
 SM1 = 1;//设置串口工作方式
 REN = 1;//使串口接收使能
 //EA = 1;//打开总中断开关
 ES = 1;//打开串口中断
 PCON = 0x80; //波特率倍频(屏蔽本句波特率为2400)
 //IP = 0x10;
}

void beep()
{
  unsigned char i ;
  for (i=0 ;i<100 ;i++)
   {
   delay1ms(10);
   BEEP=!BEEP;
   } 
  BEEP=1 ;
}

void irpros(void)  //对接收到的数据处理
{
 uchar k,value, i,j;
 k=1;
 for(j=0;j<4;j++)
 {
  for(i=0;i<8;i++) //循环8次得到一段8位的码
  {
   value = value>>1;
   if(irdate[k]>6)  //判断有几个irtime=255us 大于6个是1
   {
    value = value | 0x80;
   
   }
   k++;
  }
  ircode[j] = value; //将一段8位的码存入数组中
 }
 
 irallok = 1;

}


main()
{
 //uchar wx=0x01,js;
 irtimeA();

   while(1)
   {      
     if(irok==1)
     {
      irpros();
     irok = 0;
     }
     if(irallok==1)
     {
      irwork();
     //ircal();
     irallok = 0;
     beep();
 
     ES = 0;//关闭串口中断

     ///////////////////解码完毕串口接收显示///
     flog = 0;
     SBUF = ircode[0]; //单片机向pc发送数据////
     while(!TI);//等待数据发送完毕     ////
     TI = 0; //发送标志位置0       ////
     ES = 1;//打开串口中断       ////
     //DELAY_MS(5);
     //////////////////////////////////////////
     flog = 0;
     SBUF = ircode[1]; //单片机向pc发送数据////
     while(!TI);//等待数据发送完毕     ////
     TI = 0; //发送标志位置0       ////
     ES = 1;//打开串口中断       ////
     //DELAY_MS(5);
     //////////////////////////////////////////
     flog = 0;
     SBUF = ircode[2]; //单片机向pc发送数据////
     while(!TI);//等待数据发送完毕     ////
     TI = 0; //发送标志位置0       ////
     ES = 1;//打开串口中断       ////
     //DELAY_MS(5);
     //////////////////////////////////////////
     flog = 0;
     SBUF = ircode[3]; //单片机向pc发送数据////
     while(!TI);//等待数据发送完毕     ////
     TI = 0; //发送标志位置0       ////
     ES = 1;//打开串口中断       ////
     //////////////////////////////////////////发送完毕标志位
     flog = 0;
     SBUF =0x64; //单片机向pc发送数据////
     while(!TI);//等待数据发送完毕     ////
     TI = 0; //发送标志位置0       ////
     ES = 1;//打开串口中断       ////
     //////////////////////////////////////////

     }
    LedDisp();
    //disp(shiyan);
      //disp(disbuf[1]); 
     //ledshine();
    //ledshines();
   }
}

void timer0() interrupt 1   //定时器0中断
{
 irtime++;
}
void inter0() interrupt 0   //外部中断
{
 
 if(startfleg)
 {
  if(irtime>32)  //判断引导码是否发送完毕
  {
   bitnum = 0;

  }
  irdate[bitnum] = irtime; //接收数据并把数据存入数组
  irtime = 0;
  bitnum++;
  if(bitnum==33)
  {
   bitnum = 0;
   irok = 1;

  }
 }
 else
 {
  startfleg = 1; //是否接收到数据标志位
  irtime = 0;

 }
 
//serial() interrupt 4;
}


void serial() interrupt 4 //串口中断函数
{
 //a = SBUF;

 RI = 0; //中断接收标志位置0
 flog = 1;


}

关键字:红外解码  数码管显示  串口接收 引用地址:红外解码数码管显示+串口接收

上一篇:51单片机测速度或测方波频率两用程序
下一篇:51单片机12M晶振的延时程序

推荐阅读最新更新时间:2024-03-16 15:09

STM32串口中断接收方式详细比较
简介:本例程通过PC机的串口调试助手将数据发送至STM32,接收数据后将所接收的数据又发送至PC机,具体下面详谈 实例一: void USART1_IRQHandler(u8 GetData) { u8 BackData; if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //中断产生 { USART_ClearITPendingBit(USART1,USART_IT_RXNE); //清除中断标志. GetData = UART1_GetByte(BackData); //也行GetData=USART1- DR; USART1_SendByte(GetData);
[单片机]
数码管动态扫描显示01234567显示
原理图:8个数码管它的数据线并联接到JP5, 位控制由8个PNP型三级管驱动后由JP8引出。 相关原理: 数码管是怎样来显示1,2,3,4呢?数码管实际上是由7个发光管组成8字形构成的,加上小数点就是8个。我们分别把他命名为A,B,C,D,E,F,G,H。 搞懂了这个原理, 我们如果要显示一个数字2, 那么 A,B,G,E,D这5个段的发光管亮就可以了。也就是把B,E,H(小数点)不亮,其余全亮。根据硬件的接法我们编出以下程序。当然在此之前,还必须指定哪一个数码管亮,这里我们就指定最后一个P2.7。 LOOP: CLR P2.7 ;选中最后的数码管 SETB P0.7 ;B段不亮 SETB P0.5 ;小数点不亮 S
[单片机]
<font color='red'>数码管</font>动态扫描<font color='red'>显示</font>01234567<font color='red'>显示</font>
STC89C52单片机驱动数码管动态显示
////////////////////////////////////////////////////////////////////////// 实现功能: 驱动开发板上的数码管,滚动显示1、2、3、4、5、6,实现数码管的 动态显示 实验板型号:BS-XYD-C52 实验名称: 动态数码管的显示 编写人: 谢应东 编写日期: 2012-4-26 ////////////////////////////////////////////////////////////////////////// #include reg52.h #include intrins.h
[单片机]
串口接收中断和连续发送的矛盾!
出现的问题:为什么我配置的串口中断,只能接收到数据头和尾?PC发送123,我接收到13;PC发送12345,我接收到15。 波特率也是匹配的呀,怎么就漏接了中间部分呢? 暂时想到的原因:因为串口接收中断服务程序也是需要时间来执行的,所以试想一下: MCU的串口外设在接收到二个数据的时候,MCU的主核正在执行第一个数据触发的中断服务程序,所以第二个数据触发的中断函数并未执行!如果波特率很高,那么中断服务程序就相对时间很长,这样,MCU接收到第三个数据,MCU仍在第一个中断函数里执行,但串口接收寄存器被覆盖了!直到MCU接收到最后一个数据,串口接收寄存器稳定为最后一个数据(因为没有下一个数据来覆盖它),这是等待第一个中断服务函数结
[单片机]
STM32串口接收粉尘传感器数据
本文章主要记录STM32实现对粉尘传感器的数据采集及简单处理。 材料: 1、正点原子Mini开发板STM32f103RC 2、ZH03A激光粉尘传感器 3、USB TO TTL线(就是烧写51单片机的下载线)连接电脑和开发板上的串口2 4、电脑串口调试助手,用来查看数据 主要设计思路: 1、串口初始化,包括GPIO,外设时钟,NVIC等配置; 2、串口中断处理函数编写,即通过接收中断获取数据并且保存到数组,同时注意判断相关数据位; 3、发送数据,使用到了printf函数,需要重定向; 4、主程序初始化。 主要函数编写: 1、串口初始化,PA.2- USART2_TX,PA.3- USART2_RX,PA.9- USART1
[单片机]
STM32<font color='red'>串口</font><font color='red'>接收</font>粉尘传感器数据
51单片机超声波测距数码管显示
超声波原理简单测距准确,应用广泛下面贴一个自己写的数码管程序,显示部分需要改,最近比赛写的我使用的是慧净开发板,共阴数码管 //超声波模块程序 //作者 : Z H //时间 2015/11/29 //Trig = P2^0 //Echo = P3^2 #include reg52.h #define uchar unsigned char #define uint unsigned int unsigned char code table ={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f}; //0-9的码
[单片机]
STM32串口如何代码实现更高效的接收消息
摘要 本文介绍设计一个环形队列数据结构以实现串口更稳定的接收消息,并有效防止丢包 。 这段时间一直在研究多旋翼飞行器,以及其它的事情,博客好外没更新,再不坚持怕真荒废了哦。 在上篇简单实现MAVLink协议的解析,并演示按照设计好的命令执行对应的事件处理,以及又加入 CRC校验,实现更稳定的通信,但在上文结束时也提到当对一个包进行解析及对应事件处理时,是不能接收新的数据,直到事件处理完成,Msg_Rev.Get 状态设置为 RECEIVING 后方能再接收新的数据。这时,当事件处理需要一定时间,而又有新的数据不断发送过来时,很容易造成数据丢失现象。 如何提高串口通信效率,并避免丢包现象了? 为提高效率,首先想到采用DMA方式,然而
[单片机]
51单片机之动态数码管显示
首先来看一下开发板上的电路原理图: 本开发板上使用的是,通过P22、P23、P24控制3-8译码器来对数码管进行位选,通过P0口经过573的驱动控制数码管的段选,通过P13控制573的使能端,为低电平时573才会有输出。 138译码器的真值表如下图G1,G2A,G2B都是选通脚,当G1,G2A,G2B为100的时候138译码器开始工作,A为最低位,B为中间位,C为最高位。CBA=000B时,Y0为1,其他口为0,CBA=001B时,Y1为1,其他口为0,CBA=010B时,Y2为1,其他口为0,CBA=011B时,Y3为1,其他口为0,CBA=100B时,Y4为1,其他口为0,CBA=101B时,Y5为1,其他口为0,CB
[单片机]
51单片机之动态<font color='red'>数码管</font><font color='red'>显示</font>
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved