发布时间:2024-04-29 17:01
Hi,大家好,这里是丹成学长,今天向大家介绍一个 单片机项目
基于单片机的智能饮水机系统设计与实现
大家可用于 课程设计 或 毕业设计
单片机-嵌入式毕设选题大全及项目分享:
https://blog.csdn.net/m0_71572576/article/details/125409052
这次设计的智能饮水机就是单片机结合传感器的一个应用。
该系统设计综合单片机以及电子技术理论,从生活实际出发,完善了饮水机的功能。整个设计系统实现三个功能,即加热、对温度上下限的控制和定时加热。与传统的饮水机相比,由于采用了自动检测和控制的电子设计技术,可较好地实现对水温的测量和控制,具有较广泛的应用前景。
系统包括温度传感器,键盘输入模块,输出控制模块,数据传输模块,温度显示模块和出水驱动电路等部分。
智能饮水机具有过热保护防干烧、 加热至沸腾、 设置温度加热、 超温报警提示、 安全锁定、 电动机出水功能等。
整个硬件系统由主控制系统、输入输出模块、传感器、其他功能电路和电源部分组成。主控系统使用单片机控制,包括对键盘的信息的接收和控制,对其他功能电路的控制等,通过软件编程实现预定功能;传感器部分即检测子系统,主要是进行饮水机中水的温度检测和控制,采用智能温度传感器DS18B20;其他功能电路部分包括恒温,防干烧,出水等电路,达到功能多样化;电源部分为智能饮水机提供必要的电能,保证饮水机能够正常的工作。
程序的初始化主要包括三个环节:
人机对话功能键设置如下:
// 关键代码
void main()
{
T=100;
while(1)
{
Lock_key();
if(Lock==0)
keyscan();
if(flag2==0)
temp_display();
if(flag2==1)
SEG_display(T,0);
if(temp>=T*10) {Temp_led=0;Hot=1;Hot_led=1;}
if(temp< T*10) Temp_led=1;
if(temp>=1000){Beep=0;Hot=1;Hot_led=1;}
if(temp<1000) Beep=1;
}
}
温度检测运用 DS18B20 芯片, 因为其功能全面且精度高, 完全可以满足设计要求, 它将检测到的水温送给单片机, 再由单片机输出给显示电路将实时水温显示出来。
// 关键代码
void init_ds18b20()
{
uchar x=0;
DQ = 1; //DQ 复位
delay_us(10); //稍做延时
DQ = 0; //单片机将 DQ 拉低
delay_us(100); //精确延时 大于 480us
DQ = 1; //拉高总线
delay_us(10);
x=DQ; //稍做延时后 如果 x=0则初始化成功 x=1 则初始化失败
delay_us(20);
}
uchar ReadOneChar()
{
uchar i;
uchar dat=0;
for (i=8;i>0;i--)
{
DQ = 0;
dat>>=1;
DQ = 1;
if(DQ)
dat|=0x80;
delay_us(10);
}
return(dat);
}
void WriteOneChar(uchar dat)
{
uchar i;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay_us(10);
DQ = 1;
dat>>=1;
}
}
int ReadTem()
{
int t;
uchar a,b;
init_ds18b20();
WriteOneChar(0xcc); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
delay_us(200);
init_ds18b20();
WriteOneChar(0xcc); //跳过读序号列号的操作
WriteOneChar(0xbe); //读取温度寄存器等
a=ReadOneChar();
b=ReadOneChar();
t=b;
t<<=8;
t=t|a;
return t;
}
void temp_display()
{
uint temp_point;
temp=ReadTem()*0.625; //将温度的高位与低位合并
temp_point=temp%10; //取出小数位
SEG_display(temp/10,temp_point);
}
显示程序是负责点亮 4 支数码管, 并根据单片机送出的数据及时更新显示的数据, 其程序流程图如下
(大家可以换成oled屏显示)
// 关键代码
void SEG_display(uchar dat1,uchar dat2)
{
P23=1;
P0=table[dat1/100];
P20=0;
delay_us(80);
P20=1;
P0=table[dat1/10%10];
P21=0;
delay_us(80);
P21=1;
P0=table[dat1%10]|0x80;
P22=0;
delay_us(80);
P22=1;
P0=table[dat2];
P23=0;
delay_us(80);
}
键盘扫描程序的任务是在程序运行过程中始终不停的检测是否有按键被按下, 如果检测到有按键被按下, 则进入与该按键对应的程序运行; 若该按键没有被按下, 则继续检测下一个按键, 如此循环, 从而完成每一个按键所对应的功能。
// 关键代码
void keyscan()
{
if(key1==0)
{
delay_ms(2);
if(key1==0)
{
flag=~flag;
if(flag==1)
Out=0;
if(flag==0)
Out=1;
}
while(!key1);
}
if(key2==0)
{
delay_ms(2);
if(key2==0)
{
flag1=~flag1;
if(flag1==1)
{Hot=0;Hot_led=0;}
if(flag1==0)
{Hot=1;Hot_led=1;}
}
while(!key2);
}
if(key3==0)
{
delay_ms(2);
if(key3==0)
{
if(flag2==1) T+=5;
if(T>=101)T=0;
}
while(!key3);
}
if(key5==0)
{
delay_ms(2);
if(key5==0)
{
flag2=~flag2;
}
while(!key5);
}
}
void Lock_key() // 锁定键盘
{
if(key4==0)
{
delay_ms(2);
if(key4==0)
{
Lock=~Lock;
if(Lock==1)
Lock_led=0;
if(Lock==0)
Lock_led=1;
}
while(!key4);
}
}
单片机-嵌入式毕设选题大全及项目分享:
https://blog.csdn.net/m0_71572576/article/details/125409052