举杯邀月-与君共享 https://bbs.21ic.com/?112433 [收藏] [复制] [RSS] 分享、交流、感受、共进!

日志

C8051F340编程

已有 1083 次阅读2008-10-16 11:58 |系统分类:单片机| 状态控制

  今天的任务就是将产品的开关机键盘管理及电源状态检测给补上。液晶页面、键盘管理等都已搞好了,就差这么一点。为防止误操作,打算这样设置开关机键管理:按PWR键蜂鸣三声(3秒)后给仪器上电。关机时蜂鸣5声后保存设置关机,这个应该很容易实现。还有一个任务就是电源状态显示,我只设了一个欠压警告,如果欠压,以0.5HZ频率闪烁电源指示灯。这个就更容易啦。机子中有好几个这样闪烁的东西,例如信号指示灯,液晶光标闪烁,这就需要定时啦,定时器2就专职这个啦。


  顺便说一下,我这里的电源是隔离的,所以我检测时就只做了欠压检测,不知大家要隔离检测时,大概有哪些方法呢?例如ADC+光耦+SPI,线性光耦,不过这都很贵哦。


路过

鸡蛋

鲜花

握手

雷人

发表评论 评论 (2 个评论)

回复 woymoon 2008-10-18 08:51
因为把void BEEP_Con()放在主循环中,所以一旦错过(Timer2Loop==beepT2Loop)这个点,这时就会响最小100s,所以“一直叫”。所以把一个点改成一个域,问题就解决了。顺便精简一下:if((Timer2Loop==beepT2Loop)||((Timer2Loop>beepT2Loop)&&(Timer2Loopif((Timer2Loop>=beepT2Loop)&&(Timer2Loop
回复 woymoon 2008-10-18 08:57
昨天由于比较忙,任务没完成。电源指示灯闪烁倒是很快实现了,代码如下: void PWR_Con() { if(VOL_MON==1) //Voltage is too low { if(((Timer2Loop%2)==0)&&(pwrLedT2Loop != Timer2Loop)) { pwrLedT2Loop = Timer2Loop; PWR_LED = ~PWR_LED; } } else { PWR_LED = 1; } } 后来又编按键蜂鸣的程序,思路是在键盘处理程序中确认有键按下后启动蜂鸣,然后在定时间隔到不超过3时关掉,代码如下: void BEEP_Con() { if(BEEP_CN==1) { if(beepT2Loop==0) { beepT2Loop = Timer2Loop+3; if(beepT2Loop>=200) beepT2Loop -= 200; } else { if(Timer2Loop==beepT2Loop) { beepT2Loop = 0; BEEP_CN = 0; } } } 定时器周期是500ms,在中断中当Timer2Loop记满200时就清0,所以上述第一段代码LED是1秒闪烁,BEEP是按键响1.5秒的思路。但蜂鸣出现了不停止的状态,这就奇了怪了,怎么会这样呢,而且只有一个键这样哦,不得解,由于下班了,只能作罢。今早过来的路上思考了一下,觉得问题应该出现在if(Timer2Loop==beepT2Loop)这里,改为if((Timer2Loop==beepT2Loop)||((Timer2Loop>beepT2Loop)&&(Timer2Loop