单片机
返回首页

PIC单片机的入门认识(以PIC12为学习目标)

2022-07-18 来源:csdn

1.学习PIC12针脚定义

针脚1及针脚8可接电源+5V和地线。针脚2.3可外接晶振。


针脚4为复位脚,当单片机正常运行时接高电平,若有一个低电平输入,单片机便复位。


针脚5则为单片机的I/O脚,可控制它为输入或输出,输入0,输入1,输出0,输出1.(0即为低电平,1即为高电平)


针脚6.7也可设置输入输出,可以控制继电器,LED灯,A/D转换器,连接喇叭输出音乐等。


2.单片机的寄存器


寄存器又称RAM,单片机的大部分工作在写入或读出寄存器。寄存器是一个能存储8位二进制的数据的单元,而每个单元都有自己的地址编码(地址编码则为十六进制)。


单片机有有专用寄存器和通用寄存器之分。


专用寄存器即该寄存器的功能已由系统分配完成,而通用寄存器则是没有事先设定,可在编程序中随机使用。


该图为PIC12CE519的ram地址地图,其中00h到06h都是专用寄存器。

该寄存器里的06h为GPIO,该寄存器内的数据可控制针脚的电平高低,上边说过每个寄存器可存储8位二进制数据,一位二进制数据便可控制一个针脚的电平,例如常数2的八位二进制为00000010,即可得数据1对应的GP1针脚输出高电平,而其他针脚输出低电平。


PS:需定义GP1为输出脚,否则无法控制GP1的电平,其他的针脚亦是如此。


3.单片机的指令


movlw 02H 

常数2进入w,H表示该数据为16进制

movwf GPIO

将W复制到GPIO中,GPIO中便有了00000010这样的数据,GP1也就输出高电平

上文曾提出过PIC单片机需先定义针脚输入输出,在这就要引进寄存器TRIS的使用。在TRIS寄存器中,同样是存储8个二进制数据对应针脚,分别定义针脚的输入输出,0即定义针脚为输出,1即定义针脚为输入。假设定义GP1,GP2为输出,则需要向TRIS写入二进制11111001,换算十六进制为F9H。


movlw 0F9H     F9H写入W

movwf TRISA    W内的数据复制如TRIS

 

 

注意:PIC12的单片机必须写成

movlw 0F9H

tris GPIO

bsf和bcf指令可以控制某个针脚的电平,bcf为降低某针脚的电平,又称清除;bsf为升高某针脚的电平,又称置位。


学习nop指令,nop可以让单片机处于空白运行状态,常用于延时的应用。


movlw OF9H

tris GPIO     定义GP1,GP2为输出针脚

bsf GPIO,GP1   升高GP1的电平,例如可点亮LED灯

nop         延时

nop

nop

nop

nop

bcf GPIO,GP2     降低GP1的电平,如熄灭LED灯

nop

nop

nop

nop

说到延时,于此,便要引进机器周期的概念,我们日常使用的LED灯都有闪烁的周期,而我们便可以用nop控制点亮熄灭LED灯的间隔,以达到控制lED闪烁。


PIC单片机里,一般的指令都为1个机器周期,而goto(即重复至某一段指令)则为2个机器周期


PIC机器周期=4/振荡频率(微妙)


已知外部晶振的频率为4Mhz,则可求出一个机器周期为4/4Mhz=1微妙


即单片机执行一个普通的指令的时间为1微妙


我们便可设计出一个频繁闪烁的LED灯


movlw 0F9H

       tris GPIO        控制GP1,2为输出针脚

myWAVE:bsf GPIO,GP1     点亮LED灯

       nop

       nop

       nop

       nop

       nop

       nop

       nop

       bcf GPIO,GP1     熄灭LED灯

       nop

       nop

       nop

       nop

       nop

goto myWAVE         单片机重复myWAVE的指令,而不是读写下一行指令

上面的代码可以看出点亮和熄灭LED灯之间间隔了8个机器周期,即8微妙,可得f=1/16=62.5Khz


当频率比较低时,便能接上一个喇叭,听到声音。


当然,频率太低的时候,需要使用大量的nop指令进行延时,这个时候就要引进incfsz指令和decfsz指令。前者是对某一寄存器内的数据进行加1,当检测到加1便至寄存器的极限时(255),下一条指令跳过,不读取下一条指令。而后者则是减1,减至为0时跳过一下条指令。


我们需要大量延时的时候,例如延时24086个周期时,用16进制表示即为5E16H


yanshi:movlw   5EH   

       movwf   0BH     

       movlw   16H

       movwf   0AH       将5E和76分别写入0BH和0AH两个通用寄存器

jixu:decfsz    0AH      开始延时,给0AH内的数据-1。当减至0时便跳过下一条指令,goto不再运行

     goto      jisu

jisu1:decfsz   0AH

     goto      jisu1        

     nop

疑问:1.似乎这跳指令并没有考虑到goto的机器周期


           2.5E放入0BH,那么0BH内的数据不应该是94吗,那么decfsz 0BH只有94次。


call指令和return指令可以让我们做出程序中内嵌另一个程序,能将一段常用的指令做成子程序,在需要该子程序时,用call命令单片机读取该子程序,子程序最后添加return便可回到主程序,这样便可大大减少汇编里的工作量,并简化程序。


注意可在子程序再嵌套子程序,但这根据单片机设计而有限制。


LEDshansuo:bcf   GPIO,GP1

           nop

           nop

           nop

           nop

           nop

           nop

           bsf    GPIO,GP1

           nop

           nop

           nop

           nop

           nop

           nop

           return

call LEDshansuo


进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • PIC单片机控制的遥控防盗报警器电路

  • 红外线探测报警器

  • 短波AM发射器电路设计图

  • 使用ESP8266从NTP服务器获取时间并在OLED显示器上显示

  • 开关电源的基本组成及工作原理

  • 用NE555制作定时器

    相关电子头条文章