单片机c语音自定义标志位用法Bit.doc
《单片机c语音自定义标志位用法Bit.doc》由会员分享,可在线阅读,更多相关《单片机c语音自定义标志位用法Bit.doc(10页珍藏版)》请在三一文库上搜索。
1、单片机C语言编程中“位”(bit)的保存方案引言在现有的教课书及相关文章中,都难得提到在单片机C语言编程中对于自定义“位”的状态进行保存的理念。当单片机C语言编程中提及“位”的概念时,人们自然会想到状态字PSW中PSW.5的F0与PSW.1的F1两个用户通用标志位。这两个标志位均可参与布尔运算、“位”控操作,也可随状态字PSW一起保存。但是,往往会忽视这一点:在一些特定的情况下,如在C语言编程的中断服务程序中,对状态字PSW中PSW.5的F0与PSW.1的F1这两个用户标志位的操作可能是无效的。如:void EX1_ISR() interrupt 2 /外部中断1static unsigned
2、 int tempaddr;/定义接收地址缓存static unsigned int tempkey;/定义接收数据缓存unsigned int timecnt;timecnt=TH1*256+TL1;TH1=0;TL1=0;TR1=1;/定时器1启动F0=F0;/取反F0if(F0) tempaddr=tempaddr1;else tempkey=tempkey1;以上是一段单片机外部中断1的中断服务程序,乍看似乎没什么问题,仿真调试时也能通过“编辑”。但实际上这是一段错误的程序其中对“F0”用户标志位的“取反”操作是达不到其预期效果的。因为对“F0”用户标志位的“取反”操作是在中断服务程序
3、中进行的。在进入中断时,C语言自动会保护“中断现场”将程序指针PC、累加器ACC、状态字PSW等压入堆栈保护起来直到中断返回时弹出堆栈并覆盖了中断服务时的变值,恢复到压入堆栈之前的原样。因此,状态字PSW中的F0也不例外,如果压入堆栈之前F0是处于逻辑“0”状态,中断返回后还是复原成逻辑“0”状态不管中断服务程序中怎么取反改变也就是说,在中断服务程序中试图改变F0之值的操作是有失偏颇的。对于上文例举的那段中断服务程序来说,若F0的初始状态为逻辑“0”,即进入中断服务之前和中断返回之后总是逻辑“0”,那么进入执行“F0=F0”指令后F0总是逻辑“1”,因而接下运行的是“if(F0)”下花括号中“
4、tempaddr=tempaddr1;”指令,而“else”下花括号中“tempkey=tempkey1”指令永远也运行不到。所以,若要中断服务程序达到预期的效果“if(F0)”下花括号中的指令与“else”下花括号中的指令轮番运行,必须设立一个不受中断现场保护等影响的自定义标志位。1 自定义标志“位”的保存在C语言编程中,自定义标志位的运用概率很大,有的一个程序中就会有好多的自定义标志位,且其中几个可能是必须要保存的。譬如有些控制器件中对一些控制状态进行保持,即使是停电之后再来电了这种控制状态依然能保持不变这就牵涉到保存问题。例举2:我们曾搞过一个镭射投影屏幕升降的无线遥控装置。这个以单片机
5、为核心的控制装置与屏幕升降的卷动电机等都安装固定在一个直径不足50 mm的狭长铁桶里面,因此装入或拆卸都非常麻烦。为了一次性成功避免再次拆卸装入的麻烦,在用C语言编程时我特意多用了一个自定义的标志位翻转标志位“switch_sign”。因为无线遥控手柄上的向上“”、暂停“”、向下“”的键标志都已是做定的,因此,如果由于接线等失误导致按向下“”键时投影屏幕向上卷、按向上“”键时投影屏幕却向下伸有了“switch_sign”自定义的标志位就不用怕这些了。相关的C语言程序段如下:#defineuint unsigned int#defineuchar unsigned charuint Decode
6、_addr,Decode_key,addr;sbit JD1_out=P04;/定义继电器1控制输出端sbit JD2_out=P05;/定义继电器2控制输出端sbit BEEP=P03;/定义蜂鸣声响输出bit bdata switch_sign;/自定义的翻转标志位(应作全局变量定义)voidTelecontrol_Data() if(Decode_addr=0x5535) /地址码核对if(Decode_key=0x00C0) /“”键码核对BEEP=1;/蜂鸣声响输出if(switch_sign) /翻转标志位JD1_out=0;/继电器1控制输出端JD2_out=1; /继电器2控制
7、输出端else JD1_out=1;/继电器1控制输出端JD2_out=0;/继电器2控制输出端if(Decode_key=0x0030) /“”键码核对BEEP=1;/蜂鸣声响输出JD1_out=0;/继电器1控制输出端JD2_out=0;/继电器2控制输出端if(Decode_key=0x000C) /“”键码核对BEEP=1;/蜂鸣声响输出if(switch_sign) /翻转标志位JD1_out=1;/继电器1控制输出端JD2_out=0;/继电器2控制输出端else JD1_out=0;/继电器1控制输出端JD2_out=1;/继电器2控制输出端if(Decode_addr=0x5D
8、35) /取反操作纠正时地址码核对if(Decode_key=0x00C0) /“”键码核对BEEP=1;/蜂鸣声响输出switch_sign=switch_sign; /取反一次翻转标志位save_data();/调用保存数据子程序从上面这段遥控数据处理子程序可以看到:在任何时候两个继电器的控制输出端JD1_out与JD2_out至多只能开一个。当遥控“”键按下有效时,翻转标志位“switch_sign”的逻辑“0”或逻辑“1”状态将决定两个继电器的控制输出端JD1_out与JD2_out的一开一关,或一关一开;同理,当遥控“”键按下有效时也会得到与“”键按下相反的类同效果也就是说,只要改变
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 语音 自定义 标志 用法 Bit
链接地址:https://www.31doc.com/p-2516088.html