标题:
单片机温度报警器课程设计 带仿真 源码 论文
[打印本页]
作者:
Whtaever9
时间:
2016-11-21 22:38
标题:
单片机温度报警器课程设计 带仿真 源码 论文
51单片机 温度报警器原理图:
0.png
(28.8 KB, 下载次数: 61)
下载附件
2016-12-5 03:09 上传
0.png
(67.48 KB, 下载次数: 44)
下载附件
2016-12-5 03:07 上传
所有资料下载:
单片机温度报警器.rar
(881.83 KB, 下载次数: 117)
2016-11-21 22:37 上传
点击文件名下载附件
下载积分: 黑币 -5
源程序:
#include <AT89X51.H>
#define u8 unsigned char
#define u16 unsigned int
#define line01 0x80
#define line02 0xc0
#define DATA_BUS P0
sbit Detect=P3^2;
sbit DQ=P2^7; // ds18b20与单片机连接口
sbit EN=P2^0; // lcd1602控制
sbit RS=P2^1; // lcd1602与单片机控制接口
sbit RW=P2^2; // lcd1602控制
sbit MOTOR1=P2^4; // 电机1控制端
sbit MOTOR2=P2^5; // 电机2控制端
sbit LED0=P1^0; // 电机慢速指示
sbit LED1=P1^1; // 电机快速指示
sbit Set_Clock=P1^5; // 调定时控制
sbit Adjust_TL=P1^6; // 调TL控制
sbit Adjust_TH=P1^7; // 调TH控制
sbit Key_up=P3^6; // +1操作键
sbit Key_dn=P3^7; // -1操作键
sbit BEEP=P3^3;
u8 code str1[]={"TR:"};
u8 code str2[]={"TH:"};
u8 code str3[]={" TL:"};
u8 disdata[5];
u16 Temperature; // 检测到的温度(扩大了10倍)
u16 Temperature_H=300; // 预设的高温控制温度(扩大了10倍)
u16 Temperature_L=200; // 预设的低温控制温度(扩大了10倍)
u8 Clock_Timer=30; // 预设定时为30分钟;
u8 Temperature_flag; // 温度正负标志
/*************************lcd1602程序**************************/
void delay1ms(u16 ms) // 非精确延时1毫秒
{
u8 i,j;
for(;ms>0;ms--)
for(i=2;i>0;i--)
for(j=250;j>0;j--);
}
void wr_com(u8 com) // LCD1602写指令//
{
delay1ms(1);
EN=0;
RS=0;
RW=0;
DATA_BUS=com;
delay1ms(1);
EN=1;
delay1ms(1);
EN=0;
}
void wr_dat(u8 dat) // LCD1602写数据//
{
delay1ms(1);;
RS=1;
RW=0;
EN=0;
DATA_BUS=dat;
delay1ms(1);
EN=1;
delay1ms(1);
EN=0;
}
void lcd_init() // 初始化设置 //
{
delay1ms(15);
wr_com(0x38);delay1ms(5);
wr_com(0x08);delay1ms(5);
wr_com(0x01);delay1ms(5);
wr_com(0x06);delay1ms(5);
wr_com(0x0c);delay1ms(5);
}
void Display_String(u8 *p) // 显示 //
{
while(*p!='\0')
{
wr_dat(*p);
p++;
delay1ms(10);
}
}
void Init_Display_String() //初始化显示
{
lcd_init();
wr_com(0x80);
Display_String("Have a nice day!");
wr_com(0xc0);
Display_String(" 2015-03=6-25 ");
}
/******************************ds1820程序***************************************/
void delay_18B20(u8 i) // 延时i微秒
{
for(;i>0;i--);
}
void ds1820rst() //*ds1820复位*/
{
u8 x=0;
DQ = 1; // DQ复位
delay_18B20(4); // 延时
DQ = 0; // DQ拉低
delay_18B20(100); // 精确延时大于480us
DQ = 1; // 拉高
delay_18B20(40);
}
u8 ds1820rd() //*读数据*/
{
u8 i=0;
u8 dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; //给脉冲信号
dat>>=1;
DQ = 1; //给脉冲信号
if(DQ)
dat|=0x80;
delay_18B20(10);
}
return(dat);
}
void ds1820wr(u8 wdata) //*写数据*/
{
u8 i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = wdata&0x01;
delay_18B20(10);
DQ = 1;
wdata>>=1;
}
}
void Read_Temperature() //*读取温度值并转换*/
{
u8 a,b;
ds1820rst();
ds1820wr(0xcc); //*跳过读序列号*/
ds1820wr(0x44); //*启动温度转换*/
ds1820rst();
ds1820wr(0xcc); //*跳过读序列号*/
ds1820wr(0xbe); //*读取温度*/
a=ds1820rd();
b=ds1820rd();
Temperature=a+b*256;
if(Temperature<=0x0fff)Temperature_flag=0;
else
{
Temperature=~Temperature+1;
Temperature_flag=1;
}
Temperature=Temperature*(0.625);//温度值扩大10倍,以精确到1位小数
}
/*******************************************************************/
void Display_Temperature()//温度值显示
{
disdata[0]=Temperature/1000+0x30; //百位数
disdata[1]=Temperature/100%10+0x30; //十位数
disdata[2]=Temperature/10%10+0x30; //个位数
disdata[3]=Temperature%10+0x30; //小数位
wr_com(0x80);
Display_String(str1);;
if(Temperature_flag==1)wr_dat(0x2d); //显示符号位
if(disdata[0]!=0x30)wr_dat(disdata[0]); //显示百位
wr_dat(disdata[1]); //显示十位
wr_dat(disdata[2]); //显示个位
wr_dat(0x2e); //显示小数点
wr_dat(disdata[3]); //显示小数位
wr_dat('C');
if(Set_Clock==0)
{
Display_String(" CLK:");
wr_dat(Clock_Timer/10+0x30);
wr_dat(Clock_Timer%10+0x30);
}
wr_com(0xc0);
Display_String(str2);
wr_dat(Temperature_H/100+0x30);
wr_dat(Temperature_H/10%10+0x30);
wr_dat('C');
Display_String(str3);
wr_dat(Temperature_L/100+0x30);
wr_dat(Temperature_L/10%10+0x30);
wr_dat('C');
}
//报警程序
void baojing(void)
{
unsigned int j;
for(j=100;j>0;j--)//响30ms
{
BEEP=0; //输出频率800Hz P0=0x7E;
delay1ms(84);//延时310us
BEEP=1;
delay1ms(10);//延时310us
}
}
void MOTOR_control01()
{
if(Temperature>Temperature_H) //大于TH,电机全速
{
MOTOR1=0;
MOTOR2=1;
LED0=1;
LED1=0;
delay1ms(1);
baojing();
}
else if((Temperature>=Temperature_L)&&(Temperature<=Temperature_H)) //小于TH大于TL,电机半速
{
MOTOR1=1;
MOTOR2=1;
LED0=1;
LED1=1;
BEEP=0;
delay1ms(1);
}
else //小于TL,电机关闭
{
MOTOR1=1;
MOTOR2=0;
LED0=0;
LED1=1;
delay1ms(1);
baojing();
}
}
void MOTOR_control02() //关闭电机
{
MOTOR1=1;
MOTOR2=1;
LED0=1;
LED1=1;
}
void Timer0_init(void)
{
TMOD=0x01;
TH0=(65536-10000)/256; //在这里,10000本应该是50000的,为了加快仿真的效果,加速了5倍。
TL0=(65536-10000)%256;
TR0=1;
ET0=1;
EA=1;
}
/********************主程序***********************************/
void main()
{
Init_Display_String(); //初始化显示
Read_Temperature(); //读取温度
MOTOR_control02(); //电机控制
delay1ms(1000); //延时1秒
wr_com(0x01); //LCD清屏
Display_Temperature(); //显示温度
Timer0_init();
while(1)
{
Read_Temperature(); //读取温度
Display_Temperature(); //显示温度
if(Detect==0)MOTOR_control01(); //电机控制
else MOTOR_control02(); //电机停止
if(Adjust_TH==0) //调节TH 。
{
if(Key_up==0)
{
Temperature_H+=10;
if(Temperature_H>350)Temperature_H=350;
while(Key_up==0)Display_Temperature();
}
if(Key_dn==0)
{
Temperature_H-=10;
if(Temperature_H<=250)Temperature_H=250;
while(Key_up==0)Display_Temperature();
}
}
if(Adjust_TL==0) //调节TL 。
{
if(Key_up==0)
{
Temperature_L+=10;
if(Temperature_L>250)Temperature_L=250;
while(Key_up==0)Display_Temperature();
}
if(Key_dn==0)
{
Temperature_L-=10;
if(Temperature_L<=150)Temperature_H=150;
while(Key_up==0)Display_Temperature();
}
}
if(Set_Clock==0) //调节定时。
{
if(Key_up==0)
{
EA=0;
Clock_Timer++;
if(Clock_Timer>90)Clock_Timer=90;
while(Key_up==0)Display_Temperature();
EA=1;
}
if(Key_dn==0)
{
EA=0;
Clock_Timer--;
if(Clock_Timer>90)Clock_Timer=0;
while(Key_up==0)Display_Temperature();
EA=1;
}
if(Clock_Timer==0)MOTOR_control02(); //在定时模式下,定时到则电机停止。
}
}
}
void Timer0()interrupt 1 //定时器0用于在定时模式下,控制电机工作。
{
u8 i,sec; //Clock_Timer
TH0=(65536-10000)/256; //在这里,10000本应该是50000的,为了加快仿真的效果,加速了5倍。
TL0=(65536-10000)%256;
i++;
if(i>=20)
{
i=0;
sec++;
if(sec>=60)
{
sec=0;
Clock_Timer--;
if(Clock_Timer==0)Clock_Timer=0;
}
}
}
void Timer1()interrupt 2
{
TCON=0X04;
IE=0X84;
}
复制代码
作者:
mnbvcxzlkjhgfds
时间:
2016-11-28 04:56
非常好的资料,51黑有你更精彩!!!
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1