C51编程中的自定义“位”及其保存方案
程序
}
}
}
从上面这段遥控数据处理子程序可以看到:在任何时候两个继电器的控制输出端JD1_out与JD2_out至多只能开一个。当遥控“▲”键按下有效时,翻转标志位“switch_sign”的逻辑“0”或逻辑“1”状态将决定两个继电器的控制输出端JD1_out与JD2_out的一开一关,或一关一开;同理,当遥控“▼”键按下有效时也会得到与“▲”键按下相反的类同效果……也就是说,只要改变翻转标志位“switch_sign”的逻辑状态,就能改变两个继电器控制输出端谁“开”谁“关”的控制输出状态。亦即,在同一个遥控按键按下时(如“▲”键按下),标志位“switch_sign”的逻辑状态不同,两个继电器控制输出端谁“开”谁“关”的控制输出状态也将不同。其中的蜂鸣声响提示按键操作是否有效。
投影屏幕升降的动力电机是一个AC 220V的交流电机,图1是电机控制电路的简图。由此可见,当继电器JD1闭合,JD2断开时,电机M中的L1为主绕组,L2为启动副绕组,电机将一个方向运转;当继电器JD1断开,JD2闭合时,电机M中的L1为启动副绕组,而L2为主绕组了,电机将以原来的反方向运转。结合上文,改变翻转标志位“switch_sign”的逻辑状态→改变两个继电器控制输出端谁“开”谁“关”的控制输出状态→改变电机的运转方向→投影屏幕的升降状态。也就是说,改变翻转标志位“switch_sign”的逻辑状态,就可纠正遥控电机运转方向及其投影屏幕的升降状态。将遥控按键与投影屏幕升降的对应关系协调后,必须保存自定义的标志位“switch_sign”当前的逻辑状态,否则,断电后下一次上电复位初始化,又可能要出洋相了。
从例举2的程序中还可以看到,翻转标志位“switch_sign”的取反操作也是用同一个遥控器上的“▲”键来执行的,只是在遥控器的地址编码上动了点手脚——改变了一下地址编码(0x5D35),待操作对应协调后再改回到原来的地址编码(0x5535)。
2保存1个字节来复原自定义标志“位”
自定义标志“位”的保存及其复原有很多种方法,我曾尝试过几种方法。例3是一种保存1个字节来复原1个自定义标志位的方法,具体操作如下:
static unsigned char current_dat;//定义一个通用的辅助字节变量
bit bdata switch_sign;//自定义的翻转标志位(应作全局变量定义)
……
switch_sign=~switch_sign;//取反1次翻转标志位
if(switch_sign) {//判断switch_sign是逻辑“1”还是逻辑“0”
current_dat=0xA5;//对通用的辅助字节变量赋值
}
else {
current_dat=0x00;//通用的辅助字节变量
}
save_data();//调用保存数据子程序
BEEP=1;//蜂鸣声响输出
以上程序是:取反翻转标志位“switch_sign”后,若“switch_sign”为逻辑“1”状态,就给通用的辅助字节变量“current_dat”赋值“0xA5”(当然,这数据由你自己随意定);若“switch_sign”为逻辑“0”状态,则给通用的辅助字节变量“current_dat”赋值“0x00”(这数据也是自己随意定的,只要与前面那个不一样就是了),然后调用保存数据程序将通用的辅助字节变量“current_dat”保存起来。这样,即使断电了翻转标志位“switch_sign”的当前状态已间接地被通用的辅助字节变量“current_dat”保存起来了……当下一次上电复位初始化时,应先将保存的辅助变量“current_dat”的数据读出来,并还原成翻转标志位“switch_sign”相应的逻辑状态。上电初始化时若从存储处读出的数据是“0xA5”,则将翻转标志位“switch_sign”置“1”;若读出的数据是“0x00”,则将翻转标志位“switch_sign”置“0”——这就与原来保存时的状态对应起来了。其操作过程如例4:
static unsigned char current_dat;//定义一个通用的辅助字节变量
static unsigned char addr;//自定义地址变量缓冲单元
static unsigned char Rdat;//自定义读数据缓冲单元
bit bdata switch_sign;//自定义的翻转标志位(应作全局变量定义)
……
addr=0x7F6;//给一个原来的存储地址
REEPROM();//调用读取E2PROM的子程序
current_dat=Rdat;//将读出的数据还给通用的辅助字节变量
if(current_dat==0xA5) {//判断读出的数据是否等于“0xA5”
switch_sign=1;//将翻转标志位“switch_sign”置“1”
}
else {
switch_sign=0;//将翻转标志位“switch_sign”置“0”
}
31个字节保存8个自定义“位”
用保存一个自定义的字节变量来复原一个自定义标志位的过程上文已叙述了,接下来阐述1个字节变量保存8个自定义“位”的方案。1个字节变量保存8个自定义“位”的方案很多,例5是其中比较理想的一种:
#defineuint unsigned int
#defineuchar unsigned char
uinta
- 实用C51编程的高级技巧(C51编程)(11-25)
- 进制转换 89c51编程实例1.1(11-24)
- C51编程经验三则(11-23)
- C51编程风格(11-23)
- C51编程中对单片机绝对地址访问的两种方法(11-17)
- 单片机系统设计与C51编程实践分享(01-16)