第4节 8051单片机程序设计基础.ppt

  1. 1、本文档共126页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
if (DIPswitch==1) {//检查P1. 4输出是否为高 inval = P1 0x0F; /* 从P1读位0~3 */ greenLED = 0; /* 置P1. 5输出为低 */ } Else{ /* 若P1. 4输入为低 */ greenLED =1; /* 置P1. 5输出为高 */ } P3 =(P30xF0)| inval;/*值输出到P3.0~P3.3 */ } } * 4.3.7 中断服务函数与寄存器组定义 定义中断服务函数的一般形式为: 函数类型函数名(形式参数表)〔interrupt n〕[using n] 关键字interrupt后面的n是中断号,n的取值范围为0~31,编译器从8n+3处产生中断向量,具体的中断号n和中断向量取决于不同的8051系列单片机芯片。8051单片机的常用中断源和中断向量见表6-1。 * 关键字using,专门用来选择8051单片机中不同的工作寄存器组。using后面的n是一个0~3的常整数,分别选中4个不同的工作寄存器组。在定义一个函数时using是一个选项,如果不用该选项,则由编译器选择一个寄存器组作绝对寄存器组访问。需要注意的是,关键字using和interrupt的后面都不允许跟带运算符的表达式。 * 关键字using对函数目标代码的影响如下: 在函数的入口处将当前工作寄存器组保护到堆栈中;指定的工作寄存器内容不会改变。函数返回之前将被保护的工作寄存器组从堆栈中恢复。 使用关键字using在函数中确定一个工作寄存器组时必须十分小心,要保证任何寄存器组的切换都只在仔细控制的区域内发生,如果不做到这一点将产生不正确的函数结果。另外还要注意,带using属性的函数原则上不能返回bit类型的值。并且关键字using不允许用于外部函数。 * 关键字interrupt也不允许用于外部函数,它对中断函数目标代码的影响如下: 在进入中断函数时,特殊功能寄存器ACC,B,DPH,DPL,PSW将被保存入栈;如果不使用寄存组切换,则将中断函数中所用到的全部工作寄存器都入栈;函数返回之前,所有的寄存器内容出栈;中断函数由8051单片机指令RETI结束。 * 下面给出一个中断函数定义的例子。 ? static void timer0_isr (void); /* 定时器0中断服务程序 */ static void timer0_isr (void) interrupt 1 using 1 { unsigned i; /* 停止定时器0, 然后改变定时器的计数值, 以得到10ms的中断,再次启动定时器 */ TR0 = 0; /* 停止定时器0 */ i = TIMER0_COUNT + TL0 + (TH08); TL0 = i; TH0 = i 8; TR0 = 1; /* 启动定时器0 */ timer0_tick++; } * 4.3.8函数的参数和局部变量的存储器模式 C51编译器允许采用三种存储器模式:SMALL、COMPACT和LARGE。一个函数的存储器模式确定了函数的参数和局部变量在内存中的地址空间。处于SMALL模式下的函数的参数和局部变量位于8051单片机的内部RAM中,处于COMPACT和LARGE模式下的函数的参数和局部变量则使用8051单片机的外部RAM。在定义一个函数时可以明确指定该函数的存储器模式,一般形式为: 函数类型函数名(形式参数表) [存储器模式] 其中,存储器模式是C51编译器扩展的一个选项。不用该选项时即没有明确指定函数的存贮器模式,这时该函数按编译时的默认存储器模式处理。 * 例4.19 函数的存储器模式 #pragma large /* 默认存储器模式为LARGE */ extern int calc(char i,int b) small; /* 指定SMALL模式 */ extern int func(int i, float f) compact; /* 指定Compact模式 */ extern void *tcp(char xdata * xp, int ndx) small; /* 指定SMALL模式 */ int mtest(int i, int y) small /* 指定SMALL模式 */ { return(

您可能关注的文档

文档评论(0)

189****6140 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档