BBS建站上网365问/320.如何制作单片机站台自动复位器?
有一些站台使用硬件站台复位器,原理一般是用数字电路对振铃信号计数,超过一定次数调制解调器还没有应答,就模拟按下RESET开关,使站台复位。可以用普通数字电路实现,也可以用单片机控制。还有人利用另外一个闲置的外置调制解调器,设置振铃一定次数后应答,把指示应答的发光二极管信号牵到站台机器的复位开关上。
也有人给站台机器配一个寻呼机,把振动马达信号牵到站台机器的复位开关上,站长发现死机后,不在现场也可以打个传呼,让站台重新启动。还可以使用一个定时开关,到凌晨用户很少时,无论站台是否死机都重新启动一遍。
1996年7月劲捷电子信息站开站以后,偶尔有死机情况,都是人工发现后重新启动的,但这样当站长的总觉得心里不塌实。1997年初加装第二线后,死机情况也增多。春节期间我不能保证每天照看站台,为了使站台在不死机,1997年2月我制作了一个自动复位器,使用一年多效果很好,使站台保持了从开站以来停机时间从来没有超过24小时的记录。后来帮另外一个无人执守站台做了个一样的,结果站台运行一年没有人管也可以。现介绍如下:
(1) 特点:
* 检测到振铃超过10声或摘机整理超过30分钟自动复位主机。
* 可检测多路,有状态指示。
* 用单片机监视外置调制解调器的Ring、Terminal Ready信号,Ring信号平时为-,有振铃时为+,Terminal Ready平时为+,摘机整理时为-。
* 使用武汉力源电子股份有限公司的BASIC单片机PS1008,不用开发装置,直接连PC并口写入程序,编程不用学汇编语言,用BASIC语言,极简单、灵活,可以根据具体要求马上修改程序。联系地址为武汉70020信箱(邮政编码430079)。
* 硬件简单,除PS1008板外,只需要几个电阻做电平转换,不用绘制印刷电路板。
* 成本不到100元(如果购买力源的开发套件也不到250元)。
* 制作快,我写流程图、编程、焊接、实验一共只用了几个小时。
(2) 硬件图:
这里放置图形文件BOOT.BMP。
(3) 程序:
'==============================================================
'自动复位器
'James Qi
'劲捷电子信息站
'1997年2月3日
'==============================================================
symbol port_reboot=0 '端口 0 = 复位PC
symbol port_1ri=pin2 '端口 2 = 串口1的Ring信号
symbol port_1tr=pin3 '端口 3 = 串口1的TR信号
symbol port_2ri=pin4 '端口 4 = 串口2的Ring信号
symbol port_2tr=pin5 '端口 5 = 串口2的TR信号
symbol port_flash=7 '端口 7 = 发光二极管指示
symbol byte_ri=bit0 'byte 0 = Ring振铃标志(0/1=no ring/ring)
symbol byte_tr=bit1 'byte 1 = TR标志(0/1=not tr/tr)
symbol byte_counter=b2 'byte 2 = Ring计数
symbol byte_timer=b3 'byte 3 = TR为off的计时器
symbol byte_loop1=b4 'byte 4 = 通用循环计数器
symbol byte_loop2=b5 'byte 5 = 通用循环计数器
symbol byte_delay=b6 'byte 6 = 测试Ring和TR的延时
symbol byte_com=b7 'byte 7 = 串口号
symbol byte_port=b8 'byte 8 = direct port value
symbol max_counter=10 '最大振铃次数设置为10
symbol max_timer=30 '最大TR为OFF时间设置为30分钟
'==============================================================
power:
for byte_loop1=1 to 120 '启动后延时2分钟不监视
toggle port_flash
pause 1000
next
start:
high port_reboot
byte_counter=0
byte_timer=0
byte_ri=0
byte_tr=1
for byte_com=0 to 1 '循环监视两个调制解调器。
Toggle port_flash'闪动发光二极管指示工作正常。
Gosub sub_ri
if byte_ri=0 then test_tr
low port_flash
test_ri: '监视Ring信号。
Gosub sub_ri
if byte_ri=1 then test_ri
byte_counter=byte_counter+1
if byte_counter=max_counter then reboot '是否超过规定次数。
For byte_loop1=1 to 50
pause 100
gosub sub_ri
if byte_ri=1 then test_ri
next
goto start
test_tr: '监视TR信号。
Gosub sub_tr
if byte_tr=1 then next_com
low port_flash
for byte_loop1=1 to max_timer '是否超过规定次数。
For byte_loop2=1 to 240
pause 200
gosub sub_ri
if byte_ri=1 then test_ri
gosub sub_tr
if byte_tr=1 then start
next
next
reboot: '是否超过规定次数。
Low port_reboot
high port_flash
pause 2000
low port_flash
high port_reboot
pause 2000
goto power
next_com:
next
goto start
'=============================================================
sub_ri: '监视Ring信号的子程序。
Gosub com_ri
byte_ri=byte_port
for byte_delay = 1 to 5
gosub com_ri
if byte_ri<>byte_port then sub_ri
pause 5
next
return
com_ri:
branch byte_com,(com_ri1,com_ri2)
com_ri1:
byte_port=port_1ri
return
com_ri2:
byte_port=port_2ri
return
'------------------------------------------------------------
sub_tr: '监视TR的子程序。
Gosub com_tr
byte_tr=byte_port
for byte_delay = 1 to 5
gosub com_tr
if byte_tr<>byte_port then sub_tr
pause 5
next
return
com_tr:
branch byte_com,(com_tr1,com_tr2)
com_tr1:
byte_port=port_1tr
return
com_tr2:
byte_port=port_2tr
return
'==============================================================
劲捷电子信息站按以上办法制作的复位器基本上杜绝了站台的死机现象,但仍然有两点不足:不能监视内置式调制解调器,以及如果调制解调器本身死机不能解决。可以在原电路的基础上增加振铃判别电路以便无论内置、外置调制解调器都可以监视,以及增加继电器控制站台机器和调制解调器的交流电源电路。这样就是一个很完美的解决办法。