内部资源C编程工作.ppt

  1. 1、本文档共21页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第二部分 8051内部资源的C编程 一、中断应用的C语言编程 三、串行口应用的C语言编程 教学基本要求: (1)、掌握中断应用的C编程方法; (2)、掌握定时器/计数器应用的C编程方法; (3)、熟悉串行口应用的C编程方法; 教学重点: (1)、中断应用的C编程; (2)、定时器/计数器应用的C编程; 教学难点: (1)、在Keil中如何调试各中断程序; C51编译器支持在C源程序中直接开发中断程序。中断服务程序是通过按规定语法格式定义的一个函数。 中断服务程序的函数定义的语法格式如下: 返回值 函数名([参数]) [模式][重入] interrupt m [using n] { … } nterrupt m 其中m是中断号(0到31),中断号告诉编译器中断程序的入口地址,中断号对应着IE寄存器中的使能位。 下表给出了对应关系 002BH 0023H 001BH 0013H 000BH 0003H 入口地址 定时器2 溢出 5 串行口中断 4 定时器1 溢出 3 外部中断1 2 定时器0 溢出 1 外部中断0 0 中断源 IE 寄存器中的使能位和C 中的中断号 在进入中断服务程序前的程序中使用一组工作寄存器,进入中断服务程序后,由“using n”切换到另一组寄存器,中断返回后又恢复到原寄存器组。这样互相切换的两组寄存器中的内容彼此都没有被破坏。 为中断程序指定工作寄存器组的缺点是:所有被中断调用的过程都必须使用同一个寄存器组,否则参数传递会发生错误。 中断不允许用于外部函数,它对函数目标代码影响如下: 当调用函数时,SFR中的ACC,B,DPH,DPL和PSW入栈。如果不使用寄存器组切换,则甚至中断函数所需要的所有工作寄存器都入栈。 函数退出前,所有的寄存器内容出栈; 函数由8051的指令RETI终止。 例:如图所示是利用优先权解码芯片,在单片机8031的一个外部中断INT1上扩展多个中断源的原理电路图。图中是以开关闭合来模拟中断请求信号。当有任一中断源产生中断请求,能给8031的INT1引脚送一个有效中断信号,由P1的低3位可得对应中断源的中断号。多个中断源的处理。 在中断服务程序中仅设置标志,并保存I/O口输入状态。 C51编译器提供定义特定80C51系列成员的寄存器头文件。 80C51头文件为reg51.h。 C51程序如下: 主程序 初始化INT1 清标志 处理 标志设置? Y N 返回 设置标志 存状态 外中断1 # include reg51.h unsigned char status; bit flag; void service_int1( ) interrupt 2 using 2 /* INT1中断服务程序,用第2组工作寄存器 */ { flag=1; /* 设置标志 */ status=p1; /* 存输入口状态 */ } void main(void) { IP=0x04 ; /* 置INT1为高优先级中断 */ IE=0x84 ; /* INT1开中断,CPU开中断 */ for(; ;) { if(flag) /* 有中断 */ { switch(status) /* 根据中断源分支 */ { case 0 : break ; /* 处理IN0 */ case 1 : break ; /* 处理IN1 */ case 2 : break; /* 处理IN2 */ case 3 : break; /* 处理IN3 */ default : ;} flag=0 ; /* 处理完成清标志 */ } } } 例1:在XTAL频率是12MHZ的标准8051器件上,用TIME1(定时器/计数器1)产生10KHz定时器滴答中断。 分析:采用TIME1的工作模式2,则:

文档评论(0)

beautyeve + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档