




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
定时器的解释TCON:定时器控制寄存器寄存器地址88H,位寻址8FH88H。位地址8F8E8D8C8B8A8988位符号TF1TR1TF0TR0IE1IT1IE0IT0TF0(TF1)计数溢出标志位,当计数器计数溢出时,该位置1。TR0(TR1)定时器运行控制位当TR0(TR1)0 停止定时器/计数器工作当TR0(TR1)1 启动定时器/计数器工作IE0(IE1)外中断请求标志位当CPU采样到P3.2(P3.3)出现有效中断请求时,此位由硬件置1。在中断响应完成后转向中断服务时,再由硬件自动清0。IT0(IT1)外中断请求信号方式控制位当IT0(IT1)=1 脉冲方式(后沿负跳有效)当IT0(IT1)0 电平方式(低电平有效)此位由软件置1或清0。TF0(TF1)计数溢出标志位当计数器产生计数溢出时,此位由硬件置1。当转向中断服务时,再有硬件自动清0。计数溢出的标志位的使用有两种情况:采用中断方式时,作中断请求标志位来使用;采用查询方式时,作查询状态位来使用。TMOD寄存器定时器/计数器T0T1的方式寄存器GATEC/TM1M0GATEC/TM1M0其中低四位定义定时器/计数器T0,高四位定义定时器/计数器T1,各位的说明:,GATE门控制。GATE=1时,由外部中断引脚INT0、INT1和控制寄存器的TR0,TR1来启动定时器。GATE=0时,仅由TR0,TR1置位分别启动定时器T0、T1。,C/T功能选择位置位时选择计数功能,清零时选择定时功能。,M0、M1方式选择功能由于有2位,因此有4种工作方式=M1M0 工作方式 计数器模式 TMOD(设置定时器模式)0 0 方式0 13位计数器 TMOD=0x000 1 方式1 16位计数器 TMOD=0x011 0 方式2 自动重装8位计数器 TMOD=0x021 1 方式3 T0分为2个8位计数器,T1为波特率发生器 TMOD=0x03=中断向量号以及USING n的解释 5、IE-中断充许寄存器按位寻址,地址:A8H B7 B6 B5 B4 B3 B2 B1 B0 EA ET2 ES ET1 EX1 ET0 EX0 EA (IE.7):EA=0时,所有中断禁止(即不产生中断)EA=1时,各中断的产生由个别的允许位决定- (IE.6):保留ET2(IE.5):定时2溢出中断充许(8052用)ES (IE.4):串行口中断充许(ES=1充许,ES=0禁止)ET1(IE.3):定时1中断充许EX1(IE.2):外中断INT1中断充许ET0(IE.1):定时器0中断充许EX0(IE.0):外部中断INT0的中断允许本篇文章来源于 百科网络 转载请以链接形式注明出处 网址:/dianqia/danpianji/200911/1042580_3.html1、返回值函数名 interrupt n其中n 对应中断源的编号,其值从0 开始,以80C51 单片机为例,编号从04,分别对应外中断0、定时器0 中断、外中断1、定时器1 中断和串行口中断。2、在C51 中,寄存器组选择取决于特定的编译器指令,即使用using n 指定,其中n 的值是03,对应使用四组工作寄存器。 例如可以这样来写: void timer0() interrupt 1 using 2 即表示在该中断程序中使用第2 组工作寄存器。using * 不要写,写了易出错,不写绝对不出错. interrupt*是中断源.具体编号如下: INT0 INTERRUPT 0 T0 1 INT1 2 T1 3 UART 4 T2 5 UART1 6 外部中断2 7 外部中断3 8 外部中断4 9 外部中断5 10 看门狗定时器 11在默认状态下,func使用寄存器组0(BANK0),那么当int_0调用func时是否存在当传递参数时会造成参数传递错误?如果在中断服务函数 ISR 中使用寄存器,那么必须处理好 using 的使用问题:1、中断服务函数使用 using 指定与主函数不同的寄存器组(主函数一般使用 Register bank 0)。2、中断优先级相同的ISR 可用 using 指定相同的寄存器组,但优先级不同的 ISR 必须使用不同的寄存器组,在 ISR 中被调用的函数也要使用 using 指定与中断函数相同的寄存器组。3、如果不用 using 指定,在 ISR 的入口,C51 默认选择寄存器组0,这相当于中断服务程序的入口首先执行指令:MOV PSW #0这点保证了,没使用 using 指定的高优先级中断。可以中断使用不同的寄存器组的低优先级中断。4、使用 using 关键字给中断指定寄存器组,这样直接切换寄存器组而不必进行大量的 PUSH 和 POP 操作,可以节省RAM空间,加速 MCU 执行时间。寄存器组的切换,总的来说比较容易出错,要对内存的使用情况有比较清晰的认识,其正确性要由你自己来保证。特别在程序中有直接地址访问的时候,一定要小心谨慎!至于“什么时候要用到寄存器组切换”,一种情况是:当你试图让两个(或以上)作业同时运行,而且它们的现场需要一些隔离的时候,就会用上了。在 ISR 或使用实时操作系统 RTOS 中,寄存器非常有用。寄存器组使用的原则:1、8051 的最低32 个字节分成 4 组 8 寄存器。分别为寄存器R0 到R7。寄存器组由PSW 的低两位选择。在 ISR 中,MCU 可以切换到一个不同的寄存器组。对寄存器组的访问不可位寻址,C51 编译器规定使用 using 或 禁止中断的函数(#pragma disable )均不能返回 bit 类型的值。2、主程序(main函数)使用一组,如 bank 0;低中断优先级的所有中断均使用第二组,如 bank 1;高中断优先级的所有中断均使用再另外一组,如 bank 2。显然,同级别的中断使用同一组寄存器不会有问题,因为不会发生中断嵌套;而高优先级的中断则要使用与低优先级中断不同的一组,因为有可能出现在低优先级中断中发生高优先级中断的情况。编译器会自动判断何时可使用绝对寄存器存取。3、在 ISR 中调用其它函数,必须和中断使用相同的寄存器组。当没用 NOAREGS 命令做明确的声明,编译器将使用绝对寄存器寻址方式访问函数选定(即用 using 或 REGISTERBANK 指定)的寄存器组,当函数假定的和实际所选的寄存器组不同时,将产生不可预知的结果,从而可能出现参数传递错误,返回值可能会在错误的寄存器组中。举一例子:当需要在中断内和中断外调用同一个函数,假定按照程序的流程控制,不会出现函数的递归调用现象,这样的调用会不会出现问题?若确定不会发生重入情况,则有以下两种情况:1、如果 ISR 和主程序使用同一寄存器组(主程序缺省使用BANK 0,若 ISR 没有使用 using 为其指定寄存器区,则缺省也使用 BANK 0),则不需其他设置。2、如果 ISR 和主程序使用不同的寄存器组(主程序缺省使用BANK 0,ISR 使用 using 指定了其他 BANK),则被调用函数必须放在:#pragma NOAREGS#pragma AREGS控制参数对中,指定编译器不要对该函数使用绝对寄存器寻址方式;或者也可在 Options-C51,选中“Dont use absolute register accesses”,使所有代码均不使用绝对寄存器寻址方式(这样,执行效率将稍有降低)。不论以上的哪一种情况,编译器均会给出重入警告,需手工更改 OVERLAY 参数,做重入说明。3、还有一种办法:如果被调用函数的代码不是很长,还是将该函数复制一份,用不同的函数名代替,这种情况适合ROM有足够多余的空间。因此,对using关键字的使用,如果没把握,宁可不用,交给编译系统自己去处理好了。详细使用可参见C51.PDF文件,以上供参考C51中断函数C51的中断函数的格式为:void FuncIr(void) interrupt x using y以下是梦游的一些分析:一、中断函数是一个特殊的函数,没有参数,也没有返回值;但是程序中允不允许使用return呢?答案是允许的,不过只能用return;,不能用return(z);;用在一些需要快速返回的地方,对应的汇编会有多个ret语句,相对效率会高一些。二、using的用法,using可以修饰任何函数,不过个人建议只用来修饰中断函数;简单的说,“using”会指定工作寄存器组,由于中断函数一般都是比较紧急的事情,有时一条语句都会斤斤计较,所以使用using切换寄存器组可以省去一些压栈的动作,由于51只有两级中断,同级中断不能被打断,因此,我们可以同级中断设成同样的寄存器组,从某种意义上来说,有一组寄存器是多余的。同时个人建议中断函数应该使用using这个关键字。三、中断中调用函数,首先要讨论中断函数中调用函数的必要性,前天在论坛上我和别人争论过这个问题,现在我还是这个观点:有些情况中断中调用函数还是必要的,这个时候是不是该调用函数,其实和普通函数差不多,首先是这个函数如果调用多次,或者要带一些参数什么的就更加必要的;前天有人跟我叫劲,说假如只调用一次且无参数无返回的函数要直接写,因为如果用函数,至少会增加CALL和RET两条语句,我不敢苟同,我是实际调试发现的,当你程序比较复杂时,你将那部单独拉出来做成函数,可能代码和时间都会更好。四、中断中调用的函数最好不要被中断外的其它函数调用,因为会出现“重复调用”的警告,有时这种调用是很致命的,有人说这个函数可以用reentrant来修饰,是的,的确可以这样解决,不过个人不建议这么做,也许这样会跟你减少很多堆栈空间,并且整个程序的优化要差很多,个人建议出现这种情况就把这个函数写两遍,分成两个函数分别调用。五,中断调用了函数,会出现一些莫名其妙的问题,一些数据不对。其实一般是因为汇编中使用了绝对寄存器引起的,有人说中断函数使用那个寄存器组,被中断调用的函数就使用哪个寄存器组,我认为这样不好:这样会增加额外的消耗,使用using会增加一下语句: PUSH PSW MOV PSW, #XX . POP PSW更重要的是,使用using的函数不能有返回值,这是致命伤个人推荐的方法有两种:1、使用“#pragma NOAREGS”禁止使用绝对寄存器2、使用“#pragme RB(x)”来指定本文件的工作寄存器组六、一般说来,要求中断函数尽可能的短,但也有特殊情况,有些前/后台的系统中,就会把很多相对重要的事情放到定时中断(这个定时中断类似实时操作系统中的时钟节拍)去做,而且程序很长。我单独提出来这点是想告诉大家,中断函数也是一个函数而已,只要系统有必要,可以做一些看似不合理的事情,该出手时就出手,就像goto语句一样。PCON主要是为CHMOS型单片机的电源控制而设置的专用寄存器,单元地址是87H,其结构格式如下: 表2 PCON电源管理寄存器结构PCON D7 D6 D5 D4 D3 D2 D1 D0 位符号 SMOD - - - GF1 GF0 PD IDL 在CHMOS型单片机中,除SMOD位外,其他位均为虚设的,SMOD是串行口波特率倍增位,当SMOD=1时,串行口波特率加倍。系统复位默认为SMOD=0。 各位的定义: SMOD:该位与串口通信有关。 SMOD=0; 串口方式1,2,3时,波特率正常。 SMOD=1; 串口方式1,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度电影演员合作协议书范本
- 2025版工艺品文化体验馆投资建设合同
- 2025版工地水泥黄沙资源整合承包服务协议
- 二零二五版医疗器械维修与保养服务合同
- 2025版爆破拆除工程竣工验收合同规范
- 二零二五年度房地产销售行业领袖峰会合作协议
- 2025版人工智能机器人研发与应用合作协议
- 2025版离婚同居协议书:财产分割与共同财产管理协议
- 二零二五版家具制造业专用运输合同书
- 2025至2030年中国座便器市场全面调研及行业投资潜力预测报告
- 2025年文物保护工程从业资格考试(责任工程师·近现代重要史迹及代表性建筑)历年参考题库含答案详解(5套)
- 2025年调度持证上岗证考试题库
- 小区物业薪酬制度方案(3篇)
- 2025年计算机一级考试题库操作题及答案
- 电信运营商应急预案
- 高血压防治指南
- 采购管理办法分类
- 2025反洗钱知识试题题库及参考答案
- 百级无尘室管理办法
- 糖尿病专科护士培训大纲
- 泪道阻塞的护理教学查房
评论
0/150
提交评论