下来了就可以用,程序我自己改来的,有什么不好可以提出来,大家一起交流交流
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
这是仿真电路图,程序和仿真电路图在两个包里
单片机源程序如下:
- #include <reg52.h> //调用单片机头文件
- #define uchar unsigned char //无符号字符型 宏定义 变量范围0~255
- #define uint unsigned int //无符号整型 宏定义 变量范围0~65535
- //红外热释电传感器 平时为0 有输出为1
- sbit beep = P2^2; //蜂鸣器定义
- sbit red = P2^0; //红色发光二极管定义
- sbit yellow = P2^1; //黄色发光二极管定义
- sbit hw_one = P1^0; //红外热释传感器定义
- sbit hw_two = P1^1;
- bit flag_300ms = 0;
- uchar flag_alarm ; //报警标志位
- uint flag_value; //用做定时器的变量
- /***********************1ms延时函数*****************************/
- void delay_1ms(uint q)
- {
- uint i,j;
- for(i=0;i<q;i++)
- for(j=0;j<120;j++);
- }
- /*************定时器0初始化程序***************/
- void time_init()
- {
- EA = 1; //开总中断
- TMOD = 0X01; //定时器0工作方式1
- ET0 = 1; //开定时器0中断
- TR0 = 1; //允许定时器0定时
- }
- /******************红外报警处理**********************/
- void hongwai_dis()
- {
- if(hw_one == 1 && hw_two == 1)//无人
- {
- flag_alarm = 0;//不报警
- red = ~red;//红灯亮
- yellow = yellow;//黄灯熄灭
- beep = beep;//蜂鸣器不响
- }
- if(hw_one == 0)//表示床上有时,报警提示床无法收缩
- {
- flag_alarm = 1;//报警
- red = red;//红灯熄
- yellow = ~yellow;//黄灯亮
- beep = ~beep;//蜂鸣器响
- }
- if(hw_two == 0)//表示床板与墙面之间有人时候,报警提示床无法伸开
- {
- flag_alarm = 1;//报警
- red = red;//红灯熄
- yellow = ~yellow;//黄灯亮
- beep = ~beep;//蜂鸣器响
- }
- }
- /******************主程序**********************/
- void main()
- {
- time_init(); //定时器初始化程序
- beep = 0; //开机叫一声
- delay_1ms(200);
- P0 = P1 = P2 = P3 = 0xff; //初始化单片机IO口为高电平
- while(1)
- {
- red = ~hw_one; //红外热释电指示灯 有输出就亮黄灯
- if(flag_300ms == 1)
- {
- flag_300ms = 0;
- hongwai_dis(); //红外报警函数
- }
- }
- }
- /*************定时器0中断服务程序***************/
- void time0_int() interrupt 1
- {
- static uint value;
- TH0 = 0x3c;
- TL0 = 0xb0; // 50ms
- value ++;
- if(value % 6 == 0)
- {
- flag_300ms = 1;
- }
- }
复制代码
全部资料51hei下载地址:
电路图.rar
(112.51 KB, 下载次数: 73)
|