PIC系列单片机程序设计基础三

发布者:脑电狂徒最新更新时间:2013-09-09 来源: dzsc关键字:PIC系列  单片机  程序设计 手机看文章 扫描二维码
随时随地手机看文章
PIC单片机的查表程序可以利用子程序带值返回的特点来实现。具体是在主程序中先取表数据地址放入W,接着调用子程序,子程序的第一条指令将W置入PC,则程序跳到数据地址的地方,再由“RETLW”指令将数据放入W返回到主程序。下面程序以F10放表头地址。

       MOVLW  TABLE     ;表头地址→F10  
       MOVWF  10
          ┋
       MOVLW  1        ;1→W,准备取“1”的线段值
       ADDWF  10,1      ;F10+W =“1”的数据地址
       CALL  CONVERT
       MOVWF  6        ;线段值置到B口,点亮LED
          ┋
   CONVERT MOVWF  2        ;W→PC TABLE
       RETLW  0C0H      ;“0”线段值
       RETLW  0F9H      ;“1”线段值
          ┋
       RETLW  90H       ;“9”线段值

   9)“READ……DATA,RESTORE”格式程序

   “READ……DATA”程序是每次读取数据表的一个数据,然后将数据指针加1,准备取下一个数据。下例程序中以F10为数据表起始地址,F11做数据指针。

       POINTER  EQU  11   ;定义F11名称为POINTER
          ┋
       MOVLW   DATA
       MOVWF   10     ;数据表头地址→F10
       CLRF   POINTER   ;数据指针清零
          ┋
       MOVF   POINTER,0  
       ADDWF 10,0      ;W =F10+POINTER
          ┋
      INCF    POINTER,1  ;指针加1
      CALL CONVERT      ;调子程序,取表格数据
          ┋
   CONVERT MOVWF   2    ;数据地址→PC
   DATA  RETLW   20H    ;数据
          ┋
      RETLW 15H      ;数据
   如果要执行“RESTORE”,只要执行一条“CLRF POINTER”即可。

   10) PIC单片机 延时程序

   如果延时时间较短,可以让程序简单地连续执行几条空操作指令“NOP”。如果延时时间长,可以用循环来实现。下例以F10计算,使循环重复执行100次。

      MOVLW D‘100’
      MOVWF 10
   LOOP  DECFSZ 10,1   ;F10—1→F10,结果为零则跳
      GOTO LOOP
       ┋
   延时程序中计算指令执行的时间和即为延时时间。如果使用4MHz振荡,则每个指令周期为1μS。所以单周期指令时间为1μS,双周期指令时间为2μS。在上例的LOOP循环延时时间即为:(1+2)*100+2=302(μS)。在循环中插入空操作指令即可延长延时时间:
       MOVLW  D‘100’
       MOVWF  10
   LOOP   NOP
       NOP
       NOP
       DECFSZ 10,1
       GOTO LOOP
        ┋
   延时时间=(1+1+1+1+2)*100+2=602(μS)。
   用几个循环嵌套的方式可以大大延长延时时间。下例用2个循环来做延时:
       MOVLW   D‘100’
       MOVWF   10
   LOOP  MOVLW   D‘16’
       MOVWF   11
   LOOP1  DECFSZ   11,1
       GOTO    LOOP1
       DECFSZ   10,1
       GOTO LOOP
       ┋
   延时时间=1+1+[1+1+(1+2)*16-1+1+2]*100-1=5201(μS)[page]

   11) PIC单片机RTCC计数器的使用

   RTCC是一个脉冲计数器,它的计数脉冲有二个来源,一个是从RTCC引脚输入的外部信号,一个是内部的指令时钟信号。可以用程序来选择其中一个信号源作为输入。RTCC可被程序用作计时之用;程序读取RTCC寄存器值以计算时间。当RTCC作为内部计时器使用时需将RTCC管脚接VDD或VSS,以减少干扰和耗电流。下例程序以RTCC做延时:
       RTCC  EQU  1
       ┋
       CLRF  RTCC    ;RTCC清0
       MOVLW  07H
       OPTION    ;选择预设倍数1:256→RTCC
   LOOP  MOVLW  255   ;RTCC计数终值
       SUBWF  RTCC,0
       BTFSS STATUS,Z   ;RTCC=255?
       GOTO LOOP
        ┋
   这个延时程序中,每过256个指令周期RTCC寄存器增1(分频比=1:256),设芯片使用4MHz振荡,则:
   延时时间=256*256=65536(μS)
   RTCC是自振式的,在它计数时,程序可以去做别的事情,只要隔一段时间去读取它,检测它的计数值即可。

   12) 寄存器体(BANK)的寻址

   对于PIC16C54/55/56,寄存器有32个,只有一个体(BANK),故不存在体寻址问题,对于PIC16C57/58来说,寄存器则有80个,分为4个体(BANK0-BANK3)。在对F4(FSR)的说明中可知,F4的bit6和bit5是寄存器体寻址位,其对应关系如下:
Bit6  Bit5
BANK
物理地址
 0    0
BANK0
10H~1FH
 0    1
BANK1
30H~3FH
 1    0
BANK2
50H~5FH
 1    1
BANK3
70H~7FH

  当芯片上电RESET后,F4的bit6,bit5是随机的,非上电的RESET则保持原先状态不变。
   下面的例子对BANK1和BANK2的30H及50H寄存器写入数据。
   例1.(设目前体选为BANK0)
       BSF   4,5    ;置位bit5=1,选择BANK1
       MOVLW  DATA
       MOVWF  10H    ; DATA→30H
       BCF   4,5
       BSF   4,6   ;bit6=1,bit5=0选择BANK2
       MOVWF  10H    ;DATA→50H

   从上例中我们看到,对某一体(BANK)中的寄存器进行读写,首先要先对F4中的体寻址位进行操作。实际应用中一般上电复位后先清F4的bit6和bit5为0,使之指向BANK0,以后再根据需要使其指向相应的体。

   注意,在例子中对30H寄存器(BANK1)和50H寄存器(BANK2)写数时,用的指令“MOVWF 10H”中寄存器地址写的都是“10H”,而不是读者预期的“MOVWF 30H”和“MOVWF 50H”,为什么?

   让我们回顾一下指令表。在PIC16C5X单片机的所有有关寄存器的指令码中,寄存寻址位都只占5个位:fffff,只能寻址32个(00H—1FH)寄存器。所以要选址80个寄存器,还要再用二位体选址位PA1和PA0。当我们设置好体寻址位PA1和PA0,使之指向一个BANK,那么指令“MOVWF 10H”就是将W内容置入这个BANK中的相应寄存器内(10H,30H,50H,或70H)。

   有些设计者第一次接触体选址的概念,难免理解上有出入,下面是一个例子:
   例2:(设目前体选为BANK0)
       MOVLW  55H 
       MOVWF  30H   ;欲把55H→30H寄存器
       MOVLW  66H
       MOVWF  50H   ;欲把66H→50H寄存器
   以为“MOVWF 30H”一定能把W置入30H,“MOVWF 50H”一定能把W置入50H,这是错误的。因为这两条指令的实际效果是“MOVWF 10H”,原因上面已经说明过了。所以例2这段程序最后结果是F10H=66H,而真正的F30H和F50H并没有被操作到。

   建议:为使体选址的程序清晰明了,建议多用名称定义符来写程序,则不易混淆。   例3:假设在程序中用到BANK0,BANK1,BANK2的几个寄存器如下:

< p>
BANK0
地址
BANK1
地址
BANK2
地址
BANK3
地址
A
10H
B
30H
C
50H
·
70H
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·

 

关键字:PIC系列  单片机  程序设计 引用地址:PIC系列单片机程序设计基础三

上一篇:文字电话的液晶显示与实现
下一篇:PIC系列单片机程序设计基础四

推荐阅读最新更新时间:2024-03-16 13:27

AVR单片机的TC0定时溢出例程
程序生成向导配置TC0,溢出中断,产生1ms/20ms延时。 定时公式:Time=PRE*(MAX-TCNT0+1)/F_cpu单位S ,其中,PRE为与分频数 #include iom16v.h #include macros.h void port_init(void) { PORTA = 0xFF; DDRA = 0x00; PORTB = 0xFF; DDRB = 0xFF; PORTC = 0xFF; //m103 output only DDRC = 0x00; PORTD = 0xFF; DDRD = 0x00; } //TIMER0 initialize - prescale:8/256 // WGM
[单片机]
怎样辨别单片机的内部晶振与外部晶振
  单片机的外部晶振稳定,受温度,湿度等环境因素影响比内部振荡器小,精度比较高。而且当设计需要降低功耗时,比如说便携式仪表等,就需要外设晶振,因为内部振荡器不能根据需要停止,而外部晶振可以适时停止,从而进入休眠状态,降低功耗。   而单片机的内部晶振一般不够准确,误差比较大。但是单片机的内部晶振和外部晶振的作用都是一样的,给系统提供时钟。如果对频率要求不高的话(比如不涉及串口通信和精确定时等的话),用内部晶振就足够了,并且这样成本还低。内部时钟,频率受温度等其它影响,但是能省下晶振的钱,还有2个I/O.所以,如果对频率要求不高,一般是优先选用内部振荡。 假如你想要省电,用了SLEEP,那你就不能用内部振荡了,内部振荡回停止!
[单片机]
MCU--时间片&分时轮询
1、任务调度 任务调度对于电子类或者自动化类专业小伙伴最早接触一般都是在接触RTOS后了,然而对于计算机相关专业的小伙伴应该在学《计算机操作系统》老师对这一块讲解的非常清楚了,包括一些性能指标的定义与计算等等,不过作者这里仅仅只针对RTOS进行讲解,大家感兴趣可以找一下操作系统的书籍更加深入学习。 大家都知道我们的操作系统可以隐蔽底层实现,为用户提供API接口来供我们的应用程序服务,同时操作系统可以管理多个任务实现CPU的最大利用率,然而对于RTOS提供的最主要功能就是任务的调度来管理多个任务。 任务的调度简单一点的说就是确定任务该怎么执行的一种机制,这种涉及到策略的问题其实都可以归纳为算法问题,从而也就会出现了各种各样的
[单片机]
<font color='red'>MCU</font>--时间片&分时轮询
MathWorks 和 Green Hills Software 使用 Infineon AURIX™ 微控制器开发安全集成
MathWorks 和 Green Hills Software 使用 Infineon AURIX™ 微控制器开发安全相关应用的集成 中国 北京,2023 年 3 月 14 日 —— 领先的数学计算软件开发商 MathWorks 和嵌入式软件安全与安保领域的全球领先者 Green Hills Software 宣布了一项集成,帮助工程师使用 Simulink® 为 Infineon AURIX™ TC4x 系列汽车微控制器设计安全相关应用。 使用新微控制器系列的工程师可以通过 Green Hills Software 对 AURIX 的支持自动编译 Embedded Coder® 生成的代码,然后使用处理器在环(PIL)仿真
[嵌入式]
MathWorks 和 Green Hills Software 使用 Infineon AURIX™ <font color='red'>微控制器</font>开发安全集成
单片机简谱程序
#i nclude #i nclude SoundPlay.h void Delay1ms(unsigned int count) { unsigned int i,j; for(i=0;i for(j=0;j 120;j++); } //*****************************Mus IC ****************************** //挥着翅膀的女孩 unsigned char code Music_Girl ={ 0x17,0x02, 0x17,0x03, 0x18,0x03, 0x19,0x02, 0x15,0x03, 0x16,0x03, 0x17,0x03, 0x
[单片机]
基于AT89C52的液晶显示的实现
1 引言 随着单片机应用领域的不断扩大,用单片机控制汉字显示已成为一种单片机发展的必然趋势。以前那种将汉字点阵编码存入ROM ,在显示时再调用的方法已经不能适应当前的需求。好的应用所能显示的决不能仅仅局限于显示事先定义好的个别汉字,而应该提供直接使用至少包含国家标准的一、二级汉字字库的功能。 2 芯片器件介绍 2.1 AT89C52单片机 AT89C52单片机是EPROM型单片机,可寻址64KB字节的程序存储器和64KB字节的外部数据存储器。 以单片机为核心,配以一定的外围电路和软件,实现某些功能,就组成了单片机应用系统。 2.2 液晶显示模块 我们选用北京精电蓬远公司的VPG12864T液晶显示模块,内置T69
[单片机]
基于AT89C52的液晶显示的实现
基于LabVIEW的单片机温度自动测试系统
1 引 言 LabVIEW是美国国家仪器公司(National Instru-ment)开发的一种虚拟仪器平台,他是一种用图标代码来代替文本式编程语言创建应用程序的开发工具。Lab-VIEW功能强大,提供了丰富的数据采集、分析和存储库函数以及包括DAQ,GPIB,PXI,VXI,RS 232/485在内的各种仪器通信总线标准的所有功能函数。利用LabVIEW设计的数据采集系统,可模拟采集各种信号,但是配备NI公司的数据采集板卡比较贵,在实际开发中可选用单片机小系统对数据进行采集。 冷库是发展冷藏业的基础设施,也是在低温条件下贮藏货物的建筑群。食品保鲜主要以食品冷藏链为主,将易腐畜禽、水产、果蔬、速冻食品通过预冷、加工、贮存和冷
[测试测量]
基于LabVIEW的<font color='red'>单片机</font>温度自动测试系统
单片机上实现动态加载功能的函数库介绍
dynamic_loader介绍 本项目是一个在单片机(如:STM32)上实现动态加载功能的函数库,与Windows中的dll,Linux中的so类似,可以将代码动态地从其他的存储介质,动态加载到RAM中。 软件架构 本项目文件夹有三个,其中common存储了用于生成可重定位的.axf文件的工程与动态加载器工程交互用的函数,src提供动态加载器的源码,rel_axf_project_template提供了一个简单的可重定位的.axf文件的工程示例,example.c是一个简单的使用示例,所有文件的主要功能如下: /common/dl_extern_lib.h 描述了app程序用于调用host程序的函数向量表的基地址,以及相关的
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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