文档详情

C51编程中的自定义“位”.pdf

发布:2017-05-06约7.7千字共7页下载文档
文本预览下载声明
资料来源 电子下载网 下载时间 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”下花括号中
显示全部
相似文档