#include < reg51.h >
#include < intrins.h >
#include"Ds18b20.h"
#define uchar unsigned char
#define uint unsigned int
bit presence ; //检测18b20是否插好
sbit LCD_RS = P1^0 ;
sbit LCD_RW = P1^1 ;
sbit LCD_EN = P1^2 ;
sbit s1 = P1^3;
sbit s2 = P1^4;
sbit s3 = P1^5;
sbit s4 = P1^6;
sbit s5 = P1^7;
sbit LED = P3^4;
sbit BEEP = P3^4;
sbit KM1 = P2^1;
sbit KM2 = P2^0;
sbit KM3 = P2^3;//开盖
uint i;
uchar code cdis1[ ] = {"T-H: C T-L: C"};
uchar code cdis2[ ] = {" WENDU: . C "} ;
uchar code cdis3[ ] = {"DS18B20 ERR0R "} ;
uchar code cdis4[ ] = {" PLEASE CHECK "} ;
char MH=60,ML=20;
unsigned char data temp_data[2] = {0x00,0x00} ;
unsigned char data display[5] = {0x00,0x00,0x00,0x00,0x00} ;
unsigned char code ditab[16] = {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,
0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09} ;
void beep() ;
unsigned char code mytab[8] = {0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00} ;
#define delayNOP() ; {_nop_() ;_nop_() ;_nop_() ;_nop_() ;} ;
void keyscan();
/*******************************************************************/
void delay1(int ms)
{
unsigned char y ;
while(ms--)
{
for(y = 0 ; y<250 ; y++)
{
_nop_() ;
_nop_() ;
_nop_() ;
_nop_() ;
}
}
}
/******************************************************************/
/*检查LCD忙状态 */
/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。 */
/******************************************************************/
bit lcd_busy()
{
bit result ;
LCD_RS = 0 ;
LCD_RW = 1 ;
LCD_EN = 1 ;
delayNOP() ;
result = (bit)(P0&0x80) ;
LCD_EN = 0 ;
return(result) ;
}
/*写指令数据到LCD */
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */
/*******************************************************************/
void lcd_wcmd(uchar cmd)
{
while(lcd_busy()) ;
LCD_RS = 0 ;
LCD_RW = 0 ;
LCD_EN = 0 ;
_nop_() ;
_nop_() ;
P0 = cmd ;
delayNOP() ;
LCD_EN = 1 ;
delayNOP() ;
LCD_EN = 0 ;
}
/*******************************************************************/
/*写显示数据到LCD */
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */
/*******************************************************************/
void lcd_wdat(uchar dat)
{
while(lcd_busy()) ;
LCD_RS = 1 ;
LCD_RW = 0 ;
LCD_EN = 0 ;
P0 = dat ;
delayNOP() ;
LCD_EN = 1 ;
delayNOP() ;
LCD_EN = 0 ;
}
/* LCD初始化设定 */
/*******************************************************************/
void lcd_init()
{
delay1(15) ;
lcd_wcmd(0x01) ; //清除LCD的显示内容
lcd_wcmd(0x38) ; //16*2显示,5*7点阵,8位数据
delay1(5) ;
lcd_wcmd(0x38) ;
delay1(5) ;
lcd_wcmd(0x38) ;
delay1(5) ;
lcd_wcmd(0x0c) ; //显示开,关光标
delay1(5) ;
lcd_wcmd(0x06) ; //移动光标
delay1(5) ;
lcd_wcmd(0x01) ; //清除LCD的显示内容
delay1(5) ;
}
/* 设定显示位置 */
/*******************************************************************/
void lcd_pos(uchar pos)
{
lcd_wcmd(pos | 0x80) ; //数据指针=80+地址变量
}
/*自定义字符写入CGRAM */
/*******************************************************************/
void writetab()
{
unsigned char i ;
lcd_wcmd(0x40) ; //写CGRAM
for (i = 0 ; i< 8 ; i++)
lcd_wdat(mytab[ i ]) ;
}
/*us级延时函数 */
/*******************************************************************/
void Delay(unsigned int num)
{
while( --num ) ;
}
/* 数据转换与温度显示 */
/*******************************************************************/
void Disp_Temperature()
{
uint i;
i=ds18b20_temp*10;
display[4]=ds18b20_temp;
display[3]=i/1000+0x30 ;
display[2]=i%1000/100+0x30 ;
display[1]=i%100/10+0x30 ;
display[0]=i%10+0x30 ;
lcd_pos(0x48) ;
lcd_wdat(display[3]) ; //百位数显示
lcd_pos(0x49) ;
lcd_wdat(display[2]) ; //十位数显示
lcd_pos(0x4a) ;
lcd_wdat(display[1]) ; //个位数显示
lcd_pos(0x4c) ;
lcd_wdat(display[0]) ; //小数位数显示
}
/*******************************************************************/
/* 蜂鸣器响一声 */
/*******************************************************************/
void beep()
{
unsigned char y ;
for (y=0 ;y<100 ;y++)
{
Delay(60) ;
BEEP=!BEEP ; //BEEP取反
}
BEEP=1 ; //关闭蜂鸣器
Delay(40000) ;
}
/* DS18B20 OK 显示菜单 */
/*******************************************************************/
void Ok_Menu ()
{
uchar m ;
lcd_init() ; //初始化LCD
lcd_pos(0) ; //设置显示位置为第一行的第1个字符
m = 0 ;
while(cdis1[m] != '\0')
{ //显示字符
lcd_wdat(cdis1[m]) ;
m++ ;
}
lcd_pos(0x40) ; //设置显示位置为第二行第1个字符
m = 0 ;
while(cdis2[m] != '\0')
{
lcd_wdat(cdis2[m]) ; //显示字符
m++ ;
}
writetab() ; //自定义字符写入CGRAM
delay1(5) ;
lcd_pos(0x4d) ;
lcd_wdat(0x00) ; //显示自定义字符
}
/* DS18B20 ERROR 显示菜单 */
/*******************************************************************/
void Error_Menu ()
{
uchar m ;
lcd_init() ; //初始化LCD
lcd_pos(0) ; //设置显示位置为第一行的第1个字符
m = 0 ;
while(cdis3[m] != '\0')
{ //显示字符
lcd_wdat(cdis3[m]) ;
m++ ;
}
lcd_pos(0x40) ; //设置显示位置为第二行第1个字符
m = 0 ;
while(cdis4[m] != '\0')
{
lcd_wdat(cdis4[m]) ; //显示字符
m++ ;
}
}
void pross()
{
if(display[4]>MH||display[4]<ML)
{LED=0;
BEEP=0;
} else
{
LED=1;
BEEP=1;
}
if(display[4]>MH)
{
KM1=0;
} else
{
KM1=1;
}
if(display[4]<ML)
{
KM2=0;
} else
{
KM2=1;
}
}
void T1zd() interrupt 3
{
TH1 = 0xD8;
TL1 = 0xF0;
i++;
if(i==1)
{
i=0;
}
}
void juged()
{
lcd_pos(0x04);
lcd_wdat(MH/10+48);
lcd_pos(0x05);
lcd_wdat(MH%10+48);
lcd_pos(0x0d);
lcd_wdat(ML/10+48);
lcd_pos(0x0e);
lcd_wdat(ML%10+48);
keyscan();
pross();
}
/* 主函数 */
/************************************/
void main()
{
KM1=0;
KM2=0;
while(1)
{ Ok_Menu () ;
do
{
Ds18b20ReadTemp(); //读取温度
Disp_Temperature() ; //显示温度
juged();delay1(50);
if(!s5)//开盖
{
KM3=!KM3;
while(!s5);
}
}
while(!presence) ;
Error_Menu () ;
do
{
beep() ;
}
while(presence) ;
}
}
/**********************键值扫描函数*************************/
void keyscan()
{ uchar j;
if(s1==0)
{
for(j=0;j<60;j++);
if(s1==0)
{
while(!s1);
MH++;
if(MH>99)
MH=99;
}
}
if( s2==0)
{
for(j=0;j<60;j++);
if( s2==0)
{
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
1519-基于51单片机的水杯温度控制系统 温控水杯(LCD1602,DS18B20,上下限)proteus 资料介绍: 温控水杯: .可实现通过DS18B20测量水杯三个位置的温度.可实现按键控制开盖、加热、制冷功能,当杯内水温低于设定值,启动加热功能,进行加热,直到杯内水温等于设定值;当杯内水温大于设定值,启用降温功能,进行冷却,直到杯内水温等于设定值 .可实现自动提醒的功能 .可实现通过LCD1602显示三个位置温度值及状态提醒 有哪些资料: 1、仿真工程文件 2、源代码工程文件 3、原理图工程文件 4、功能介绍 5、元件清单
资源推荐
资源详情
资源评论
收起资源包目录
1519-基于51单片机的水杯温度控制系统 温控水杯(LCD1602,DS18B20,上下限)proteus.zip (39个子文件)
1519-基于51单片机的水杯温度控制系统 温控水杯(LCD1602,DS18B20,上下限)proteus
微信截图_20240907164316.png 194KB
程序
STARTUP.LST 14KB
main_uvproj.bak 13KB
main.OBJ 17KB
Ds18b20.c 4KB
STARTUP.A51 6KB
main.plg 1KB
main.M51 30KB
Ds18b20.LST 8KB
main.LST 16KB
main.uvproj 13KB
Ds18b20.OBJ 6KB
main.lnp 57B
main.uvopt 56KB
STARTUP.OBJ 749B
Ds18b20.h 486B
main.hex 7KB
main 21KB
main.c 8KB
main_uvopt.bak 54KB
元件清单.xlsx 6KB
流程图.bmp 844KB
功能.png 118KB
原理图
__Previews
Sheet1.SchDocPreview 121KB
History
Sheet1.~(5).SchDoc.Zip 30KB
Sheet1.~(4).SchDoc.Zip 18KB
Sheet1.~(1).SchDoc.Zip 1KB
Sheet1.SchDoc 231KB
Free Documents.OutJob 5KB
Sheet1.pdf 234KB
QQ截图20220623045542.png 106KB
QQ截图20220623045532.png 106KB
仿真7.8
仿真.PWI 1KB
ISIS.dmp 37KB
仿真.pdsprj.DESKTOP-1TUPJEQ.Eric.workspace 3KB
仿真.DSN 149KB
Last Loaded 仿真.DBK 147KB
QQ截图20220623045553.png 106KB
微信截图_20240907164334.png 39KB
共 39 条
- 1
资源评论
叫我Eric
- 粉丝: 2120
- 资源: 1483
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 技术资料分享mp1482非常好的技术资料.zip
- 技术资料分享MAX811T非常好的技术资料.zip
- 技术资料分享KXTE9-2050 Specifications Rev 3非常好的技术资料.zip
- 技术资料分享K9F2G08非常好的技术资料.zip
- 技术资料分享K4T1G164QE非常好的技术资料.zip
- 技术资料分享HLY070ML226-12A非常好的技术资料.zip
- 技术资料分享FT5x06-1005-DataSheet非常好的技术资料.zip
- 技术资料分享FORESEE 4GB eMMC Spec A4-120210非常好的技术资料.zip
- 技术资料分享FE2.1-Data-Sheet-(Rev.-1.01)非常好的技术资料.zip
- 技术资料分享CC2530中文数据手册完全版非常好的技术资料.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功