MCU编程实践之红外中断定时12864逐步讲解一锅烩

发布者:skyhcg最新更新时间:2020-01-03 来源: 51hei关键字:MCU  编程实践  红外中断  定时 手机看文章 扫描二维码
随时随地手机看文章

这个其实是红外遥控编程过程实验,思路是这样的:

  • 红外接收管采用中断口接收信号;

  • 在中断子程序中,在高低电平的变化时,用计时器来计时其高、低电平维持的时长;

  • 将时长值直接用二进制数显示在12864屏上;

  • 以us为单位,手工计算各显示数值的时长值(这个可以不做);

  • 根据红外遥控NEC标准,分析该遥控器的引导码及比特码的高低电平时长组成,以此获得引导码和比特码的高低电平时长特征值,

  • 依据得到的引导码和比特码的高低电平时长特征值,再编制程序获得该遥控器的用户码值、各键的键值。

  • 依据得到的用户码值、各键的键值,接下来就可以做遥控控制操作编程了。

    这一套操作下来,你就拥有了获得各种红外遥控器用户码和键值的工具了,然后,你可以给家里的所有红外遥控器做一个一桶姜山的专用遥控器了,然后你可以在网上订印刷板、外壳等的,高档一点的,全屏触摸操作带学习。

    下面一步一步来:


一、12864屏

该屏下有字符显示和图形显示两种模式,我们选择字符模式。

字符模式下,其最多可显示64个半宽字符,或32个汉字,可混编,分为四排。输入位置为一维座标确定,左上角的座标值为80H。


1.初始化

编程时,首先设置其为字符模式,命令代码为10100B(我们这里直接用二进制,方便自己看说明书及更改功能设置)。

字符输入时,我们一般都能看到一个光标,以在屏幕上指示正在输入的位置,这个光标可以开可以关,用命令来设置;输入时我们一般选择光标向右移动、字符从左向右顺序输入(当然,你也可以倒着来,或新输入的字符总是固定在这个位置),相应命令为110B。


然后将字符地址内存DDRAM全部清空,将DDRAM的地址计数器值归位。该命令为1B。


字符输入后,你可以控制其显示或不显示,光标也一样,所以,我们还要设置其打开,相应命令为1110B。这个命令中,最后一位为0,表示游标位置反白关。


还有一个光标显示移位控制命令,先用10100B吧。


这一步算是完成了,执行后,你应该能看到光标。如果没有,那你的程序就有问题,仔细检查,反正没几行,我遇到的问题,基本就是延时不够,以及该延时的地方没加延时。


下面给出这部分的汇编程序,当然,你也可以用C编。并行输入,P0口为数据口:

        XRS  EQU  0B5H;P35     编程器不认P35,只好直接输入P35的地址值了,下同

    XRW  EQU  0B6H;P36

    XEN  EQU  0B7H;P37

    ;XPSB EQU ?           这两个,我的STC8A8K板,已硬件连电位了

    ;XRESET EQU ?        

    XCOM  EQU 34H

    XDAT  EQU 35H

            

ORG 0000H

        AJMP START

        ORG 0100H

        START:

        ACALL XDELAY

        ACALL XINIT

        AJMP $

        XINIT:

          MOV XCOM,#110000B

          ACALL XWRI

          MOV XCOM,#1H

          ACALL XWRI

          MOV XCOM,#110B

          ACALL XWRI

          MOV XCOM,#1110B

          ACALL XWRI

          MOV XCOM,#10100B

          ACALL XWRI

        RET

               

        XWRI:

          CLR XEN

          CLR XRS

          CLR XRW

          ACALL XDELAY

          MOV P0,XCOM

          SETB XEN

          CLR XEN

          ACALL XDELAY

        RET

         

        XWDAT:

      CLR XEN

      SETB XRS

      CLR XRW

      MOV P0,XDAT

      SETB XEN

      CLR XEN

      ACALL XDELAY

    RET

        

XDELAY: MOV 30h,#40  这个延时有点长,短了我的这个MCU不认帐,没法

   D1: MOV 31h,#25

   D2: DJNZ 31h,D2

   DJNZ 30h,D1

RET

END


2.输入字符

这个简单,输入座标再输入字符编码,搞定。

至此,屏显编程工作完成。


3.直接以二进制显示一个存储单元中的数值

比如我们要显示10010110B这个值,我们把它先输入到A寄存器中,将这个值一位一位地进行处理并显示在屏幕上。


对于初学者,最好是先将其中任一位的显示程序做通,然后再做这八位输入的程序,这个功能的子程序如下:

XBIT:

        MOV  A,#10010110B

        JB  ACC.0,LOOP1

        LOOP0:MOV XDAT,#30H

        ACALL  XWDAT

        RET

        LOOP1:MOV XDAT,#31H

        ACALL  XWDAT

RET

上面程序中的BACC.0就是最末一位,你可以换成其它位试试能否正确显示。

这个做通了,下面做八位全部显示的。

我们采用移位并循环法,从高位到低位逐位处理,子程序如下:

X8BIT:

          MOV A,#10010110B

          ACALL XBIT

RET

        XBIT:

          MOV  R2,#08H

          LOOP0:

           RL  A

           JB  ACC.0,LOOP1

           MOV  XDAT,#30H

           ACALL  XWDAT

           DJNZ  R2,LOOP0

            RET

             LOOP1:

             MOV  XDAT,#31H

             ACALL  XWDAT

             DJNZ  R2,LOOP0

        RET

三、中断程序

其实中断的原理蛮简单的,设定相应中断开之后,一旦有中断信号被接收到,即中断口的电平被拉低,则程序就强行发生跳转,这个跳转是程序存储器绝对地址的跳转,不同编号的中断有不同的跳转地址(中断向量),比如INT0,其跳转地址为0003H,即程序跳转到地址为0003H处开始执行。所以,在主程序中,应在0003H地址处写入中断子程序,但要注意因另一个中断的跳转地址为000BH,之间放不了几行程序,所以这里一般是写个跳转指令,跳转到一个专门的子程序来完成中断后的任务:


  ORG  0003H

  LJMP  INT0RED

对于中断,MCU设计有总中断控制开关(符号EA)、相应中断控制开关(符号EX#)、中断的触发方式(IT#),以及各中断的优先级控制(中断优先级寄存器IP中)。这个要根据你编程的需要,先期进行设置,也就是中断的初始化,这个可以在主程序中加一条ACALL  INT0INI:

INT0INI:

                SETB  EX0

                CLR  IT0

                SETB  P32  中断口。这个注意要置该端口为高电位

                SETB  EA

        RET        

中断初始化完成了,现在就可以开始接收中断并完成中断后的任务了,下面我们编一段子程序,当收到中断后,在屏幕指定位置显示一个汉字:

INT0RED:

          CLR EX0  关闭该中断允许

                  MOV XCOM,#82H

                  LCALL  XWRI

                  MOV XDAT,#0B1H

                  LCALL  XWDAT

                  MOV  XDAT,#0B2H

                  LCALL  XWDAT

                  SETB  EX0  完成后打开该中断允许

        RET  

执行后屏幕上只有一个光标,按一下遥控器,应该显示一个汉字。如果没有,则把P32与地短接一下,如果有了,那就是红外接收头或遥控器有问题;如果不是,那么程序有问题。   

另外,这段程序中的字符显示程序部分,规范的做法是做一个子程序,但这里只是检验中断程序,所以简单一点就不做了。


四、计时程序

计时程序的原理也蛮简单,你把它当作一个跑步计时秒表就行了,秒表的使用步骤就是先归零,然后按开始,然后按结束,然后看时间,完成。


秒表也好,MCU的计时也好,其实都是计数,秒表计的是秒数,MCU的讲计时器计的是机器 运行周期数,知道了周期长,弄到了周期数,则时长也就可以知道了。


1.在启动计时功能之前,有一些东西需要先期设置,也就是初始化。

MCU的计时功能,其实只是MCU内的一种功能模块的功能之一,它还有定时功能、计数功能,这一功能模块,称之为定时/计数器,这些功能其实都是基于计数功能来的,它可以计MCU的运行周期数,也可以计端口外部输入的高低电位变化数,无非是计数来源不同。我们这里需要的是计数机器运行周期数,需先将其设置为计时功能,这个在工作方式寄存器TMOD中进行设置。


MCU为每个定时计数器设计了两个字节的内部存储单元,用于存储计数值,高字节符号为TH#,低字节符号为TL#,这两字节的存储单元有四种不同的用法,均在工作方式寄存器TMOD中进行设置。我们这里采用工作方式1即16位计数器方式。


一般MCU内部都设计有几个定时/计数模块,编号从0开始。我们在设置时,用哪个就设置哪个。具体应用时要查该芯片的手册。一般控制0号和1号的TMOD地址为89H。我们这里用MOV  TMOD,#00000001B。


按前面说的,秒表启动前,先将其归零,用在这里,就是将TH和TL归零。

启动与停止控制在时间控制寄存器TCON中的某一位,可位寻址,符号为TR#,TR#=1时启动,TR#=0时停止。


两字节用于计数时,有一个问题,就是它最多只能计数65536个,超出怎么办(也就是溢出)?MCU在TCON中有一位就用于反映这事,溢出时它会被自动置1,其符号为TF#。所以,一般情况下,为稳妥起见,我们会在初始化时,将其置0。如果我们在程序中要用到这个TF#值,那么每一次用后都要清0,清0方式有软件清0和硬件清0。


下面就是初始化子程序:

T0INI:

MOV  TMOD,#00000001B

MOV  TH0,#00H

MOV  TL0,#00H

CLR  TF0

RET   

2.计量红外遥控器的第一个低电位的时长

我们知道,红外中断的产生就是接收头收到信号后将中断端口拉低为低电平,其最前端也就是引导码是9mu的低电平,我们在一接收到中断信号时就启动计时器,当其端口电平变为高电平时则停止计时,这个计时值是存在TH#和TL#中的,然后我们直接把它显示在屏幕上,然后计算看是不是在9毫秒左右(总会有些误差的,原因多种)。

计时子程序如下:

JTRED1:

SETB  TR0

JB P32,$

CLR  TR1

RET

显示子程序如下:

INT0RED:

   CLR EX0

                  SETB TR0

                  JNB P3.2,$

                          CLR TR0

                        MOV A,TH0

      ACALL X8BIT

    MOV A,TL0

    ACALL X8BIT        

                  SETB EX0

        RET

                INT0INI:

                SETB EX0

                CLR  IT0

                SETB  P3.2

                SETB EA

                RET  

以上功能,实现了引导码9mu段的时长二进制数显示,主程序如下:

ORG 0000H

        AJMP START

        ORG  0003H

                LJMP  INT0RED

        ORG 0100H

        START:

        ACALL XDELAY

        ACALL INT0INI

        ACALL XINIT

        ACALL T0INI

        AJMP $

运行后,按一下遥控器,就会有16位数字显示。

               

[1] [2]
关键字:MCU  编程实践  红外中断  定时 引用地址:MCU编程实践之红外中断定时12864逐步讲解一锅烩

上一篇:单片机定时器设置的门铃
下一篇:单片机DS18B20数字温度报警器Proteus仿真+代码详细注释

推荐阅读最新更新时间:2024-11-12 09:14

单片机在感应电动机控制系统中的应用
  0 引言   对于电动机的起动过程,为了避免定子回路的大电流冲击,设计有两种起动方法。方法一,通过设置在操作面板上的起动电位器,人工控制起动过程的快慢。方法二,通过单片机控制器将给定转速按一定的函数关系缓慢地增大,即相当于增加一个转速给定函数发生器。在交流感应电动机的定子铁心中,沿空间均匀分布三相绕组,各绕组轴相互错开120O.把定子三相绕组依次接到三相电源时产生一个磁场,其幅值所在的磁轴相继与各绕组轴重叠。   也就是说,三相绕组联合产生一个在空间不断移动的磁场。当三相绕组流过三相正弦电流时,则将产生一个旋转磁场。如果转子以低于旋转磁场的转速转动,那么在转子绕组和旋转磁场之间出现相对运动,而在转子绕组中产生感应电
[单片机]
<font color='red'>单片机</font>在感应电动机控制系统中的应用
单片机能运行操作系统吗
先直接上答案:可以! 但是操作系统 不是刚需 ,上操作系统比较占用单片机的资源,比如占用比较多的FLASH和RAM,间接增加了硬件成本,哪怕成本增加1毛钱,对于上量的产品,分分钟是一个工程师的工资。 我做了单片机开发10几年,大多数产品其实还是裸机编程,用到操作系统的比较少。 当然,这个跟产品功能有关,一般产品功能复杂、实时性要求苛刻的就会上操作系统。 目前用的比较多的就是 实时操作系统 ,比如主流有uC/OS-II、FreeRTOS、rt-thread。 下面,简单给大家说下3个系统各自优缺点,如有不对,请指正! 一、uC/OS-II uC/OS-II 是 Micrium 公司开发的商业实时操作系统,它的内核设计非常稳定和
[单片机]
STM32单片机电源端并联电容的重要性
如图,笔者用TQFP(32-100PIN)0.55MM转直插的转接板焊了一个STM32F207VET6的板子。板上引出了SWD调试接口(仅占用PA13和PA14),USART1串口引脚,插了一个触摸传感器和蜂鸣器模块。 所要实现的功能是:用手触碰一下触摸传感器后,蜂鸣器响一声。 接触摸传感器模块输出信号接到PA0口上。在没有接电源电容之前,每一次单片机复位(无论是软件复位还是按下复位键复位),PA0上会自动产生一个异常的高电平,要等上将近10秒才会回到低电平,然后触摸传感器才能正常工作。每次复位的时候蜂鸣器都会响一下,10秒之内按触摸键都没有反应。 后来我接了一个4.7μF的电解电容器和两个100nF的无极性电容器,问题就解决
[单片机]
用CPLD实现单片机与ISA总线接口的并行通信
CPLD(Complex Programmable Logic Device)是一种复杂的用户可编程逻辑器件,由于采用连续连接结构,易于预测延时,从而使电路仿真更加准确。CPLD是标准的大规模集成电路产品,可用于各种数字逻辑系统的设计。 近年来,由于采用先进的集成工艺和大指量生产,CPLD器件成本不断下降,集成密度、速度和性能大幅度提高,一个芯片就可以实现一个复杂的数字电路系统;再加上使用方便的开发工具,使用CPLD器件可以极大地缩短产品开发周期,给设计修改带来很大方便 。本文以 ALTERA公司的MAX7000系列为例,实现MCS51单片机与PC104ISA总线接口的并行通信。采用这种通信方式,数据传输准确高速,在 12MHz
[单片机]
用CPLD实现<font color='red'>单片机</font>与ISA总线接口的并行通信
Silicon Labs MCU助力Echo智能运动手表
Silicon Labs日前宣布,为汽车、健身、户外和移动导航提供创新GPS设备的领导厂商Magellan选择Silicon Labs的EFM32 Giant Gecko微控制器(MCU)作为Magellan Echo智能运动手表的节能型处理平台。荣获 CES 2014创新设计与工程奖 的Echo是首款具有 开放性 平台的智能运动手表,这帮助了应用程序开发者,使用户在手腕就可以看到和控制他们的应用程序。 在可穿戴和配件的新兴市场中,屡获殊荣的Magellan Echo因其创新设计脱颖而出。它的显示界面能够定制化的反映运动健身状况,包括从跑步、骑自行车、徒步旅行到高尔夫运动等,当然它也提供其他特性,例如远程控制智能手机上的
[物联网]
单片机在焊接温度测量仪中的设计
  焊接温度是关系到焊接质量的关键参数之一, 控制合适的焊接温度对保证焊接质量至关重要。焊接温度测量仪是利用凌阳单片机对红外线传感器采集的数据进行处理和控制,通过采用先进的红外测温技术,替代传统的依靠人工观察和人工调节焊接温度的手段, 实现焊接温度的控制,保证焊接质量。   传统的焊接过程中,焊接温度的控制是凭操作者人工观察和人工调节高频电源输出功率或焊接速度实现的,如果输入的焊接热量不足,就会出现低温焊接,2个待焊边缘只能达到局部熔化,氧化物难以排出焊缝,产生质量缺陷。如果焊接输入热量过大,会使焊缝边缘出现过多的熔化金属,在压力正常的情况下,由于熔化区过宽,也很难将氧化物排出焊缝。因此,焊接质量受到诸多人为因素影响,其稳定性难
[单片机]
<font color='red'>单片机</font>在焊接温度测量仪中的设计
MCS-51系列单片机指令快速记忆方法
随着微电子技术和超大规模 集成电路 技术的发展,单片微型计算机以其体积小、性价比高、功能强、可靠性高等独有的特点,在各个领域(如工业控制、家电产品、 汽车电子 、通信、智能仪器仪表)得到了广泛的应用。学习、使用 单片机 的人越来越多,而生产单片机的厂家很多,单片机种类繁杂,不知如何选择。据统计,八位单片机占全球单片机销量的65%。在八位单片机中,Intel公司的8051单片机内核已成为8位单片机事实上的标准。因此,对初学者而言,选择8051单片机来学习不失为明智的选择。    学习单片机,除了搞清单片机内部功能、存储空间分配及I/O接口外,还应掌握其指令系统。MCS-51共有111条指令,现介绍我们总结出的快速记忆MCS-51指令
[单片机]
MCU+MPU= Sitara™ AM2x
Texas Instruments(TI)日前宣布推出新的高性能微控制器(MCU)产品系列Sitara™ AM2x,用于工业应用中的实时控制,网络和边缘的分析应用。新的Sitara AM2x MCU,相较于传统基于闪存的MCU,其计算能力提高10倍,因此可缩小MCU和MPU之间的差距,以满足对工业自动化、汽车系统、能源管理等应用的智能分析,高级网络和实时控制的需求。 MCU还有什么发展潜力? “工业应用领域的终端设备有非常多的形态,对于电子控制系统的要求不同,有些需要简单控制,有些需要复杂控制。但无论如何,高性能、实时性、高集成和易用性是未来高性能工业应用所必需的。”TI中国区嵌入式与DLP®应用技术总监师英表示。 T
[嵌入式]
<font color='red'>MCU</font>+MPU= Sitara™ AM2x
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved