已阅读5页,还剩45页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第7章定时 计数器 7 1STC12C5A60S2单片机的定时 计数器 7 3STC12C5A60S2单片机的PCA模块 7 2STC12C5A60S2单片机的可编程时钟输出 在计算机控制中可供选择的定时方法 1 软件定时执行一个循环程序来实现 2 硬件定时定时全部由硬件电路完成 不占用CPU时间 但需要通过改变电路的元件参数来调节定时时间 在使用控制上不够方便 同时增加了开发成本 3 可编程定时器定时由单片机内部的定时模块单元完成 STC12C5A60S2单片机内部有 1 两个16位的定时 计数器 不仅可以方便地用于定时控制 而且还可以用作分频器和用于事件记录 2 可编程时钟输出功能 可用于给外部器件提供时钟 3 两路可编程计数器阵列 ProgrammableCounterArray PCA 可用于软件定时器 外部脉冲的捕捉 高速输出以及脉宽调制 PulseWidthModulation PWM 输出 7 1STC12C5A60S2单片机的定时 计数器 7 1 1定时 计数器的结构及工作原理 定时 计数器的核心是一个加1计数器 加1计数器的脉冲有两个来源 一个是外部脉冲源 另一个是系统的时钟振荡器 计数器对两个脉冲源之一进行输入计数 每输入一个脉冲 计数值加1 当计数到计数器为全1时 再输入一个脉冲就使计数值回零 同时从最高位溢出一个脉冲使特殊功能寄存器TCON 定时器控制寄存器 的某一位TF0或TF1置1 作为计数器的溢出中断标志 单片机中的微处理器 寄存器TCON和TMOD与定时 计数器T0 T1之间的关系 7 1 2定时 计数器的相关寄存器 1 定时器工作方式控制寄存器TMOD 地址为89H 复位值为00H M0 M1 C T GATE M0 M1 C T GATE 定时器0 定时器1 定时器 D0 D1 D2 D3 D4 D5 D6 D7 位号 1 M1和M0 方式选择控制位 2 C 功能选择位 用于 计数器 或 定时器 功能的选择 3 GATE 门控位 GATE用于选通控制 位名称 2 定时器控制寄存器TCON 地址为88H 复位值为00H 1 TF1 定时器 计数器1溢出标志位 2 TR1 定时器T1的运行控制位 3 TF0 定时器 计数器0溢出标志位 4 TR0 定时器T0的运行控制位 TCON的0 3位与外部中断有关 IT0 IE0 IT1 IE1 TR0 TF0 TR1 TF1 位名称 D0 D1 D2 D3 D4 D5 D6 D7 位号 3 AUXR 辅助寄存器 地址为8EH 复位值为00H ELVDI ESPI EADCI UART M0 x6 T1x12 T0 x12 位名称 D0 D1 D2 D3 D4 D5 D6 D7 位号 与定时器速度相关的控制位有 1 T0 x12 定时器0速度控制位 0 定时器0的速度是传统8051单片机定时器的速度 即12分频 1 定时器0的速度是传统8051单片机定时器速度的12倍 即不分频 2 T1x12 定时器1速度控制位 0 定时器1的速度是传统8051单片机定时器的速度 即12分频 1 定时器1的速度是传统8051单片机定时器速度的12倍 即不分频 如果UART串口用T1作为波特率发生器 T1x12位决定UART串口是12T还是1T UART M0 x6 BRTR S2SMOD BRTx12和S1BRS用于控制UART串口的速度 EXTRAM用于设置是否允许使用内部1024字节的扩展RAM 7 1 3定时 计数器的工作方式 方式0和方式1 方式2 方式3 当工作于定时状态时 定时 计数器是对时钟周期进行计数 若对时钟进行12分频 则对每12个时钟周期计数 当晶振频率为6MHz 采用12分频时 计数的单位时间间隔为单位时间间隔Tu 定时时间为 TC XTu 其中 Tu为单位时间间隔 TC为定时时间 7 1 4定时 计数器量程的扩展 STC12C5A60S2单片机中提供的定时 计数器可以使用户很方便地实现定时和对外部事件计数 但是在实际应用中 需要的定时时间或计数值可能超过定时 计数器的定时或计数能力 特别是当单片机的系统时钟频率较高时 定时能力就更为有限 为了满足需要 有时需要对单片机的定时计数能力进行扩展 定时能力和计数能力扩展的方法相同 在此主要对定时能力的扩展进行讨论 计数能力的扩展可参考定时能力扩展的方法进行 s 2 s STC12C5A60S2单片机的定时器 计数器0或1是对脉冲进行不断加1进行计数的 因此 不能直接将实际的计数值作为计数初值送入计数寄存器THX TLX中 而必须将实际计数值以28 213 216为模求补 以补码作为计数初值设置THX和TLX 即应装入计数 定时器的初值为 n 8 13或16 系统时钟频率为6MHz 进行12分频时 定时器的最大定时能力 扩展方法 1 软件扩展方法扩展方法是在定时器中断服务程序中对定时器中断请求进行计数 当中断请求的次数达到要求的值时才进行相应的处理 例如 某事件的处理周期为1s 但由于受到最大定时时间的限制 无法一次完成定时 此时可以将定时器的定时时间设为以10ms为一个单位 启动定时器后的每一次定时器溢出中断产生10ms的定时 进入中断服务程序后 对定时器的中断次数进行统计 每100次定时器溢出中断进行一次事件的处理 然后再以同样的方式进入下一个周期的事件处理 2 硬件扩展方法硬件扩展方法可以使用外接通用定时器芯片对单片机的定时能力进行扩展 如使用定时 计数器芯片8253 也可以利用单片机自身的资源对定时能力进行扩展 由于单片机的定时器没有对外输出引脚 所以两个16位的定时 计数器不能直接连在一起 可以通过单片机的端口P0 P3实现连接 下图给出了一种具体的连接方法 1 T0设置为16位定时器方式 当T0溢出时 执行T0的中断服务程序 在T0的中断服务程序中将P1 0取反 这样在P1 0将输出一个方波 其周期为T0定时时间的2倍 设T0的定时时间为TIME 则由P1 0输出的方波的周期为2 TIME 2 T1设置为16位计数器方式 将P1 0输出的方波接到T1的定时器外部输入端T1 P3 5 作为定时 计数器1的外部计数脉冲 其每个周期的下降沿使T1加1 设计数器T1的计数脉冲数为COUNT 则当T1溢出时 总定时时间T为 T 2 TIME COUNT 7 1 5定时 计数器编程举例 定时 计数器的应用编程主要有两点 一是能正确初始化 包括写入控制字 进行时间常数的计算并装入 二是中断服务程序的编写 即在中断服务程序中编写实现定时完成的任务代码 一般情况下 定时 计数器初始化部分的步骤大致如下 1 设置工作方式 将控制字写入TMOD寄存器 2 设置分频方式 将控制字写入AUXR寄存器 默认的情况是12分频 兼容传统8051单片机 因此 如果使用传统8051单片机模式 可以不进行设置 3 把定时 计数初值装入TLX THX寄存器 4 置位ETX允许定时 计数器中断 如果需要 5 置位EA使CPU开放中断 6 置位TRX以启动定时 计数 例7 1 设系统时钟频率为6MHz 利用定时器T0定时 每隔1s将P2 0的状态取反 思路 将定时器的定时时间设为50ms 在中断服务程序中对定时器溢出中断请求进行计数 当计够20次时 将P2 0的状态取反 否则直接返回主程序 选择定时器T0的工作方式 软件启动 定时方式 16位定时器 方式字为01H 由于系统时钟频率为6MHz 12分频时 计数单位为2 s 定时器T0的装入初值为 汇编语言程序代码如下 INCLUDE STC12C5A INC 包含STC12C5A60S2寄存器定义文件ORG0000HLJMPMAIN 转主程序ORG000BH T0中断服务程序入口地址LJMPT0 ISRORG0100HMAIN MOVSP 60H 设置堆栈指针MOVTMOD 01H T0初始化MOVTL0 58HMOVTH0 9EHMOVA 20 累加器A置20SETBET0 允外T0中断SETBEA CPU开中断SETBTR0 启动T0计数SJMP 等待T0 ISR MOVTL0 58HMOVTH0 9EH 重新装入时间常数DECA 累加器A内容减1JNZEXITCPLP2 0MOVA 20 累加器A重载20EXIT RETIEND 对应的C语言程序如下 include stc12c5a h 包含STC12C5A60S2的寄存器定义文件sbitP20 P2 0 声明P2 0的引脚位变量unsignedchari 声明计数变量 在C语言程序中 尽量不要使用ACCvoidmain void SP 0 x60 使用C语言设计程序时 可以不设置堆栈指针TMOD 0 x01 TL0 0 x58 TH0 0 x9E i 20 计数变量赋初值ET0 1 允许T0中断EA 1 开放总的中断TR0 1 启动T0计数while 1 等待中断 voidT0 ISR void interrupt1 定时器T0中断函数 TL0 0 x58 重新装入时间常数TH0 0 x9E i 计数变量减1if i 0 若减到0 则将P2 0取反P20 P20 将P2 0取反i 20 重新给计数变量赋值 解 以T0为例 下面列出实现这一方法的关键代码 完整的程序 请读者自行编写 MOVTMOD 09H T0初始化 T0工作于方式1 定时 GATE置1MOVTL0 00HMOVTH0 00HJNBP3 2 等待升高SETBTR0JBP3 2 等待下降CLRTR0 关T0MOVA TL0 T0内容高8位送B 低8位送AMOVB TH0 计算脉宽或送显示器显示 例7 2 利用定时器的门控方式可以实现正脉冲的脉宽测量 当GATE 1 TRX 1 只有 INTX引脚输入高电平时 TX才被允许计数 利用这一特点 可测量 INTX引脚上正脉冲的宽度 如下图所示 注意教材上的思考问题 定时 计数器应用中应注意的问题 1 定时 计数器的实时性大多数应用场合可忽略不计 但对某些要求实时性苛刻的场合 应采用补偿措施 2 动态读取运行中的计数值在动态读取运行中的定时 计数器的计数值时 如果不加注意 就可能出错 这是因为不可能在同一时刻同时读取THX和TLX中的计数值 一种可避免读错的方法是 先读THX 后读TLX 重读THX 将两次读得的THX进行比较 若两次读得的值相等 则可确定读的值是正确的 否则重复上述过程 重复读得的值一般不会再错 7 2STC12C5A60S2单片机的可编程时钟输出 STC12C5A60S2单片机提供了3路可编程时钟输出功能 7 2 1可编程时钟输出的相关寄存器 1 掉电唤醒寄存器WAKE CLKO 地址为8FH 复位值为00000000B T0CLKO T1CLKO BRTCLKO LVD WAKE T1 PIN IE T1 PIN IE RXD PIN IE PCAWAKEUP 位名称 D0 D1 D2 D3 D4 D5 D6 D7 位号 1 BRTCLKO 是否允许P1 0 CLKOUT2 脚输出时钟 0 不允许BRT在P1 0 CLKOUT2 脚输出时钟 1 允许P1 0 CLKOUT2 脚输出时钟 输出时钟频率 BRT溢出率 22 T1CLKO 是否允许T1 P3 5 脚输出溢出脉冲 0 不允许T1 P3 5 脚输出溢出脉冲 1 允许T1 P3 5 脚输出溢出脉冲 输出时钟频率 T1溢出率 23 T0CLKO 是否允许T0 P3 4 脚输出溢出脉冲 0 不允许T0 P3 4 脚输出溢出脉冲 1 允许T0 P3 4 脚输出溢出脉冲 输出时钟频率 T0溢出率 2 2 辅助寄存器AUXR 地址为8EH 复位值为00H S1BRS EXTRAM BRTx12 S2SMOD BRTR UART M0 x6 T1x12 T0 x12 位名称 D0 D1 D2 D3 D4 D5 D6 D7 位号 其中 与CLKOUT2 P1 0时钟输出有关的位有 1 BRTx12 CLKOUT2 P1 0的时钟输出频率控制位 0 独立波特率发生器工作在12T模式 CLKOUT2工作在12T模式时的输出频率CLKOUT2 Fosc 2 12 256 BRT 1 独立波特率发生器工作在1T模式 CLKOUT2工作在1T模式时的输出频率CLKOUT2 Fosc 2 256 BRT 2 BRTR 独立波特率发生器运行控制位 0 不允许独立波特率发生器运行 1 允许独立波特率发生器运行 如果需要从CLKOUT2 P1 0脚输出时钟 需要在用户程序中进行下面的设置 1 对BRT寄存器送8位重装载值 使用 BRT reload data 语句 2 对AUXR寄存器中的BRTR位置1 让独立波特率发生器运行 3 对WAKE CLKO寄存器中的BRTCLKO位置1 让独立波特率发生器的溢出在P1 0口输出时钟 7 2 2可编程时钟输出的编程实例 例7 3 设时钟频率Fosc 18 432MHz 设计程序 从P1 0 CLKOUT2引脚输出频率为124 540KHz的时钟 从T0 P3 4 引脚输出频率为125KHz的时钟 从T1 P3 5 引脚输出频率为38 4KHz的时钟 解 使用STC12C5A60S2的可编程时钟输出功能完成所需要求 在下面的程序设计中 在此只给出C语言程序 T0 T1和独立波特率发生器BRT均工作在1T模式 程序编制如下 include stc12c5a h 包含STC12C5A60S2的寄存器定义头文件voidmain void TMOD 0 x22 T0和T1工作在方式2 8位自动重装计数器AUXR AUXR 0 x80 T0工作在1T模式AUXR AUXR 0 x40 T1工作在1T模式AUXR AUXR 0 x04 独立波特率发生器工作在1T模式 设置BRT的8位自动重装计数初值 输出时钟频率124 540KHzBRT 256 74 设置T0的8位自动重装计数初值 输出频率18432000 2 74 124540 54约为125KHzTH0 256 74 设置T1的8位自动重装计数初值 输出时钟频率18432000 2 240 38400HzTH1 256 240 WAKE CLKO WAKE CLKO 0 x07 允许T0 T1 独立波特率发生器输出时钟TR0 1 启动T0开始计数 对系统时钟进行分频输出TR1 1 启动T1开始计数 对系统时钟进行分频输出AUXR AUXR 0 x10 启动BRT工作 对系统时钟进行分频输出 至此时钟已经输出 用户可以通过示波器观看到输出的时钟频率while 1 7 3STC12C5A60S2的可编程计数器阵列模块 7 3 1PCA模块的结构 PCA PWM含有一个特殊的16位定时器 有2个16位的捕获 比较模块与之相连 模块0连接到P1 3 CCP0 可以通过AUXR1寄存器设置切换到P4 2 CCP0 MISO口 模块1连接到P1 4 CCP1 可以通过AUXR1寄存器设置切换到P4 3 CCP1 SCLK口 每个模块可编程工作在4种模式 上升 下降沿捕获 软件定时器 高速输出或可调制脉冲输出 16位PCA定时器 计数器的结构 寄存器CH和CL的内容是自动递增计数的16位PCA定时器的值 PCA定时器的时钟源有以下几种 1 12振荡频率 1 8振荡频率 1 6振荡频率 1 4振荡频率 1 2振荡频率 振荡频率 定时器0溢出或ECI脚的输入 P1 2 定时器的计数源可通过设置特殊功能寄存器CMOD的CPS2 CPS1和CPS0位选择其中一种 CMOD中的CIDL位用于控制空闲模式下是否允许停止PCA CMOD中的ECF位用于中断控制 置位时 使能PCA中断 当PCA定时器溢出时 PCA计数溢出标志CF置位 CCON中的CR位是PCA的运行控制位 CR 1时 运行PCA CR 0时 关闭PCA CCON中还包括PCA定时器标志 CF 以及各个模块的标志 CCF1 CCF0 当PCA计数器溢出时 CF位置位 如果CMOD寄存器的ECF位置位 就产生中断 CF位只能通过软件清除 CCON寄存器中的CCF0是PCA模块0的标志 CCF1是模块1的标志 当发生匹配或比较时由硬件置位 这些标志也只能通过软件清除 所有模块共用一个中断向量 可以在中断服务程序中判断CCF0和CCF1 以确定到底是哪个模块产生了中断 7 3 2PCA PWM模块的特殊功能寄存器 1 PCA工作模式寄存器CMOD 地址为D9H 复位值为0XXX0000B ECF CPS0 CPS1 CPS2 CIDL 位名称 D0 D1 D2 D3 D4 D5 D6 D7 位号 1 CIDL 空闲模式下是否停止PCA计数的控制位 CIDL 0时 空闲模式下PCA计数器继续计数 CIDL 1时 空闲模式下PCA计数器停止计数 2 CPS2 CPS1 CPS0 PCA计数脉冲源选择控制位 PCA计数脉冲选择如表7 3所示 见教材 3 ECF PCA计数器溢出中断使能位 ECF 1时 允许寄存器CCON中CF位的中断 ECF 0时 禁止寄存器CCON中CF位的中断 2 PCA控制寄存器CCON 地址为D8H 复位值为00XXXX00B CCF0 CCF1 CR CF 位名称 D0 D1 D2 D3 D4 D5 D6 D7 位号 1 CF PCA计数器溢出标志位 当PCA计数器溢出时 CF位由硬件置位 如果CMOD寄存器的ECF位置位 CF标志可用来产生中断 CF位可通过硬件或软件置位 但只能通过软件清零 2 CR PCA计数器的运行控制位 通过软件置位CR位时 启动PCA计数器计数 清零CR位时 关闭PCA计数器 3 CCF1 CCF0 PCA各个模块的标志 CCF0对应模块0 CCF1对应模块1 当发生匹配或比较时由硬件置位相应的标志位 这些标志只能通过软件清除 3 PCA比较 捕获工作模式寄存器CCAPMn n 0 1 下同 地址分别对应DAH和DBH 复位值均为X0000000B 1 ECOMn 允许比较器功能控制位 ECOMn 1时 允许比较器功能 2 CAPPn 正捕获控制位 CAPPn 1时 允许上升沿捕获 3 CAPNn 负捕获控制位 CAPNn 1时 允许下降沿捕获 4 MATn 匹配控制位 当MATn 1时 PCA计数值与模块的比较 捕获寄存器的值匹配时 将置位CCON寄存器的中断标志位CCFn 5 TOGn 翻转控制位 当TOGn 1时 工作于PCA高速输出模式 PCA计数器的值与模块的比较 捕获寄存器的值匹配时 将使CEXn脚 CEX0 P3 7 CEX1 P3 5 CEX2 P2 0 CEX3 P2 4 翻转 6 PWMn 脉宽调制模式 当PWMn 1时 CEXn脚用作脉宽调制输出 7 ECCFn 使能CCFn中断 使能寄存器CCON的比较 捕获标志CCFn 用来产生中断 位名称 ECCFn PWMn TOGn MATn CAPNn CAPPn ECOMn 位号 D0 D1 D2 D3 D4 D5 D6 D7 PCA模块的工作模式设定 16位高速输出 4DH X 0 1 1 0 0 1 16位软件定时器 49H X 0 0 1 0 0 1 16位捕获模式 由CEXn的跳变触发 31H X 0 0 0 1 1 X 16位捕获模式 由CEXn的下降沿触发 11H X 0 0 0 1 0 X 16位捕获模式 由CEXn的上升沿触发 21H X 0 0 0 0 1 X 8位PWM输出 由低变高或者由高变低均可产生中断 73H 1 1 0 0 1 1 1 8位PWM输出 由高变低可产生中断 53H 1 1 0 0 1 0 1 8位PWM输出 由低变高可产生中断 63H 1 1 0 0 0 1 1 8位PWM 无中断 42H 0 1 0 0 0 0 1 无此操作 00H 0 0 0 0 0 0 0 模块功能 可设数值 ECCFn PWMn TOGn MATn CAPNn CAPPn ECOMn 4 PCA PWM模块寄存器PCA PWMn n 0 1 分别对应模块0和模块1 地址分别为F2H和F3H 复位值均为XXXXXX00B 1 EPCnH 在PWM模式下 与CCAPnH组成9位数 2 EPCnL 在PWM模式下 与CCAPnL组成9位数 5 PCA的16计数器低8位CL和高8位CH 它们用于保存PCA的装载值 6 PCA捕捉 比较寄存器CCAPnL 低位字节 和CCAPnH 高位字节 用于保存各个模块的捕捉计数值 EPCnL EPCnH 位名称 D0 D1 D2 D3 D4 D5 D6 D7 位号 7 3 3PCA PWM模块的工作模式 1 捕获模式 2 16位软件定时器模式 3 高速输出模式 4 脉宽调节模式 开漏 开漏 PWM无效 仅为输入 高阻 强推挽输出 强上拉输出 要加输出限流电阻1K 10K 强推挽输出 强上拉输出 强推挽输出 强上拉输出 要加输出限流电阻1K 10K 弱上拉 准双向口 PWM输出时的状态 PWM之前的状态 I O口作为PWM使用时的状态 7 3 4PCA PWM模块的应用 1 设置PCA模块的工作方式 将控制字写入CMOD CCON和CCAPMn寄存器 2 设置捕捉寄存器CCAPnL 低位字节 和CCAPnH 高位字节 初值 3 根据需要 开放PCA中断 将ECF ECCF0 ECCF1需要置1的置1 并将EA置1 4 启动PCA计数器 CH CL 计数 使CR 1 例7 4 利用PCA模块扩展外部中断 将P1 3 PCA模块0的外部输入 扩展为下降沿触发的外部中断 将P1 4 PCA模块1的外部输入 扩展为上升沿 下降沿都可触发的外部中断 当P1 3出现下降沿时产生中断 对P1 5取反 当P1 4出现下降沿或上升沿时都产生中断 对P1 6取反 P1 5和P1 6可连接LED指示灯指示状态 解 当PCA模块工作在捕获模式时 对外部输入CEXn的跳变进行采样 当采样到有效跳变时 PCA硬件将PCA计数器阵列寄存器 CH和CL 的值装载到捕获寄存器 CCAPnH和CCAPnL 中 如果CCON中的CCFn位和CCAPMn中的ECCFn位被置位 将产生中断 由此 可以将PCA模块作为扩展外部中断使用 按照要求 设置控制字时 PCA模块0应设为下降沿捕获 即CAPP0 0并且CAPN0 1 PCA模块1应设为上升沿和下降沿都能捕获的方式 即CAPP1 1并且CAPN1 1 汇编语言程序清单如下 INCLUDE STC12C5A INC 包含STC12C5A60S2寄存器定义文件LED PCA0EQUP1 5LED PCA1EQUP1 6ORG0000HLJMPMAIN 转主程序ORG003BH PCA中断LJMPPCA ISRORG0050HMAIN MOVSP 70H 初始化PCAMOVCMOD 10000000B 空闲模式下停止PCA计数器工作 PCA时钟源为FOSC 12 禁止PCA计数器溢出时中断MOVCCON 00H 清零PCA计数器溢出中断请求标志位CF CR 0 不允许PCA计数器计数 清零PCA各模块中断请求标志位CCFnMOVCL 00H 清零PCA计数器MOVCH 00HMOVCCAPM0 11H 设置PCA模块0下降沿触发捕捉功能 ECCF0 1MOVCCAPM1 31H 模块1上升 下降沿均可触发捕捉功能 ECCF1 1SETBEA 开整个单片机所有中断共享的总中断控制位SETBCR 启动PCA计数器 CH CL 计数SJMP 循环等待中断 PCA中断服务程序 PCA ISR JNBCCF0 Not PCA0 如果CCF0不等于1 则不是PCA模块0中断 直接去判是否是PCA模块1中断 PCA模块0中断服务程序CPLLED PCA0 LED PCA0取反 表示PCA模块0发生了一次中断CLRCCF0 清PCA模块0中断标志Not PCA0 JNBCCF1 PCA Exit CCF1不等于1 不是PCA模块1中断 直接退出 PCA模块1中断服务程序CPLLED PCA1 LED PCA1取反 表示PCA模块1发生了一次中断CLRCCF1 清PCA模块1中断标志PCA Exit RETIEND C语言版本的程序如下 include stc12c5a h 包含STC12C5A60S2寄存器定义文件sbitLED PCA0 P1 5 sbitLED PCA1 P1 6 voidmain void CMOD 0 x80 空闲模式下停止PCA计数器工作 PCA时钟源为FOSC 12 禁止PCA计数器溢出时中断CCON 0 清零PCA计数器溢出中断请求标志位CF CR 0 不允许PCA计数器计数 PCA各模块中断请求标志位CCFn清零CL 0 PCA计数器清零CH 0 CCAPM0 0 x11 设置PCA模块0下降沿触发捕捉功能CCAPM1 0 x31 设置PCA模块1上升 下降沿均可触发捕捉功能EA 1 开整个单片机所有中断共享的总中断控制位CR 1 启动PCA计数器 CH CL 计数while 1 等待中断 voidPCA ISR void interrupt7 PCA中断服务程序 if CCF0 PCA模块0中断服务程序 LED PCA0 LED PCA0 LED PCA0取反 表示PCA模块0发生了中断CCF0 0 清PCA模块0中断标志 elseif CCF1 PCA模块1中断服务程序 LED PCA1 LED PCA1 LED PCA1取反 表示PCA模块1发生了中断CCF1 0 清PCA模块1中断标志 例7 5 利用PCA功能做定时器使用 利用PCA模块的软件定时功能 实现在P1 6输出脉冲宽度为1秒钟的方波 假设晶振频率fosc 18 432MHz 解 在此选择PCA模块0实现定时功能 通过置位CCAPM0寄存器的ECOM位和MAT位 使PCA模块0工作于软件定时器模式 定时时间的长短 取决于时钟源的选择以及PCA计数器计数值的设置 本例中 时钟频率FOSC 18 432MHz 可以选择PCA模块的时钟源为FOSC 12 基本定时时间单位T为5ms 对5ms计数200次以后 即可实现1s的定时 通过计算 PCA计数器计数值为1E00H 可在中断服务程序中 将该值赋给 CCAP0H CCAP0L 汇编语言程序清单如下 INCLUDE STC12C5A inc 包含STC12C5A60S2寄存器定义文件COUNTEREQU30H 声明一个计数器 用来计数中断的次数LED 1sEQUP1 6ORG0000HLJMPMAIN 转主程序ORG003BH PCA中断入口地址LJMPPCA ISRORG0050HMAIN MOVSP 70HMOVCOUNTER 200 设置COUNTER计数器初值 初始化PCA模块MOVCMOD 10000000B 空闲模式下停止PCA计数器工作 选择PCA的时钟源为fOSC 12 禁止PCA计数器溢出时中断MOVCCON 00H 清零PCA计数器溢出中断请求标志位CF CR 0 不允许PCA计数器计数 清零PCA各模块中断请求标志位CCFnMOVCL 00H 清零PCA计数器MOVCH 00HMOVCCAP0L 00H 给PCA模块0的CCAP0L置初值MOVCCAP0H 1EH 给PCA模块0的CCAP0H置初值MOVCCAPM0 49H 设置PCA模块0为16位软件定时器 ECCF0 1允许PCA模块0中断 当 CH CL CCAP0H CCAP0L 时 产生中断请求 CCF0 1 请求中断SETBEA 开整个单片机所有中断共享的总中断控制位SETBCR 启动PCA计数器 CH CL 计数SJMP 循环等待中断 PCA ISR PCA中断服务程序PUSHACC 保护现场PUSHPSW 每5mS中断一次MOVA 00H 给 CCAP0H CCAP0L 增加一个数值ADDA CCAP0LMOVCCAP0L AMOVA 1EHADDCA CCAP0HMOVCCAP0H ACLRCCF0 清PCA模块0中断标志DJNZCOUNTER PCA EXIT 中断计数没有减到0 直接退出MOVCOUNTER 200 恢复中断计数初值CPLLED 1s LED 1S输出脉冲宽度为1秒钟的方波PCA EXIT POPPSW 恢复现场POPACCRETIEND 对应的C语言程序如下 include stc12c5a h 包含STC12C5A60S2寄存器定义文件sbitLED 1s P1 6 unsignedcharcnt 中断计数变量voidmain void cnt 200 设置COUNTER计数器初值CMOD 0 x80 10000000B空闲模式下停止PCA计数器工作 选择PCA时钟源为FOSC 12 禁止PCA计数器溢出时中断CCON 0 清零PCA计数器溢出中断请求标志位CF CR 0 不允许PCA计数器计数 清零PCA各模块中断请求标志位CCFnCL 0 清零PCA计数器CH 0 CCAP0L 0 给PCA模块0的CCAP0L置初值CCAP0H 0 x1e 给PCA模块0的CCAP0H置初值CCAPM0 0 x49 设置PCA模块0为16位软件定时器 ECCF0 1允许PCA模块0中断 当 CH CL CCAP0H CCAP0L 时 CCF0 1 产生中断请求EA 1 开整个单片机所有中断共享的总中断控制位CR 1 启动PCA计数器 CH CL 计数while 1 等待中断 voidPCA ISR void interrupt7 PCA中断服务程序 union 定义一个联合 以进行16位加法unsignedintnum struct 在联合中定义一个结构unsignedcharHi Lo Result temp 每5ms中断一次temp num unsignedint CCAP0H 8 CCAP0L 0 x1e00 CCAP0L temp Result Lo 取计算结果的低8位CCAP0H temp Result Hi 取计算结果的高8位CCF0 0 清PCA模块0中断标志cnt 修改中断计数if cnt 0 cnt 200 恢复中断计数初值LED 1s LED 1s 在P1 6输出脉冲宽度为1秒钟的方波 例7 6 利用PCA模块进行PWM输出 PWM脉冲由P1 3输出 假设晶振频率FOSC 18 432MHz 解 PWM无需中断支持 只需根据需要设置PCA模块的参数 并通过指令进行输出即可 PWM的占空比计算方法为 占空比 pulse width 256 100 汇编语言程序如下 INCLUDE STC12C5A INC 包含STC12C5A60S2寄存器定义文件 定义常量 pulse width MAX pulse width MIN时 输出脉冲宽度不变 pulse width MAXEQU0F0H PWM脉宽最大值 占空比 93 75 pulse width MINEQU10H PWM脉宽最小值 占空比 6 25 stepEQU38H PWM脉宽变化步长 定义变量pulse widthEQU30HORG0000HLJMPMAINORG0050HMAIN MOVSP 70HMOVCMOD 80H PCA在空闲模式下停止PCA计数器工作 PCA时钟模式为FOSC 12 禁止PCA计数器溢出中断MOVCCON 00H 禁止PCA计数器工作 清除中断标志 计数器溢出标志MOVCL 00H 清0计数器MOVCH 00H 设置模块0为8位PWM输出模式 脉冲在P1 3引脚输出MOVCCAPM0 42HMOVPCA PWM0 00H MOVPCA PWM0 03H 释放本行注释 PWM输出就一直是0 无脉冲 SETBCR 将PCA计数器打开MAIN LOOP LCALLPWMOUTLJMPMAIN LOOP PWMOUT 可以使用示波器观察P1 3的波形 如果P1 3连接一个LED 则连接到P1 3的LED逐渐变亮MOVA pulse width MIN 为输出脉冲宽度设置初值MOVpulse width A pulse width数字越大脉宽越窄 LED越亮PWM LOOP1 MOVA pulse width 判是否到达最大值CLRCSUBBA pulse width MAXJNCPWM A 到达最大值就转到逐渐变暗MOVA pulse width 设置脉冲宽度 数字越大 脉宽越窄 LED越亮MOVCCAP0H A 核心语句MOVCCAP1H A 核心语句 MOVA pulse width 计算下一次输出脉冲宽度数值ADDA stepMOVpulse width ALCALLDELAY 在一段时间内保持输出脉冲宽度不变LJMPPWM LOOP1PWM A 如果P1 3连接一个LED 连接到P1 3的LED逐渐变暗MOVA pulse width MAX 为输出脉冲宽度设置初值MOVpulse width A pulse width数字越大脉宽越窄 LED越亮PWM LOOP2 MOVA pulse width 判是否到达最小值CLRCSUBBA pulse width MINJCPWM B 到达最小值就返回 JZPWM B 到达最小值就返回 MOVA pul
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 小区道闸广告合同范例
- 商务协议酒店合同范例
- 工作装合同范例
- 出口货物合同范例
- 学校空调购置合同模板
- 投资野猪养殖合同范例
- 天津购房合同范例 期房
- 房门销售合同模板
- 外包设备验收合同模板
- 做门面招牌合同范例
- 2024年版的企业绩效评价标准
- 行政复议法-形考作业3-国开(ZJ)-参考资料
- MOOC 职场英语-西南交通大学 中国大学慕课答案
- JTG C10-2007 公路勘测规范
- 联合办公协议书范本
- 深圳市中小学生流疫苗接种知情同意书
- SCA涂胶机内部培训资料
- GB/T 5237.1-2017铝合金建筑型材第1部分:基材
- GB/T 18284-2000快速响应矩阵码
- 完整版:美制螺纹尺寸对照表(牙数、牙高、螺距、小径、中径外径、钻孔)
- JJG 162-2019饮用冷水水表 检定规程(高清版)
评论
0/150
提交评论