C51编程中的自义“位”.pdfVIP

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C51编程中的自义“位”

资料来源 电子下载网 下载时间 2010-7-5 18:09:30 本文地址 http://3u .com/dpj/51/1/489.html C51 编程中的自定义“位” 摘要: 以例举的方式,阐述单片机C语言编程中有关标志位的自定义以及对于 其当前状态的保存问题。从标志位的理念着手,探讨在单片机C语言编程中自 定义标志位的必要性、自定义标志位保存的必要性,以及自定义标志位保存的 几种具体的操作方法。 关键词: 单片机; C语言; 自定义; 位; 变量; 保存 中图分类号: TM3文献标识码: B Customizing “Bit” and Its Saving Method in C51 Programming Zhang Chunfeng (Ningbo Tianan (Group) Co., Ltd. , Ningbo 315700, China) Abstract: The customization and saving of the flag bit in C programming for microcontrollers are described. Necessities for customizing flag bit and saving of the customized bit are discussed, and several ways for saving customized flag bit in C language are provided. Key words: microcontroller; C language; customization; bit; variable; save 引言 在现有的教课书及相关文章中,都难得提到在单片机C语言编程中对于自 定义“位”的状态进行保存的理念。 当单片机C语言编程中提及“位”的概念时,人们自然会想到状态字PSW 中PSW.5的F0与PSW.1的F1两个用户通用标志位。这两个标志位均可参与布 尔运算、“位”控操作,也可随状态字PSW一起保存。但是,往往会忽视这一 点:在一些特定的情况下,如在C语言编程的中断服务程序中,对状态字PSW 中PSW.5的F0与PSW.1的F1这两个用户标志位的操作可能是无效的。如: void EX1_ISR() interrupt 2 {//外部中断1 static unsigned int tempaddr;//定义接收地址缓存 static unsigned int tempkey;//定义接收数据缓存 unsigned int timecnt; timecnt=TH1*256+TL1; TH1=0; TL1=0; TR1=1;//定时器1启动 F0=~F0;//取反F0 if(F0) { tempaddr=tempaddr1; } else { tempkey=tempkey1; } } 以上是一段单片机外部中断1的中断服务程序,乍看似乎没什么问题,仿 真调试时也能通过“编辑”。但实际上这是一段错误的程序——其中对“F0” 用户标志位的“取反”操作是达不到其预期效果的。因为对“F0”用户标志位 的“取反”操作是在中断服务程序中进行的。在进入中断时,C语言自动会保 护“中断现场”——将程序指针PC、累加器ACC、状态字PSW等压入堆栈保护 起来……直到中断返回时弹出堆栈并覆盖了中断服务时的变值,恢复到压入堆 栈之前的原样。因此,状态字PSW中的F0也不例外,如果压入堆栈之前F0是 处于逻辑“0”状态,中断返回后还是复原成逻辑“0”状态——不管中断服务 程序中怎么取反改变——也就是说,在中断服务程序中试图改变F0之值的操作 是有失偏颇的。对于上文例举的那段中断服务程序来说,若F0的初始状态为逻 辑“0”,即进入中断服务之前和中断返回之后总是逻辑“0”,那么进入执行 “F0=~F0”指令后F0总是逻辑“1”,因而接下运行的是“if(F0)”下花括号 中“tempaddr=tempaddr1”指令永远也运行不到。所以,若要中断服务程序 达到预期的效果——“if(F0)”下花括号中的指令与“else”下花括号中

文档评论(0)

xyl118 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档