通信网--中国通信行业门户网站 | 中国行业网站集群--通信行业电子商务唯一网站 设为首页 | 收藏本站
免费注册 商机无限 商务中心 行业展会 立即发布商机
网站首页 公司库 产品库 商机库 行业资讯 展会信息 招聘信息 招商加盟 下载中心 招标信息
关键词:
热门词汇: IP网络电话   语音识别   手机充电器   手机GPS   3G手机   传输设备   交换设备
  行业要闻 | 通信市场 | 通信技术 | 网络学院 | 5G前沿 | 4G前沿 | VoIP | IPTV | WiMAX | 呼叫中心 | IT制造 | IT就业  
  企业专栏 | 企业报道 | 通信标准 | 通信百科 | 分析预测 | 手机评测 | 增值通信 | 政策法规 | 专家观点 | 网商访谈 | 招标信息 | 物联网
网上展览:
综合厂商 | 手机 | IP电话 | 交换机 | 呼叫中心 | 网络 | 终端 | 电源 | 仪器 | 光纤 | 电缆 | 电脑 | 数码 | 软件 | 其他
中国通信网最新加盟企业: 
当前位置:网站首页 > 行业资讯 > 网络学院
【创心服务 联通你我】青春逢盛世,奋斗正当时
中国通信网 时间:2010-07-07 信息来源:单片机与嵌入式系统应用

在现有的教课书及相关文章中,都难得提到在单片机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=tempaddr<<1;

}

else {

tempkey=tempkey<<1;

}

}

以上是一段单片机外部中断1的中断服务程序,乍看似乎没什么问题,仿真调试时也能通过“编辑”。但实际上这是一段错误的程序——其中对“F0”用户标志位的“取反”操作是达不到其预期效果的。因为对“F0”用户标志位的“取反”操作是在中断服务程序中进行的。在进入中断时,C语言自动会保护“中断现场”——将程序指针PC、累加器ACC、状态字PSW等压入堆栈保护起来……直到中断返回时弹出堆栈并覆盖了中断服务时的变值,恢复到压入堆栈之前的原样。因此,状态字PSW中的F0也不例外,如果压入堆栈之前F0是处于逻辑“0”状态,中断返回后还是复原成逻辑“0”状态——不管中断服务程序中怎么取反改变——也就是说,在中断服务程序中试图改变F0之值的操作是有失偏颇的。对于上文例举的那段中断服务程序来说,若F0的初始状态为逻辑“0”,即进入中断服务之前和中断返回之后总是逻辑“0”,那么进入执行“F0=~F0”指令后F0总是逻辑“1”,因而接下运行的是“if(F0)”下花括号中“tempaddr=tempaddr<<1;”指令,而“else”下花括号中“tempkey=tempkey<<1”指令永远也运行不到。所以,若要中断服务程序达到预期的效果——“if(F0)”下花括号中的指令与“else”下花括号中的指令轮番运行,必须设立一个不受中断现场保护等影响的自定义标志位。

1自定义标志“位”的保存

在C语言编程中,自定义标志位的运用概率很大,有的一个程序中就会有好多的自定义标志位,且其中几个可能是必须要保存的。譬如有些控制器件中对一些控制状态进行保持,即使是停电之后再来电了这种控制状态依然能保持不变——这就牵涉到保存问题。

例举2:我们曾搞过一个镭射投影屏幕升降的无线遥控装置。这个以单片机为核心的控制装置与屏幕升降的卷动电机等都安装固定在一个直径不足50 mm的狭长铁桶里面,因此装入或拆卸都非常麻烦。为了一次性成功——避免再次拆卸装入的麻烦,在用C语言编程时我特意多用了一个自定义的标志位——翻转标志位“switch_sign”。因为无线遥控手柄上的向上“▲”、暂停“■”、向下“▼”的键标志都已是做定的,因此,如果由于接线等失误导致按向下“▼”键时投影屏幕向上卷、按向上“▲”键时投影屏幕却向下伸……有了“switch_sign”自定义的标志位就不用怕这些了。相关的C语言程序段如下:

#defineuint unsigned int

#defineuchar unsigned char

uint Decode_addr,Decode_key,addr;

sbit JD1_out=P0^4;//定义继电器1控制输出端

sbit JD2_out=P0^5;//定义继电器2控制输出端

sbit BEEP=P0^3;//定义蜂鸣声响输出

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控制输出端

相关资讯
· 【创心服务 联通你我】青春逢盛世,奋斗正当时 (2012-01-17)
· 【创心服务 联通你我】青春逢盛世,奋斗正当时 (2012-01-14)
· 【创心服务 联通你我】青春逢盛世,奋斗正当时 (2012-01-12)
· 【创心服务 联通你我】青春逢盛世,奋斗正当时 (2012-01-11)
· 【创心服务 联通你我】青春逢盛世,奋斗正当时 (2012-01-09)
发表评论
昵   称:   匿名发表
验证码: 
 
热门资讯
【创心服务 联通你我】青春逢盛... (2009-09-15)
【创心服务 联通你我】青春逢盛... (2011-04-28)
【创心服务 联通你我】青春逢盛... (2009-09-16)
【创心服务 联通你我】青春逢盛... (2008-07-15)
【创心服务 联通你我】青春逢盛... (2008-05-23)
【创心服务 联通你我】青春逢盛... (2008-07-31)
【创心服务 联通你我】青春逢盛... (2008-07-31)
【创心服务 联通你我】青春逢盛... (2012-01-09)
【创心服务 联通你我】青春逢盛... (2011-01-30)
【创心服务 联通你我】青春逢盛... (2010-05-28)
【创心服务 联通你我】青春逢盛... (2008-07-31)
【创心服务 联通你我】青春逢盛... (2008-07-31)
【创心服务 联通你我】青春逢盛... (2011-05-03)
【创心服务 联通你我】青春逢盛... (2008-07-31)
【创心服务 联通你我】青春逢盛... (2009-08-12)
【创心服务 联通你我】青春逢盛... (2008-07-31)
【创心服务 联通你我】青春逢盛... (2008-07-31)
【创心服务 联通你我】青春逢盛... (2009-08-12)
【创心服务 联通你我】青春逢盛... (2010-08-27)
【创心服务 联通你我】青春逢盛... (2009-08-12)
【创心服务 联通你我】青春逢盛... (2009-10-11)
【创心服务 联通你我】青春逢盛... (2009-07-24)
【创心服务 联通你我】青春逢盛... (2010-07-20)
【创心服务 联通你我】青春逢盛... (2011-02-17)
【创心服务 联通你我】青春逢盛... (2009-08-13)
国之鑫科技 | 泰尔网 | 中华网科技 | 信息产业网 | 通讯世界 | 数字通信世界 | 文传商讯 | 中华英才网 | 电话视频会议 | 凤凰科技 | 呼叫中心 | 新浪科技 | 新传媒网 | 和讯科技 | 中国科技网 | 通信英才网 | 江苏星光发电设备 | 中劳网 | 赛迪网 | MSCBSC移动通信网 | 中国软件网 | 新华网 | 腾讯科技 | 3G通信网 | 千龙网 | 光通信人才招聘网 | 通信人才网 | 中商顾问网
返回首页 | 网站简介 | 企业理念 | 免责声明 | 广告服务 | 代理政策 | 联系我们 | 铭万网 | 中国产品推广联盟
南京国之鑫科技有限公司版权所有©2008-2016 客户服务热线:025-83752991, 客户服务邮箱:gzx@gzxinfo.com
苏ICP备18005078号-1
本站图片及文字仅供功能演示,本站保留对本演示内容及功能的最终解释权

加入铭万联盟中国行业网站集群独家技术供应商