范文一:仓库防火防盗标语
仓库防火防盗标语
仓库防火防盗标语
1、打击偷盗犯罪是每个员工应尽的责任。
2、进出物品要严查,积极配合共防范。
3、防范措施做得好,公司财物不会少。
4、定期总结消防安全工作,实施奖惩。
5、法网恢恢,盗贼难逃。
6、保护公司财产,全员打击偷盗。
7、防偷两大忌,麻痹和大意。
8、注意反常现象,识破偷盗分子。
9、组织学习贯彻消防法规,完成上级部署的消防工作。
10、明确防盗责任,实行严格管理。
11、打击偷盗,人人有责。
12、贯彻防偷防盗规则,落实防偷防盗责任。
13、随手关门锁门,共同防范盗贼。
14、学习防偷防盗知识,提高自防自律能力。
15、严厉打击偷盗违法犯罪。
16、防盗防贼,随手锁门。
17、仓库重地,闲人免进。
18、请随手锁门,不然你就是小偷的领路人。
19、防偷防盗有必要,共同监督要记牢。
20、领导专职、义务消防队组织和专职、兼职消防人员,制定灭火应急方案,组织扑灭火灾。
21、见义勇为光荣,胆小怕事可耻。
22、仓库重地,防火防盗。
23、落实防盗规章制度,强化防偷防范措施。
24、安全意识要加强,防偷防盗靠大家。
25、偷盗不难防,重在守规章。
26、仓库重地,严禁烟火。
27、随手锁门举手之劳,防偷防盗事关重大。
28、组织开展防火检查,消除火险隐患。
29、防盗措施订得细,财物安全有保证。
30、组织制定电源、火源、易燃易爆物品的安全管理和值班巡逻等制度,落实逐级防火责任制和岗位防火责任制。
31、组织对职工进行消防宣传、业务培训和考核,提高职工的安全素质。
范文二:仓库防火防盗制度
库房防火管理制度
1. 仓库重地,无关人员严禁进入。
2. 所有进入库房的人员,不得携带火种进入,库区内严禁吸烟、用火。
3. 值班人员上岗前要进行三级安全培训,并会熟练使用岗位配置的灭火设施,
掌握报警、灭火等方面的知识。
4. 加强仓库安全管理,仓库大门做明锁加暗锁处理,一层的窗户加防护栏。
5. 值班人员24小时全天候轮流值班,不得离岗空岗,并做好交接班记录,提
高防范意识,确保安全。出现异常情况,及时拨打报警电话,并在第一时间报上级领导。
6. 库房的电线主线应架设在库房外,引进库房的电线必须装置在金属或硬质塑
料套管内,电气线路和灯头安装在库房通道的上方,与堆垛保持安全距离,严禁在库房门,严禁在库房闷顶架电线。
7. 库房内不准使用碘钨灯、日光灯、电炉子、电熨斗、电烙铁,交流收音机和
电视机等电气设备,不准用可燃材料作灯罩,严禁使用60瓦以上的灯泡。
8. 库房内不准架设临时电线。
9. 电气设备经常检查,发现可能引起打火、短路、发热和绝缘不良等情况时,
必须立即修理。
10. 禁止使用不规格的保险装置,电器设备和电线不准超过安全负荷。
11. 库房内配置的灭火器、消防设施周围严禁对方其它物品。
12. 消防器材设备派专人负责管理,定期检查维修,保证完整好用。
13. 加强仓库的通风和温度、湿度的控制,防止热量的积聚,降低库房温度、湿
度。
14. 每日应对库内物资进行巡视检查,发现火种、火源、电源及库内环境存在与
防火安全相抵触的问题要及时发现,及时消除。
15. 要确保仓库专用的消防设施、器材完好、有效。
库房防盗管理制度
1. 值班人员必须具有高度的工作责任心,认真负责,及时掌握各种信息,对红
外视频防盗和监控在运行过程中发现的异常情况3分钟到达现场及时进行处理并做好登记。
2. 非雷雨天气和施工需要,要保持视频监控和红外线24小时运行。
3. 每天对视频监控和红外防盗运行的情况进行登记,并在值班登记本做好记录。
4. 值班人员必须经过培训,严格操作规程,确保视频监控和红外系统的正常运
作。
5. 无关人员未经许可不准进入视频监控室,非单位领导同意严禁外人调阅声像
资料。
6. 不准在视频监控室聊天、玩耍,不准随意摆弄机器设备,保持室内的清洁卫
生。
7. 必须保守秘密,不得在视频监控室以外的场所议论有关录像的内容。
8. 视频监控设备和红外线系统发生故障时,及时排除设备故障,不能解决的报
请专业维修部门及时维修并做好登记。
9. 保持设备的清洁卫生,坚持每月的系统的维护,确保机器设备的正常运作。 10. 本制度与公司各项规章制度配套使用。
范文三:仓库防火防盗标语
仓库防火防盗标语
导语:片片绿叶汇成万顷绿洲,星星之火可毁涛涛林
海。 以下小编为大家介绍仓库防火防盗标语文章,欢迎大家阅读
参考!
仓库防火防盗标语1 1、见义勇为光荣,胆小怕事可耻
2、偷盗不难防,重在守规章
3、随手锁门举手之劳,防偷防盗事关重大
4、防偷防盗有必要,共同监督要记牢
5、安全意识要加强,防偷防盗靠大家
6、仓库重地,防火防盗
7、仓库重地,严禁烟火
8、提高业主自防意识,共同建设和谐社区
9、仓库重地,闲人免进
10、落实防盗规章制度,强化防偷防范措施
11、学习防偷防盗知识,提高自防自律能力
12、贯彻防偷防盗规则,落实防偷防盗责任
13、家居防盗,从大门开始
14、提高员工防范意识,共同建设和谐环境
15、打击偷盗,人人有责
16、保护公司财产,全员打击偷盗
17、明确防盗责任,实行严格管理
18、注意反常现象,识破偷盗分子
19、随手关门锁门,共同防范盗贼
20、打击偷盗犯罪是每个员工应尽的责任
仓库防火防盗标语2 1、打击偷盗犯罪是每个员工应尽的责任。
2、进出物品要严查,积极配合共防范。
3、防范措施做得好,公司财物不会少。
4、定期总结消防安全工作,实施奖惩。
5、法网恢恢,盗贼难逃。
6、保护公司财产,全员打击偷盗。
7、防偷两大忌,麻痹和大意。
8、注意反常现象,识破偷盗分子。
9、组织学习贯彻消防法规,完成上级部署的消防工作。
10、明确防盗责任,实行严格管理。
11、打击偷盗,人人有责。
12、贯彻防偷防盗规则,落实防偷防盗责任。
13、随手关门锁门,共同防范盗贼。
14、学习防偷防盗知识,提高自防自律能力。
15、严厉打击偷盗违法犯罪。
16、防盗防贼,随手锁门。
17、仓库重地,闲人免进。
18、请随手锁门,不然你就是小偷的领路人。
19、防偷防盗有必要,共同监督要记牢。
20、领导专职、义务消防队组织和专职、兼职消防人员,制定灭火应急方案,组织扑灭火灾。
21、见义勇为光荣,胆小怕事可耻。
22、仓库重地,防火防盗。
23、落实防盗规章制度,强化防偷防范措施。
24、安全意识要加强,防偷防盗靠大家。
25、偷盗不难防,重在守规章。
26、仓库重地,严禁烟火。
27、随手锁门举手之劳,防偷防盗事关重大。
28、组织开展防火检查,消除火险隐患。
29、防盗措施订得细,财物安全有保证。
30、组织制定电源、火源、易燃易爆物品的安全管理和值班巡逻等制度,落实逐级防火责任制和岗位防火责任制。
31、组织对职工进行消防宣传、业务培训和考核,提高职工的安全素质。
范文四:仓库防火、防盗预案
库房防火、防盗措施
1、仓库重地,无关人员严禁进入。
2、所有进入库房的人员,不得携带火种进入,库区内严禁吸烟、用火。
3、值班人员上岗前要进行三级安全培训,并会熟练使用岗位配置的灭火设施,掌握报警、灭火等方面的知识。
4、加强仓库安全管理,仓库大门做明锁加暗锁处理,一层的窗户加防护栏。
5、值班人员24小时全天候轮流值班,不得离岗空岗,并做好交接班记录,提高防范意识,确保安全。
出现异常情况,及时拨打报警电话,并在第一时间报上级领导。
6、库房的电线主线应架设在库房外,引进库房的电线必须装置在金属或硬质塑料套管内,电气线路和灯头安装在库房通道的上方,与堆垛保持安全距离,严禁在库房门,严禁在库房闷顶架电线。
7、库房内不准使用碘钨灯、日光灯、电炉子、电熨斗、电烙铁,交流收音机和电视机等电气设备,不准用可燃材料作灯罩,严禁使用60瓦以上的灯泡。
8、库房内不准架设临时电线。
9、电气设备经常检查,发现可能引起打火、短路、发热和绝缘不良等情况时,必须立即修理。
10、禁止使用不规格的保险装置,电器设备和电线不准超过安全负荷。
11、库房内配置的灭火器、消防设施周围严禁对方其它物品。
12、消防器材设备派专人负责管理,定期检查维修,保证完整好用。
13、加强仓库的通风和温度、湿度的控制,防止热量的积聚,降低库房温度、湿度。
14、每日应对库内物资进行巡视检查,发现火种、火源、电源及库内环境存在与防火安全相抵触的问题要及时发现,及时消除。
15、要确保仓库专用的消防设施、器材完好、有效。
范文五:仓库智能防火防盗系统
一、课题主要内容:
(1)了解仓库报警系统的基本原理 , 熟悉利用传感器产生报警的原理。
(2)掌握单片机控制防盗和防火报警系统的原理及其应用。
(3)设计一个能对仓库的火灾、盗窃实行自动报警的智能防盗防火报警器;设置紧急呼 叫系统;用户端自动报警器对各传感器的信号进行检测和控制。
(4)了解单片机监控传感器的基本原理并能够将模块化思想引入此系统,从而使整个系 统的功能更完善、灵活、可调。
二、研究的方法与技术路线:
仓库智能化防盗防火报警系统集防盗防火功能于一体, 可全天候自动检测盗警和火警, 当确定警情时自动发声报警。 传感器采用密码检测和温度探测器, 分别对盗情和火情进行检 测, 当密码错误达 3次或发生火灾时, 单片机发出中断申请, 播放报警声音和启用红色二极 管,单片机控制 LCD 显示屏输出警报信号只针对火情。
开机初始密码值为 123456,进入系统前显示字符串缓冲以确保得到标准温度,同时打 开检测、中断。 进入待机状态后,根据设定好的密码,采用 4×4键盘实现密码的输入功能, 如果密码输入的密码不正确 3次,就发出报警声。 当输入正确之后,绿灯提示,同时设定为 管理员(管理员可以对系统的密码进行修改)。
为了突出扩展性,在密码正确之后, 单片机将对扩展的检测硬件操作, 比如防盗门,当 密码正确之后, 系统发送信号给硬件, 硬件运行打开门。 又比如密码正确之后撤销红外检测, 关于硬件方面都是前人研究的成熟技术, 这里不对硬件做过多的描述, 本系统主要对单片机 部分的编程设计做解释。
(1)单片机型号可选 AT89C51。
(2) 6位密码(进入系统且密码正确后可修改密码,密码必须是 6位)。
(3)密码的输入采用 4×4键盘实现,输入 6位数字后,按确定键结束。
(4)若输入的密码正确,锁打开,同时用发光二极管亮 1秒作为提示。
(5)报警采用蜂鸣器或扬声器,一旦报警只有管理员进入才可以关闭声音。
(6)当进入系统后,可以对系统密码进行修改。
(7)当温度达到 50°C 以后,系统自动报警,并且在 LCD 上显示“ warning ”。
(8)单片机, c 语言编程。
三、系统软件的设计与实现:
3.1 软件设计思想
由于采用 12M ,处理速度本来不够快,在一个 while 里面尽量减少调用实现的次数,如 果调用过多,就会倒是系统资源占用严重,系统运行反应慢,比如在温度有所改变的时候, 我们可以不必这么准确地更新到十分位,本系统采用当温度改变 1°C 的时候,才去更新数 据(当然也可以精确到 0.5°C )。
添加按键声音, 虽然对整个系统没多少影响, 但是对用户这是一个很好提示效果。 在温 度或密码报警的时候, 将不会” normal ”, 而会显示” waring ”的警号词语, 在进入系统后, 管理员修改密码作 2个输入密码,前后比较 2次输入的密码,正确后提示“ success ”, 错 误提示“ error ”,用户看以此来判断修改密码错误的原因。
还有在输入密码那块,在输入密码那段将 LCD1602重新设置一下,使其出现光标闪烁 效果,这让人第一眼就知道输入的密码将在哪一块出现。这对程序检错也是很大的帮助。
3.2
3.3 必要的参数说明:
sbit DQ=P1^0; //温度使能
sbit SPK=P1^1; //喇叭
sbit RL=P1^2; //红灯
sbit GL=P1^3; //绿灯
uchar code TempText[2][8]={
此字符串于 WarnSign 有关, 当 WarnSign =1 即在屏幕上提示 Warning 标志温度过高可能着火了, 同时报警 声。
uchar ClientCode[7]={
uchar CodeStr[7]; //登陆状态下临时密码
uchar NewCode1[7]; //新的密码 1
uchar NewCode2[7]; //新的密码 2 2次新的密码将会对比。
uchar FloatTempt[8]; //存放温度的数组;
uchar Int_Tempt,Flot_Tempt; //温度高位,和小数位
uchar ERTimes[3]={'2','1','0'}; //密码错误的次数;
uchar code Message[2][12]={
//登陆状态下管理员身份验证提示。
uchar code ASucess[2][16]={
……
uchar EroTimes=0; //错误的次数 对应着 ERTimes[3];
uchar frq; //声音的频率
uchar Voice=1; //声音 Stop/Start的标志
uchar AmditKey=0; //管理员进去之后,管理员标志
uchar WarnSign=0; //温度太高标志
uchar NCSign=0; //修改密码标志, 2次修改密码
uchar Size=0; //CodeStr的大小,有此标志可以使用 Back 按键功能
uchar NCSize=0,ACSize=0; //NewCode2[7], NewCode2[7]的大小,
uchar BackFlag=0; //Back按键可以使用标志
uchar Ensure=0; //确定键按下的标志
uchar OverFull=0;
//Back键 此标志来确定是那一种 back 6个的情况和未满 6的情况;
此段为按下键盘发声数据。
uchar code SONG_TONE[]={255,0};
uchar code SONG_LONG[]={1,0};
uchar EvetInf; 键盘扫描变量
3.4 主函数模块
学过 C 语言的都知道主函数是干什么的,是运行整个系统的入口,在主函数首先初始化各模块,(温 度模块、中断初始化、显示模块初始化),然后程序进入 while 不停调用各种功能模块。
??
uchar flag=0;
TMOD = 0x01;
frq = 0x00;
TH0 = 0xfe;
TL0 = 0xff;
TR0 = 1;
IE = 0x82;
P1=0xff; //初始化 p1口,全设为 1, 设为输入
以上关于定时中断,后节将会介绍。
Inital_LCD1602(); //初始化 LCD1602
ReadFrmDS18B20(); //先给初始化掉 得出正确的时间
if(Int_Tempt>60) //当温度达到大于 50的时候, WarnSign 就会置 1启动
WarnSign=1; //当 WarnSign = 1,报警就会随之响起。
ScreenMyInfo(); //这里面的时候程序执行的时候,只会运行一次,开机显示任意字符 串 ,这里为读取时间起到缓冲作用。
SetComLCD1602(0xca);
while(1)
{
if(EroTimes>=3 ||WarnSign==1)
{
下面说到了 EroTimes (见下节密码错误次数标志)或者温度大于 50就会报警
RL=1;
并且红灯一直亮。
下面这块改变频率利用中断发声。
??
case 0:frq += 15;break; //flag标志置 0时 ,frq 递增
case 1:frq -= 15;break; //flag标志置 1时 ,frq 递减
if (!(frq^0xff)) flag = 1; //当 frq 增加到 FFH 时 ,flag 置 1, 准备 frq 递减
if (!(frq^0x00)) flag = 0; //当 frq 递减到 00H 时 ,flag 置 0, 准备 frq 递增
??
AllKeyScan(); // 无限扫描按键
ReadFrmDS18B20(); //这里不是及时显示温度了,闪烁效果太厉害了。频率不够
if(1 <= (int_tempt="" -="" int_lttemp)="" ||="" -1="">= (Int_Tempt - Int_LtTemp))
ShowAllStr(); //重新刷新屏幕
Int_LtTemp = Int_Tempt; //利用温度变了一度就重新显示
??
3.5 密码模块
IsAcessSys 映射于按键的 (3,0)和 (3,1)这里将此两个键设为确定键,当这个 2个坐标任意一个按键(坐 标)按下时候 Ensure 置 1,然后再 main 里面循环里面将此函数调用,下面是调用的语句。
if(Ensure==1)
{
IsAcessSys();
Ensure=0;
}
void IsAcessSys()函数是对密码的检验的正确性,而同时此函数的作用不仅仅比较函数的比较,更重要的功 能在管理员进入系统后, AmditKey 置 1(AmditKey 后面叫管理员) ,管理员就可以对密码进行修改,
uchar i=0;
if(NCSign==1)
{
NCSign=2;
ChangeCode();
}
NCSign 是对密码修改器作用,当进入系统后,修改密码按键(0,0)按下,调用
ChangeCode () , NCSign = 1,进入修改的状态。
??
if(NCSign==4)
??
当按下按键的 (3,0)和 (3,1)时候, NCSign = 1 进入 ChangeCode();
void ChangeCode()
??
if(AmditKey==1 && NCSign==0)
//只有管理员才可以修改密码, NCSign 为第一次输入新密码才会起作用。
??
NCSign=1;
if(NCSign==2)
??
NCSign=3;
??
而在 ChangeCode(); 中 NCSign =3,在 JudgeStrSize 中函数对
else if(NCSign==3)
??
NewCode2[ACSize] = keys + '0'; //*
LCD1602Input(NewCode2[ACSize]);
if(ACSize>=5)
{
ACSize=5;
??
NCSign=4; // 第二个字符新密码成功
SetComLCD1602(0xcb); // 第二行第最后那个位置
}
当 NCSign = 4了 就说明第一次输入的新密码至少 ACSize = 5位,后才可以点击确定键。
V oid IsAcessSys 函数
??
if(NCSign==4)
??
if(strcmp(NewCode1,NewCode2)==0)
在 NCSign =4 下,就是得到了 2个密码新字符串了。比较 2个新的密码字符串是否相等、如果成功,那么 就在屏幕上显示 Successfully 并把 NewCode 的值重新赋给 ClientCode ; (ClientCode 定义的全局进入系统的 密码字符串,详情查看附录代码)
while(NewCode1[i]! = '\0')
ClientCode[i] = NewCode1[i];
i++;
}
ClientCode[i]='\0'; //输出 successfully!!
??
while(Message[0][i]!='\0')
{
LCD1602Input(Message[0][i]);
i++;
}
for(i=0;i<>
DelaySecond(200);
??
下面是 2次新的字符串如果不相等, 那么在屏幕上显示 ERROR , 并且调用 ShowAllStr(); (PS :ShowAllStr();全部代码查看附录)
i=0;
SetComLCD1602(0x01);
SetComLCD1602(0x84);
while(Message[1][i]!='\0')
{
LCD1602Input(Message[1][i]);
i++;
}
for(i=0;i<>
DelaySecond(200);
假如 2次新密码匹配成功,则界面就会返回到登陆界面
就要对一下参数初始化;
AmditKey=0;
NCSign=0;
CodeStr[0]='\0';
Size=0;
NCSize=0;
ACSize=0;
ShowAllStr();
??
当系统没有进入时,也就没有管理员,密码正确程序系统才承认你是管理员,
当 AmditKey = 0时候,说明此时没管理员,只有在当前输入密码后,按下确定键时才会相应此条 if else if(AmditKey==0)
i=0;
SetComLCD1602(0x01);
SetComLCD1602(0x82);
SetComLCD1602(0x0c);
while(CletLoad[i]!='\0')
LCD1602Input(CletLoad[i]);
i++;
}
DelaySecond(250);
i=0;
if(strcmp(CodeStr,ClientCode)==0)
//比较当前输入的密码,跟全局密码 ClientCode 对比 ,如果正确,确定管理员 AmditKey = 1; AmditKey=1;
??
while(ASucess[1][i]!='\0')
{
LCD1602Input(ASucess[1][i]);
i++;
}
当登陆成功的时候,绿灯指示等就会亮 1s 钟作为合法提示
参看下面代码
for(I = 0;I < 10;="" i="" ++)="" 绿="">
{
GL=1;
DelaySecond(100);
}
GL=0; SPK=0;EroTimes=0;RL=0;
??
当密码对比不正确时,重新初始化。
i=0;
SetComLCD1602(0x01);
SetComLCD1602(0x84);
while(ErrorInfo[0][i]!='\0')
{
LCD1602Input(ErrorInfo[0][i]);
i++;
}
这里密码错误了,在屏幕上错误的信息。
i=0;
SetComLCD1602(0xc2);
LCD1602Input(ERTimes[EroTimes]);
ERTimes[EroTimes]来确定还有多少次输入的机会。
如果密码错误了,将会在屏幕上提示还剩下几次输入机会。
SetComLCD1602(0xc4);
while(ErrorInfo[1][i]!='\0')
{
LCD1602Input(ErrorInfo[1][i]);
} 这里密码错误了,在屏幕上错误的信息。
for(i=0;i<>
DelaySecond(250); CodeStr[0]='\0';
这里有必要说一下 EroTimes 当在登陆界面上每次输入密码按确定键错误的话, EroTimes 机会 +1, 当达到 3次,系统就会报警, (本程序采用中断报警,代码如下节)
EroTimes ++;
Size=0;
Ensure=1; //必须置 1 或者置 0,不然错误了后 不能使用 back 按钮了
ShowAllStr();
??
3.6 显示模块
进入系统后,如右图 6所示,在 LCD 显示芯片将依据程序显示设定的字符串显示, LCD 设定 2行 16个字符(调用命令), SetComLCD1602(0x38);
SetComLCD1602(0x0c);开关光标, 光标显示部分只将出现在第二行第 11个的位置开始, 这个可以一眼 可以看出来密码输入的位置。默认密码为 6位,也就是说修改后的密码也只能是 6位,当程序中设定当超 过 6
位时候,光标将不会往后面移动。
图 6 显示模块电路图
RS 为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
RW 为读写信号线,高电平时进行读操作
,低电平时进行写操作。当 RS 和 RW 共同为低电平时可以写入指令或者显示地址,当 RS 为低电平 RW 为高电平时可以读忙信号,当 RS 为高电平 RW 为低电平时可以写入数据。
E 端为使能端,当 E 端由高电平跳变成低电平时,液晶模块执行命令。
其对 LCD1602的操作代码如下:
sbit RS // RS为寄存器选择
sbit RW //为读写信号线
sbit E // E端为使能端
对 LCD 的设置,使能改变读入数据部分
RS=0;
RW=0;
E=0;
P0=CommandLCD;
E=1;
DelaySecond(10)
E=0;
先将 RS 、 RW 、 E 端全部置低,在给一个使能 E 端上升沿让它读取指令,延迟有助于数据的读入稳定性。 向 LCD1602中写数据部分
RS=1;
RW=0;
E=0;
P0=InputDat;
E=1;
DelaySecond(3);
E=0;
先将 RW E端全部置低、 RS 置高,寄存器处于读取数据状态,然后 E 端上升沿让它读取数据,延迟有 助于数据的读入稳定性。
3.7 键盘模块
键盘模块,如右图 7,在主函数内不断键盘进行扫描,可以把键盘映射到一个二维坐标,将 P3口得 P3.4~P3.7看成 X 轴的坐标大小,同理 Y 轴上坐标大小由 P3.0~P3.3(本程序是在第四象限的坐标),当程 序设定扫描 P3 = 0xef 即 0x11101111。按照上述规定分析 xy 轴,其结果不难推出,即 x 轴为高位 1110, y 轴为低四位为 11111,则 P3.4位为 0,从而起到对 P3.4口(第一列)的扫描。当 P3.4口的 Y 轴上有值的话 (这里 0设定为有键按下),那么 XY 轴上就都有值了,数据将不再指向一条直线,而是得出一个点。比 如 0x11101110,按照上面的分析 x 轴上 P3.4 = 0, y 轴上 P3.0 = 0,坐标(0 , 3);在键盘上此坐标对应这 数字’ 7’,同理其他的键可以以此理解。
AllKeyScan 扫描所有的按钮, P3口在 main()里面初始化 0xff, 在 mian 里面用无限循环对键盘扫描。 碰 到能取出点的坐标的情况将稍作延迟后确定后调用及对应的函数实现功能。
图 7 键盘模块电路图
本节键盘扫描部分代码如下:
P3=0xef; EvetInf=P3;
P3 = 0xef
即 0x11101111就是第一列。
if(EvetInf!=0xef)
{
当 P3 = 0xef 即第一列中有某个按键被按下。
EvetInf=P3;
PlayButVocie();
当按下就会发声,调用发声函数。
DelaySecond(2);
延迟一下,再次确定是否 P3列某个按键是否按下。
??
switch(EvetInf)
case 0xee: JudgeStrSize(7);break;
0x11101110 即坐标(0, 3),数据 7,调用函数 JudgeStrSize(7); case 0xed: JudgeStrSize(4);break;
0x11101101 即坐标(0, 2),数据 4,调用函数 JudgeStrSize(4); case 0xeb: JudgeStrSize(1);break;
0x11101011 即坐标(0, 1),数据 1,调用函数 JudgeStrSize(1); case 0xe7: ChangeCode();break;
0x11100111 即坐标(0, 0),数据修改密码,调用函数 ChangeCode();
EvetInf=EvetInf & 0x0f;
取 Y 轴低 4位。
while(EvetInf!=0x0f)
{EvetInf=P3;
EvetInf=EvetInf & 0x0f;}
把 EvenInf 数据复原、有利于减小误差。
??
类似方法第二、第三列、第四列。
??
SetComLCD1602(0x0c); //显示开,关光标
此处用到效果就是在密码那块地方光标才会闪速,其他的地方不显示,效果见仿真。 3.8 定时中断
本设计中定时中断只用于声音报警。
void timer0() interrupt 1 using 1
{
if(3 == EroTimes || 1 == WarnSign)
{
TH0 = 0xfe;
TL0 = frq;
SPK = ~SPK;
??
在 main 中定义打开中断
TMOD = 0x01; 选择 T0的方式 1中断。
frq = 0x00;
TH0 = 0xfe;
TL0 = 0xff;
方式 1下 TH0 TL0的计算方法如下
X=错误!未找到引用源。 //X的高位即为 TH0,地 8位为 TL0; TR0 = 1;
允许 T0计数,本程序中表示写到这里熟悉一下。
IE = 0x82;
当然,开始时设置 EA =1是必须的。它是所以中断允许的总开关。
ET0溢出允许中断
3.9 温度模块
图 8 温度模块电路图
实物电路图如图 8,写时间隙分为写“ 0”和写“ 1”。在写数据时间隙的前 15uS 总线需要是被控制器 拉置低电平,而后则将是芯片对总线数据的采样时间,采样时间在 15~60uS,采样时间内如果控制器将总 线拉高则表示写“ 1”, 如果控制器将总线拉低则表示写“ 0”。 每一位的发送都应该有一个至少 15uS 的低 电平起始位,随后的数据“ 0”或“ 1”应该在 45uS 内完成。整个位的发送时间应该保持在 60~120uS,否 则不能保证通信的正常。
读时间隙时控制时的采样时间应该更加的精确才行,读时间隙时也是必须先由主机产生至少 1uS 的低 电平,表示读时间的起始。随后在总线被释放后的 15uS 中 DS18B20会发送内部数据位,这时控制如果发 现总线为高电平表示读出“ 1”,如果总线为低电平则表示读出数据“ 0”。每一位的读取之前都由控制器 加一个起始信号。注意:必须在读间隙开始的 15uS 内读取数据位才可以保证通信的正确。
DQ = 1; //DQ复位
Delay_UMs(8); //稍做延时
DQ = 0; //单片机将 DQ 拉低
Delay_UMs(80); //精确延时 大于 480us
DQ = 1; //拉高总线
Delay_UMs(20); //注意延迟,不然会出错 Delay_Fut(10);出错!
复位:首先我们必须对 DS18B20芯片进行复位,复位就是由控制器(单片机)给 DS18B20单总线至 少 480uS 的低电平信号。当 18B20接到此复位信号后则会在 15~60uS后回发一个芯片的存在脉冲。 DS18B20芯片与单片机的接口:
??
for (i=8;i>0;i--) 循环取出 8位
DQ = 0; // 给脉冲信号
sChar>>=1; //数据右移一位
DQ = 1; // 给脉冲信号
if(DQ)
sChar|=0x80; //按位或,取最高位
Delay_UMs(4);
return(sChar);
ds18b20读一个字节 :存在脉冲,在复位电平结束之后,控制器应该将数据单总线拉高,以便于在 15~60uS后接收存在脉冲,存在脉冲为一个 60~240uS的低电平信号。至此,通信双方已经达成了基本的协 议,接下来将会是控制器与 18B20间的数据通信。如果复位低电平的时间不足或是单总线的电路断路都不 会接到存在脉冲,在设计时要注意意外情况的处理。
若要读出当前的温度数据我们需要执行两次工作周期,第一个周期为复位、跳过 ROM 指令、执行温 度转换存储器操作指令、等待 500uS 温度转换时间。紧接着执行第二个周期为复位、跳过 ROM 指令、执 行读 RAM 的存储器操作指令、读数据(最多为 9个字节,中途可停止,只读简单温度值则读前 2个字节 即可)。其它的操作流程也大同小异。
void WriteOneChar(uchar WDat)写法
for (i=8; i>0; i--)
{
DQ = 0;
DQ = WDat&0x01; //取最低位
Delay_UMs(5);
DQ = 1; //上升沿将数据送入
WDat>>=1;
??
执行或数据读写:一个存储器操作指令结束后则将进行指令执行或数据的读写,这个操作要视存储器 操作指令而定。 如执行温度转换指令则控制器 (单片机) 必须等待 18B20执行其指令, 一般转换时间为 500uS 。 如执行数据读写指令则需要严格遵循 18B20的读写时序来操作。
unsigned char a=0,b=0,x=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
0xCC 为跳过 ROM , 命令发出后系统将对所有 DS18B20进行操作, 通常用于启动所有 DS18B20转换之前, 或系统中仅有一个 DS18B20时。
WriteOneChar(0x44); // 启动温度转换
0x44 为温度转换寄存器, 用于启动 DS18B20进行温度测量, 温度转换命令被执行后 DS18B20保持等待状 态。 DS18B20将在总线上输出‘ 0’,若温度转换完成,则输出‘ 1’。
Delay_UMs(50); // this message is wery important
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE);
//读取温度寄存器等(共可读 9个寄存器) 前两个就是温度
字节的读或写是从高位开始的;
Delay_UMs(50);
a=ReadOneChar(); //读取温度值低位
b=ReadOneChar(); //读取温度值高位
Int_Tempt=(a>>4)|(b<4)&0x3f;>4)&0x3f;>
Flot_Tempt=(a<4)&0xf0;>4)&0xf0;>
LSB 的高 4表示十位和个位,后 4为表示小数位。本设计只保存一位小数。
MSB 的高 4为 S 为符号为,正负温度。后 4位为百位,在这里不考虑负温度,所以将 0x3F 将高位过 滤掉,防火只检测高温着火点检测。
对于高于某温度的值返回报警。
下面的代码是将取出来的数据转化为字符串,因为在 LCD1602中只能读取字符,只有这样才好显示 出来。显示代码见下面函数。
if(b & 0x80)
FloatTempt[0]='-'; //负数 因为是防火,不需要算出负数
else
FloatTempt[0]=' ';
if(Int_Tempt>100)
{
FloatTempt[1]='9'; //整数十位
FloatTempt[2]='9'; //整数个位
}
else
{
FloatTempt[1]=Int_Tempt/10+'0'; //整数十位
FloatTempt[2]=Int_Tempt%10+'0'; //整数个位
}
FloatTempt[3]='.';
if(Flot_Tempt & 0x80)
x=x+5000;
if(Flot_Tempt & 0x40)
x=x+2500;
??
PS :LSB 的第 0~4位为小数部分 xxxx1111 10000/16 = 625,就是说 1就代表 625, xxxx1000
就是 8*625 = 5000;
FloatTempt[4]=x/1000+'0'; //十分位
FloatTempt[5]=0xdf; //温度符号
这个是 LCD1602 C GROM 内的编码
FloatTempt[6]='C';
FloatTempt[7]='\0';
}
下面是将温度字符串传送给 LCD 1602中显示出来。
void ShowTempture() //显示程序
int I = 0;
ReadFrmDS18B20(); //开启温度采集程序
SetComLCD1602(0x89); //温度数据转换成液晶字符
while(FloatTempt[i] ! = '\0')
{ LCD1602Input(FloatTempt[i]);
i++;}
利用循环将温度字符串一个一个显示出来。
3.10 返回模块
void BackOneStep()当键盘(2,0)键被按下是调用,此功能需要下列代码才能真正发挥效果
此段复制于 main 里面
if(1 == BackFlag) //当按下返回键,就有 2中状态
if(NCSign!=0) //当按下返回键,状态 1:NCSign!=0说明在修改密码
ShowChAllStr(); //显示修改密码的界面。
Else //当按下返回键,状态 2:当前操作的界面。
ShowAllStr();
BackFlag=0;
ShowChAllStr(); 代码区见附录。
??
if(AmditKey==1 && NCSign==1)
??
else if(AmditKey==1 && NCSign==3)
??
说到 BackOneStep 函数的实现,原理是该变输入的密码字符串 CodeStr (CodeStr 临时存放在登录界面 下输入密码的字符串),当按下 backspace 返回键时候,把临时字符串前一个赋值为’ \0’ ; 然后再 main 中 while (1)循环中显示新的临时字符串,所以感觉上就是退了一格。
这里 backspace 返回键有 2中情况,当时第六个字符时候按 backspace 返回键、和当不是第六个字符时 候按 backspace 返回键算法不同的,代码自行分析。
代码如下:
void BackOneStep() 函数写法
if(AmditKey==0)
此段参数与 JudgeStrSize 中联系非常大,有必要引用其中部分重要代码说明
??
if(NCSize>=5)
NCSize=5;
OverFull=1;
当输入的位数为 6位时,当 6时的情况后下面没到 6的情况不同,到 6了用
OverFull =1标志;
NewCode1[NCSize+1]='\0';
SetComLCD1602(0xcb);
第二行第最后那个位置,当他到了最后一个字符,不管在按什么数字键,值可能改变最后一个数字, 长度光标都不会改变
??
OverFull=0;
NewCode1[NCSize]='\0';
??
if(OverFull==1)
CodeStr[Size]='\0';
else if(OverFull==0)
CodeStr[Size-1]='\0';
BackFlag=1;
返回标志置 1,就可以在 main 里面调用上层代码。
if(Size>0)
--Size;
当 backspace 返回键,他的字符个数就减少了一个。
else
Size=0;
以下代码是对修改密码的情况分析,原理同上,这里不一一说明了。 if(AmditKey==1 && NCSign==1) ??
else if(AmditKey==1 && NCSign==3)
??
四、完整源代码:
#include
#include #include #define uchar unsigned char #define uint unsigned int sbit RS=P2^2; //使能 sbit RW=P2^1; //使能 sbit E=P2^0; //使能 sbit DQ=P1^0; //温度使能 sbit SPK=P1^1; //喇叭 sbit RL=P1^2; //红灯 sbit GL=P1^3; //绿灯 uchar code TempText[2][8]={ uchar code CodeText[]={ uchar code szInital[]={ uchar code CletLoad[]={ uchar ClientCode[7]={ uchar CodeStr[7]; uchar NewCode1[7]; uchar NewCode2[7]; uchar FloatTempt[8]; //存放温度的数组; uchar Int_Tempt,Flot_Tempt; //温度高位,和小数位 uchar Int_LtTemp; uchar ERTimes[3]={'2','1','0'}; uchar code Message[2][12]={ uchar code ASucess[2][16]={ uchar code ErrorInfo[2][16]={ uchar code CNCodeStr[3][16]={ ///************//Sign区 uchar EroTimes=0; //错误的次数 uchar frq; //声音的频率 uchar Voice=1; //声音 Stop/Start的标志 uchar AmditKey=0; //管理员进去之后,管理员标志 uchar WarnSign=0; //温度太高标志 uchar NCSign=0; //修改密码标志, 2次修改密码 uchar Size=0; //CodeStr的大小,有此标志可以使用 Back 按键功能 uchar NCSize=0,ACSize=0; //NewCode2[7], NewCode2[7]的大小, uchar BackFlag=0; //Back按键可以使用标志 uchar Ensure=0; //确定键按下的标志 uchar OverFull=0; //Back键 此标志来确定是那一种 back 6个的情况和未满 6的情况; // *****************/////// uchar code SONG_TONE[]={255,0}; uchar code SONG_LONG[]={1,0}; uchar EvetInf; void ShowAllStr(); void PlayButVocie(); void ChangeCode(); /**********延迟程序 ******************/ void Delay_UMs(uint UTime) //延时 { while(UTime--); } void DelaySecond(uchar STemp) //延时 { uchar j; while((STemp--)!=0) { for(j=0;j<> } } /***********LCD显示器部分子程序 ******************/ void SetComLCD1602(uchar CommandLCD) //对 LCD 的设置,使能改变读入数据 { RS=0; RW=0; E=0; P0=CommandLCD; E=1; DelaySecond(100); E=0; } void LCD1602Input(uchar InputDat) //写数据 { RS=1; RW=0; E=0; P0=InputDat; E=1; DelaySecond(3); E=0; } void Inital_LCD1602() //初始化 LCD { DelaySecond(10); SetComLCD1602(0x38); //16*2显示, 5*7点阵, 8位数据 DelaySecond(10); SetComLCD1602(0x0c); //显示开,关光标 DelaySecond(10); SetComLCD1602(0x06); //设置字符进入模式 06H :光标和字符保持不动或左或右移动 1格 DelaySecond(10); SetComLCD1602(0x01); DelaySecond(10); } /***********密码部分子程序 ******************/ void BackOneStep() { if(AmditKey==0) { if(OverFull==1) CodeStr[Size]='\0'; else if(OverFull==0) CodeStr[Size-1]='\0'; BackFlag=1; if(Size>0) --Size; else Size=0; } if(AmditKey==1 && (1 == NCSign || 2 == NCSign)) { if(OverFull==1) NewCode1[NCSize]='\0'; else if(OverFull==0) NewCode1[NCSize-1]='\0'; BackFlag=1; if(NCSize>0) --NCSize; else NCSize=0; } else if(AmditKey==1 && (4 == NCSign || 5 == NCSign)) { if(OverFull==1) NewCode2[ACSize]='\0'; else if(OverFull==0) NewCode2[ACSize-1]='\0'; BackFlag=1; if(ACSize>0) --ACSize; else ACSize=0; } } void JudgeStrSize(uchar keys) { if(NCSign==1) { NewCode1[NCSize]=keys+'0'; //******注意等下把 table 去掉 改成 减少内存分配 CodeStr[Size]=keys+'0'; ******//// LCD1602Input(NewCode1[NCSize]); if(NCSize>=5) { NCSize=5; OverFull=1; NewCode1[NCSize+1]='\0'; NCSign = 2; SetComLCD1602(0xcb); // 第二行第最后那个位置 } else { NCSize++; OverFull=0; NewCode1[NCSize]='\0'; } } else if(NCSign==4) { NewCode2[ACSize]=keys+'0'; //* LCD1602Input(NewCode2[ACSize]); if(ACSize>=5) { OverFull=1; NewCode2[ACSize+1]='\0'; SetComLCD1602(0xcb); // 第二行第最后那个位置 NCSign=5; // 第二个字符新密码成功 } else { ACSize++; OverFull=0; NewCode2[ACSize]='\0'; } } else if(NCSign == 0) { CodeStr[Size]=keys+'0'; //******注意等下把 table 去掉 改成减少内存 分配 CodeStr[Size]=keys+'0'******//// LCD1602Input(CodeStr[Size]); if(Size>=5) { Size=5; OverFull=1; CodeStr[Size+1]='\0'; SetComLCD1602(0xcf); // 第二行第最后那个位置 } else { Size++; OverFull=0; CodeStr[Size]='\0'; } } } void IsAcessSys() { uchar i=0; if(NCSign==2) { NCSign=3; ChangeCode(); } if(NCSign==5) { { while(NewCode1[i]!='\0') { ClientCode[i]=NewCode1[i]; i++; } ClientCode[i]='\0'; //successfully OUT!! i=0; SetComLCD1602(0x01); SetComLCD1602(0x82); while(Message[0][i]!='\0') { LCD1602Input(Message[0][i]); i++; } for(i=0;i<> DelaySecond(200); } else { i=0; SetComLCD1602(0x01); SetComLCD1602(0x84); while(Message[1][i]!='\0') { LCD1602Input(Message[1][i]); i++; } for(i=0;i<> DelaySecond(200); } AmditKey=0; NCSign=0; CodeStr[0]='\0'; Size=0; NCSize=0; ACSize=0; ShowAllStr(); } else if(AmditKey==0) { i=0; SetComLCD1602(0x01); SetComLCD1602(0x0c); while(CletLoad[i]!='\0') { LCD1602Input(CletLoad[i]); i++; } DelaySecond(250); i=0; if(strcmp(CodeStr,ClientCode)==0) { AmditKey=1; SetComLCD1602(0x01); SetComLCD1602(0x83); while(ASucess[0][i]!='\0') { LCD1602Input(ASucess[0][i]); i++; } SetComLCD1602(0xc0); i=0; while(ASucess[1][i]!='\0') { LCD1602Input(ASucess[1][i]); i++; } for(i=0;i<10;i++) 绿="" 1second="">10;i++)> GL=1; DelaySecond(100); } GL=0; SPK=0; EroTimes=0; RL=0; } else { i=0; SetComLCD1602(0x01); SetComLCD1602(0x84); while(ErrorInfo[0][i]!='\0') LCD1602Input(ErrorInfo[0][i]); i++; } i=0; SetComLCD1602(0xc2); LCD1602Input(ERTimes[EroTimes]); SetComLCD1602(0xc4); while(ErrorInfo[1][i]!='\0') { LCD1602Input(ErrorInfo[1][i]); i++; } for(i=0;i<> DelaySecond(250); CodeStr[0]='\0'; EroTimes++; Size=0; Ensure=1; //必须置 1 或者置 0,不然错误了后 不能使用 back 按钮了 ShowAllStr(); } } } /////////////////////////////////温度模块 ////////////////////////////////////////////// void Init_DS18B20(void) { DQ = 1; //DQ复位 Delay_UMs(8); //稍做延时 DQ = 0; //单片机将 DQ 拉低 Delay_UMs(80); //精确延时 大于 480us DQ = 1; //拉高总线 Delay_UMs(20); //注意延迟,不然会出错 Delay_Fut(10);出错! ~! } /***********ds18b20读一个字节 **************/ uchar ReadOneChar() { uchar i=0; uchar sChar = 0; for (i=8;i>0;i--) { DQ = 0; // 给脉冲信号 sChar>>=1; //数据右移一位 DQ = 1; // 给脉冲信号 if(DQ) sChar|=0x80; //按位或,取最高位 Delay_UMs(4); } return(sChar); } /*************ds18b20写一个字节 ****************/ void WriteOneChar(uchar WDat) { uchar i=0; for (i=8; i>0; i--) { DQ = 0; DQ = WDat&0x01; //取最低位 Delay_UMs(5); DQ = 1; //上升沿将数据送入 WDat>>=1; } } /**************读取 ds18b20当前温度 ************/ void ReadFrmDS18B20(void) { unsigned char a=0,b=0,x=0; Init_DS18B20(); WriteOneChar(0xCC); // 跳过读序号列号的操作 WriteOneChar(0x44); // 启动温度转换 Delay_UMs(50); // this message is wery important Init_DS18B20(); WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0xBE); //读取温度寄存器等(共可读 9个寄存器) 前两个就是温度 Delay_UMs(50); a=ReadOneChar(); //读取温度值低位 b=ReadOneChar(); //读取温度值高位 Int_Tempt=(a>>4)|(b<4)&0x3f;>4)&0x3f;> if(b & 0x80) FloatTempt[0]='-'; //负数 因为是防火 不需要算出负数 else FloatTempt[0]=' '; if(Int_Tempt>100) { FloatTempt[1]='9';//整数十位 FloatTempt[2]='9'; //整数个位 } else { FloatTempt[1]=Int_Tempt/10+'0';//整数十位 FloatTempt[2]=Int_Tempt%10+'0'; //整数个位 } FloatTempt[3]='.'; if(Flot_Tempt & 0x80) x=x+5000; if(Flot_Tempt & 0x40) x=x+2500; if(Flot_Tempt & 0x20) x=x+1250; if(Flot_Tempt & 0x10) x=x+625; FloatTempt[4]=x/1000+'0'; //十分位 FloatTempt[5]=0xdf; //温度符号 FloatTempt[6]='C'; FloatTempt[7]='\0'; } void ShowTempture() //显示程序 { int i=0; ReadFrmDS18B20(); //开启温度采集程序 SetComLCD1602(0x89); //温度数据转换成液晶字符 while(FloatTempt[i]!='\0') { LCD1602Input(FloatTempt[i]); i++; } } void ReturnMenu() AmditKey=0; CodeStr[0]='\0'; Size=0; NCSign=0; ShowAllStr(); } void StopVoice() { if(AmditKey==1) { V oice++; if(Voice%2==1) EA=1; else { EA=0; EroTimes=0; WarnSign=0; } } } void ChangeCode() { uchar i=0; if(AmditKey==1 && NCSign==0) { SetComLCD1602(0x01); while(CNCodeStr[0][i]!='\0') { LCD1602Input(CNCodeStr[0][i]); i++; } SetComLCD1602(0xc0); i=0; while(CNCodeStr[1][i]!='\0') { LCD1602Input(CNCodeStr[1][i]); i++; } NCSign=1; } if(NCSign==3) { i=0; SetComLCD1602(0x01); while(CNCodeStr[0][i]!='\0') { LCD1602Input(CNCodeStr[0][i]); i++; } SetComLCD1602(0xc0); i=0; while(CNCodeStr[2][i]!='\0') { LCD1602Input(CNCodeStr[2][i]); i++; } NCSign=4; } } ///////////////////////////////////温度模块 ////////////////////////////////////////////////// void AllKeyScan() { // SetComLCD1602(0xca); SetComLCD1602(0x0f); //显示开,开光标 P3=0xef; ///////////////////////////////////第一列 EvetInf=P3; if(EvetInf!=0xef) { EvetInf=P3; PlayButV ocie(); DelaySecond(2); if(EvetInf!=0xff) { switch(EvetInf) { case 0xee: JudgeStrSize(7);break; case 0xed: JudgeStrSize(4);break; case 0xeb: JudgeStrSize(1);break; case 0xe7: ChangeCode();break; } EvetInf=EvetInf & 0x0f; while(EvetInf!=0x0f) { EvetInf=P3; } } } P3=0xdf; //////////////////////////////////////第二列 EvetInf=P3; if(EvetInf!=0xdf) { EvetInf=P3; PlayButV ocie(); DelaySecond(2); if(EvetInf!=0xff) { switch(EvetInf) { case 0xde: JudgeStrSize(8);break; case 0xdd: JudgeStrSize(5);break; case 0xdb: JudgeStrSize(2);break; case 0xd7: JudgeStrSize(0);break; } EvetInf=EvetInf & 0x0f; while(EvetInf!=0x0f) { EvetInf=P3; EvetInf=EvetInf & 0x0f; } } } P3=0xbf; //////////////////////////////////////////第三列 EvetInf=P3; if(EvetInf!=0xbf) { EvetInf=P3; PlayButV ocie(); DelaySecond(2); if(EvetInf!=0xff) { switch(EvetInf) { case 0xbe: JudgeStrSize(9);break; case 0xbd: JudgeStrSize(6);break; case 0xbb: JudgeStrSize(3);break; case 0xb7: BackOneStep();break; } EvetInf=EvetInf & 0x0f; while(EvetInf!=0x0f) { EvetInf=P3; EvetInf=EvetInf & 0x0f; } } } P3=0x7f; ////////////////////////////////////////////第四列 EvetInf=P3; if(EvetInf!=0x7f) { EvetInf=P3; PlayButV ocie(); DelaySecond(2);; if(EvetInf!=0xff) { switch(EvetInf) { case 0x7e: ReturnMenu();break; case 0x7d: StopVoice();break; case 0x7b: //确 两键当一键用 case 0x77: Ensure=1;break; //定 } EvetInf=EvetInf & 0x0f; while(EvetInf!=0x0f) { EvetInf=P3; EvetInf=EvetInf & 0x0f; } } } SetComLCD1602(0x0c); //显示开,关光标 } void PlayButVocie() { uint i=0,j,k; while(SONG_LONG[i]!=0||SONG_TONE[i]!=0) { //播放各个音符, SONG_LONG为拍子长 度 for(j=0;j<> { SPK=~SPK; } DelaySecond(10); i++; } } void ScreenMyInfo() { uchar i,j = 0; i = 0; SetComLCD1602(0x81); while(szInital[i]!='\0') // 显示字符串 { LCD1602Input(szInital[i]); i++; } for(j; j < 5;=""> { SetComLCD1602(0x8d); DelaySecond(200); LCD1602Input('.'); DelaySecond(200); LCD1602Input('.'); DelaySecond(200); LCD1602Input('.'); SetComLCD1602(0x8d); LCD1602Input(' '); LCD1602Input(' '); LCD1602Input(' '); } SetComLCD1602(0x01); } void ShowCodeStr() { uchar i=0; if(AmditKey==0) { SetComLCD1602(0xca); //设置第二行第 10个位置开始显示 while(CodeStr[i]!='\0') { i++; } } else if(AmditKey==1 && NCSign==1) { SetComLCD1602(0xc6); i=0; while(NewCode1[i]!='\0') { LCD1602Input(NewCode1[i]); i++; } } else if(AmditKey==1 && NCSign==3) { SetComLCD1602(0xc6); i=0; while(NewCode2[i]!='\0') { LCD1602Input(NewCode2[i]); i++; } } } void ShowCodeText() { uchar j=0; SetComLCD1602(0xc0); while(CodeText[j]!= '\0') { // 显示字符 LCD1602Input(CodeText[j]); j++; } } void ShowTemptext(uchar Warn) { uchar j=0; SetComLCD1602(0x80); while(TempText[Warn][j]!= '\0') { // 显示字符 LCD1602Input(TempText[Warn][j]); j++; } } void ShowChAllStr() { uchar i=0; if(AmditKey==1 && NCSign==1) { SetComLCD1602(0x01); while(CNCodeStr[0][i]!='\0') { LCD1602Input(CNCodeStr[0][i]); i++; } SetComLCD1602(0xc0); i=0; while(CNCodeStr[1][i]!='\0') { LCD1602Input(CNCodeStr[1][i]); i++; } } else if(AmditKey==1 && NCSign==4) { i=0; SetComLCD1602(0x01); while(CNCodeStr[0][i]!='\0') { LCD1602Input(CNCodeStr[0][i]); i++; } SetComLCD1602(0xc0); i=0; while(CNCodeStr[2][i]!='\0') { LCD1602Input(CNCodeStr[2][i]); i++; } } ShowCodeStr(); } void ShowAllStr() SetComLCD1602(0x01); // SetComLCD1602(0x0c); //显示开,关光标 ShowTemptext(WarnSign); ShowTempture(); //温度正确显示 ShowCodeText(); //显示 “AdmitCode” 第二行首 // SetComLCD1602(0x0f); //显示开,开光标 ShowCodeStr(); //显示 “ 输入的密码 str” } void timer0() interrupt 1 using 1 { if(3 == EroTimes || 1 == WarnSign) { TH0 = 0xfb; TL0 = frq; SPK = ~SPK; } } void main() { uchar flag=0; TMOD = 0x01; frq = 0x00; TH0 = 0xec; TL0 = 0x78; //ec78 中断为 10ms TR0 = 1; IE = 0x82; P1 = 0xf0; //初始化 p1口,全设为 1, 设为输入 Inital_LCD1602(); ReadFrmDS18B20(); //先给初始化掉 得出正确的时间 ScreenMyInfo(); Int_LtTemp = Int_Tempt; if(Int_Tempt >= 50) WarnSign = 1; ShowAllStr(); while(1) { if(EroTimes >= 3 || 1 == WarnSign) { switch(1 == flag) { case 0:frq += 15;break; //flag标志置 0时 ,frq 递增 case 1:frq -= 15;break; //flag标志置 1时 ,frq 递减 } if (!(frq^0xff)) flag = 1; //当 frq 增加到 FFH 时 ,flag 置 1, 准备 frq 递减 if (!(frq^0x00)) flag = 0; //当 frq 递减到 00H 时 ,flag 置 0, 准备 frq 递增 } AllKeyScan(); ReadFrmDS18B20(); //这里不是及时显示温度了,闪烁效果太厉害了。频率不够,不过可以采用 局部修改数据,类似于开机显示的 Initialling … 动态效果,没有闪屏。 if(1 <= (int_tempt="" -="" int_lttemp)="" ||="" -1="">= (Int_Tempt - Int_LtTemp)) { if(Int_Tempt >= 50) WarnSign = 1; //中断 报警 else WarnSign = 0; ShowAllStr(); Int_LtTemp = Int_Tempt; //利用温度变了一度就重现显示好点 } if(1 == BackFlag) { if(NCSign!=0) ShowChAllStr(); else ShowAllStr(); BackFlag = 0; } if(1 == Ensure) { IsAcessSys(); Ensure = 0; } } }