‘壹’ 做基于51单片机的烟雾报警系统需要买什么东西
1、单片机最小系统
2、传感器组件
3、显示、报警部分
4、写程序
5、综合调试
6、我可以,完成
‘贰’ 求助编一个51单片机自动温度检测报警系统的程序
;********************************************************************
;DS18B20温度计 *
;采用4位LED共阳显示器显示测温值,显示精度0.1℃,测温范围-55~+125*
;用AT89C2051单片机,12MHZ晶振 *
;********************************************************************
;***************常数定义********************
TIMEL EQU 0E0H ;20ms,定时器0时间常数
TIMEH EQU 0B1H
TEMPHEAD EQU 36H
;********************工作内存定义**********************
BITST DATA 20H
TIME1S0K BIT BITST.1
TEMPONEOK BIT BITST.2
TEMPL DATA 26H
TEMPH DATA 27H
TEMPHC DATA 28H
TEMPLC DATA 29H
SCANLED DATA 2AH
;*****************引脚定义*****************************
TEMPDIN BIT P3.7
;*****************中断向量区***************************
ORG 0000H
LJMP START
ORG 000BH
LJMP T01T
;***************系统初始化****************************
ORG 0030H
START: MOV SP,#60H
CLSMEM: MOV R0,#20H
MOV R1,#60H
CLSMEM1: MOV @R0,#00H
INC R0
DJNZ R1,CLSMEM1
MOV TMOD,#00100001B ;定时器0工作方式1(16位)
MOV TH0,#HIGH(65536-5000)
MOV TL0,#LOW(65536-5000) ;5ms
SJMP INIT
ERROR: NOP
LJMP START
NOP
INIT: NOP
SETB ET0
SETB TR0
SETB EA
MOV PSW,#00H
CLR TEMPONEOK
MOV 50H,#10
MOV 51H,#10
MOV 52H,#10
MOV 53H,#10
LJMP MAIN
;*******************************************************************
;定时器0中断服务程序
;*******************************************************************
T01T: CLR TR0
MOV TH0,#HIGH(65536-5000)
MOV TL0,#LOW(65536-5000) ;5ms
SETB TR0
LEDDIS:
MOV DPTR,#TAB
MOV R1,#50H
MOV A,SCANLED
ADD A,R1
MOV R1,A
MOV A,SCANLED
JNZ LEDDIS1
MOV P3,#08H
SJMP LEDDIS4
LEDDIS1:
DEC A
JNZ LEDDIS2
MOV P3,#04H
SJMP LEDDIS4
LEDDIS2:
DEC A
JNZ LEDDIS3
MOV P3,#02H
SJMP LEDDIS4
LEDDIS3:
MOV P3,#01H
LEDDIS4:
MOV A,@R1
MOVC A,@A+DPTR
MOV P1,A
INC SCANLED
MOV A,SCANLED
CJNE A,#4,T0CNT
MOV SCANLED,#0
T0CNT:
INC R7
CJNE R7,#200,T0IT1
MOV R7,#00H
SETB TIME1S0K ;1s定时到标志
T0IT1: RETI
;********************************************************************
; 主程序
;********************************************************************
MAIN:
JNB TIME1S0K,MAIN
CLR TIME1S0K ;测温每1s一次
LCALL READTEMP ;读出温度值子程序
LCALL CONVTEMP ;温度BCD码计算处理子程序
LCALL DISPBCD ;显示区BCD码温度值刷新子程序
LJMP MAIN
;********************************************************************
; 子程序区
;********************************************************************
;***************复位DS18B20*****************************************
INITDS1820: SETB TEMPDIN
NOP
CLR TEMPDIN
MOV R6,#251 ;延时>480μs
DJNZ R6,$
SETB TEMPDIN
MOV R6,#37 ;
LOOP1820: MOV C,TEMPDIN
JC INITDS1820OUT
DJNZ R6,LOOP1820
SJMP INITDS1820
RET
INITDS1820OUT:
MOV R6,#06BH ;延时200μs
DJNZ R6,$
SETB TEMPDIN
RET
;*******读DS18B20的程序,从DS18B20中读出1字节的数据*****
READDS1820: MOV R7,#08H
READDS1820LOOP: CLR TEMPDIN
NOP
NOP
SETB TEMPDIN
MOV R6,#07 ;延时15μs
DJNZ R6,$
MOV C,TEMPDIN
RRC A
MOV R6,#25
DJNZ R6,$
DJNZ R7,READDS1820LOOP
RET
;******写DS18B20的程序,从DS18B20中写1字节数据*****
WRITEDS1820: MOV R7,#08H
WRITEDS1820LOP: CLR TEMPDIN
MOV R6,#07H ;延时15μs
DJNZ R6,$
RRC A
MOV TEMPDIN,C
MOV R6,#30 ;延时104μs
DJNZ R6,$
SETB TEMPDIN
NOP
DJNZ R7,WRITEDS1820LOP
SETB TEMPDIN
RET
;******************读TEMP******************88
READTEMP: LCALL INITDS1820
MOV A,#0CCH
LCALL WRITEDS1820 ;Skip ROM
MOV A, #44H
LCALL WRITEDS1820 ;开始转换
MOV R6,#250 ;延时
DJNZ R6,$
READTEMP1: LCALL INITDS1820
MOV A,#0CCH
LCALL WRITEDS1820 ;Skip ROM
MOV A,#0BEH
LCALL WRITEDS1820 ;中间结果寄存器
MOV R6,#34H ;延时104μs
DJNZ R6,$
READTEMP2: LCALL READDS1820
MOV TEMPL,A
LCALL READDS1820
MOV TEMPH,A
READTEMPOUT: RET
;**************处理温度BCD码子程序***********
CONVTEMP: MOV A,TEMPH
ANL A,#80H
JZ TEMPC1
CLR C
MOV A,TEMPL
CPL A
ADD A,#01H
MOV TEMPL,A
MOV A,TEMPH ;"-"
CPL A
ADDC A,#00H
MOV TEMPH,A ;TEMPHC HI=符号位
MOV TEMPHC,#0BH
SJMP TEMPC11
TEMPC1: MOV TEMPHC,#0AH ;"+"
TEMPC11:
MOV R6,#4H
TEMPC12:
MOV A,TEMPH
RRC A
MOV TEMPH,A
MOV A,TEMPL
RRC A
MOV TEMPL,A
DJNZ R6,TEMPC12
RET
;*****************小数部分码表*********
TEMPDOTTAB: DB 00H,01H,01H,02H,03H,03H,04H,04H,05H,06H
DB 06H,07H,08H,08H,09H,09H
;************显示区BCD码温度值刷新子程序********
DISPBCD: MOV 53H,TEMPHC
MOV A,TEMPL
MOV B,#10
DIV AB
MOV 50H,B
MOV B,#10
DIV AB
MOV 51H,B
JZ DISPBCD2
MOV 52H,A
RET
DISPBCD2: MOV 52H,#10
RET
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0BFH
;共阳段码表 "0","1","2","3","4","5","6","7","8","9","不亮","-"
END
‘叁’ 基于51单片机的温湿度报警系统设计
加语音模块报温度和湿度
加万年历
加蓝牙模块,写个APP与手机无缝对接
加串口模块,写个上位机,可以在电脑上查看和控制你的系统
……………………
实在是太多了
‘肆’ 51单片机做超声波测距报警系统,报警功能不会加
比如有源蜂鸣器beep一端接电源正一端接单片机IO,输出低电平驱动。
S里面就是换算出的距离值了。在main主函数的while(1)里的计算函数下加报警判断动作语句
if(S<100)beep=0;//小于100报警
else beep=1;//否则关闭
‘伍’ 用51单片机实现温度报警器的程序,要正确的
/*使用举例:数码管
scan()
{
char k;
for(k=0;k<4;k++) //4位LED扫描控制
{
discan=0x00;
Disdata=dis_7[_1820display[k]]; //数据显示
if (k==1){DIN=0;} //小数点显示
discan=scan_con[k]; //位选
_18B20_delay(100);
}
}
main()
_18B20_init();//18B20初始化
while(1)
{
EA=0;//在利用18B20测试温度时,要严格遵循时序,禁止一切中断
_18B20_work(_18B20_read()); //处理温度数据
EA=1;//测试完毕,恢复系统中断
scan(); //显示温度值
}
*/
#include "intrins.h" //_nop_();延时函数用
//*****************//
//以下是DS18B20驱动程序
//*****************//
/**************************************************
** 功能描述: DS18B20驱动程序,使用12M晶体
** DQ占用引脚资源P1^7
****************************************************/sbit DQ=P1^7; //温度输入口unsigned char data temp_data[2]={0x00,0x00}; //读出温度暂放
unsigned char data _1820display[5]={0x00,0x00,0x00,0x00,0x00}; //显示单元数据,共4个数据和一个运算暂用
unsigned int temp;
//**************温度小数部分用查表法***********//
unsigned char code ditab[16]=
{
0x00,0x01,0x01,0x02,
0x03,0x03,0x04,0x04,
0x05,0x06,0x06,0x07,
0x08,0x08,0x09,0x09
};/*****************11us延时函数*************************/
//
void _18B20_delay(unsigned int t)
{
for (;t>0;t--);
}/****************DS18B20复位函数************************/
_18B20_reset(void)
{
char presence=1;
while(presence)
{
while(presence)
{
DQ=1;
_nop_();_nop_();//从高拉倒低
DQ=0;
_18B20_delay(50); //550 us
DQ=1;
_18B20_delay(6); //66 us
presence=DQ; //presence=0 复位成功,继续下一步
}
_18B20_delay(45); //延时500 us
presence=~DQ;
}
DQ=1; //拉高电平
}/****************DS18B20写命令函数************************/
//向1-WIRE 总线上写1个字节
void _18B20_write(unsigned char val)
{
unsigned char i;
for(i=8;i>0;i--)
{
DQ=1;
_nop_();_nop_(); //从高拉倒低
DQ=0;
_nop_();_nop_();_nop_();_nop_(); //5 us
DQ=val&0x01; //最低位移出
_18B20_delay(6); //66 us
val=val/2; //右移1位
}
DQ=1;
_18B20_delay(1);
}/****************DS18B20读1字节函数************************/
//从总线上取1个字节
unsigned char _18B20read_byte(void)
{
unsigned char i;
unsigned char value=0;
for(i=8;i>0;i--)
{
DQ=1;
_nop_();_nop_(); //从高拉倒低
value>>=1;
DQ=0;
_nop_();_nop_();_nop_();_nop_(); //4 us
DQ=1;
_nop_();_nop_();_nop_();_nop_(); //4 us
if(DQ)value|=0x80;
_18B20_delay(6); //66 us
}
DQ=1;
return(value);
}
_18B20_read() //读出温度函数
{
_18B20_reset(); //总线复位
_18B20_delay(200);
_18B20_write(0xcc); //发命令
_18B20_write(0x44); //发转换命令
_18B20_reset();
_18B20_delay(1);
_18B20_write(0xcc); //发命令
_18B20_write(0xbe);
temp_data[0]=_18B20read_byte(); //读温度值的低字节
temp_data[1]=_18B20read_byte(); //读温度值的高字节
temp=temp_data[1];
temp<<=8;
temp=temp|temp_data[0]; // 两字节合成一个整型变量。
return temp; //返回温度值
}/****************温度数据处理函数************************///二进制高字节的低半字节和低字节的高半字节组成一字节,这个
//字节的二进制转换为十进制后,就是温度值的百、十、个位值,而剩
//下的低字节的低半字节转化成十进制后,就是温度值的小数部分/********************************************************/
_18B20_work(unsigned int tem)
{
unsigned char n=0;
if(tem>6348) // 温度值正负判断
{
tem=65536-tem;
n=1;
} // 负温度求补码,标志位置1
_1820display[4]=tem&0x0f; // 取小数部分的值
_1820display[0]=ditab[_1820display[4]]; // 存入小数部分显示值
_1820display[4]=tem>>4; // 取中间八位,即整数部分的值
_1820display[3]=_1820display[4]/100; // 取百位数据暂存
_1820display[1]=_1820display[4]%100; // 取后两位数据暂存
_1820display[2]=_1820display[1]/10; // 取十位数据暂存
_1820display[1]=_1820display[1]%10;
/******************数码管符号位显示判断**************************/
if(!_1820display[3])
{
_1820display[3]=0x0a; //最高位为0时不显示
if(!_1820display[2])
_1820display[2]=0x0a; //次高位为0时不显示
}
if(n)
_1820display[3]=0x0b; //负温度时最高位显示"-"
}
/******************1602液晶符号位显示判断**************************/
if(!_1820display[3])
{
_1820display[3]=' '-'0'; //最高位为0时不显示
if(!_1820display[2])
_1820display[2]=' '-'0'; //次高位为0时不显示
}
if(n)
_1820display[3]='-'-'0'; //负温度时最高位显示"-"
} _18B20_init()//18B20初始化
{
_18B20_reset(); //开机先转换一次
_18B20_write(0xcc); //Skip ROM
_18B20_write(0x44); //发转换命令
}
‘陆’ 基于51单片机的光控报警系统实现的功能:通过光敏电阻检测光线强度,当超出或低于某一值引起蜂鸣器报警,并
PCF8581是存储器,怎么转换
可以采用ADC0832作为AD转换芯片,
将光敏电阻接到ADC0832的输入端,
并配以上拉电阻,均匀电压分布,
随着光线强弱的变化,光敏电阻阻值随着变动,
此时单片机对ADC0832实时读取数据,
达到设定的预定值后,报警
‘柒’ 求助!想用51单片机做一个超声波测距报警系统,由于是新手,想请大神们给编个程序!
不知道这个超声波模块具体是如何工作的,一般理解“当距离大到一定大的时候”,是指当在这个“一定大的距离”测到物体了。那么你就处理这个距离为中国的时候,触发一个程序,这个程序就输出一个信号