经常好几天不在家,一直想做一个自动喂鱼的东西,在网上找了很久,就看到一个用15F104W单片机 只用定时器功能定时震动下鱼食的,不太喜欢,今天给大家分享一个我自己设计制作,还算比较满意的小作品。
制作出来的实物图如下:
引脚分配 lcd lcddata: P0
lcd_e: P2^7
lcd_rs: P2^6
lcd_rw: P2^5
设置按键 limit_choise: P //温度上下限选择按键
increase_temperature P //增加温度限值按键
reduce_temperature P //减少温度限值按键
蜂鸣器报警 warning P
温度传感器 temperature_sensor P
制热 heatting P
制冷 refrigerating P
LED显示 normal P //正常温度指示灯
high_temperature P //高温指示灯
low_temperature P //低温指示灯
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
C语言参考源代码 如下:
#include void DelayUs(unsigned char tu) { while(–tu); } void DelayMs(unsigned char tm) { while(tm–) { DelayUs(248); DelayUs(248); } } void dianji() //喂鱼 { unsigned int i; speed=10; i=3000; while(i–) { A_ON DelayMs(speed); AB_ON DelayMs(speed); B_ON DelayMs(speed); BC_ON DelayMs(speed); C_ON DelayMs(speed); CD_ON DelayMs(speed); D_ON DelayMs(speed); DA_ON DelayMs(speed); } ABCD_OFF } void dianji_shoudong() //手动喂鱼 { unsigned int i; speed=10; i=500; while(i–) { A_ON DelayMs(speed); AB_ON DelayMs(speed); B_ON DelayMs(speed); BC_ON DelayMs(speed); C_ON DelayMs(speed); CD_ON DelayMs(speed); D_ON DelayMs(speed); DA_ON DelayMs(speed); } ABCD_OFF } void Timer0Init() { TMOD|=0X01; TH0=0xB8; //11.0592M晶振 定时20ms TL0=0x00; ET0=1; EA=1; TR0=1; } void main()//主函数 { init();//初始化函数 K1=1; XIAODU=1; YANGQI=1; BENG=1; Timer0Init(); while(1) { temp_control();//控制按键函数 unnormal_proccessing(get_temp(Ds18b20ReadTemp()),up_limit_temp,down_limit_temp);//恒温控制函数 if((h0)&(m0)&(s5))BENG=0; if((h3)&(m0)&(s0))BENG=1; if((h4)&(m0)&(s0))BENG=0; if((h7)&(m0)&(s0))BENG=1; if((h8)&(m0)&(s0))BENG=0; if((h11)&(m0)&(s0))BENG=1; if(BENG1) { YANGQI=0; XIAODU=1; } else { YANGQI=1; XIAODU=0; } if((h6)&(m0)&(s0)) { dianji(); } if(K10) { DelayMs(20); if(K10) { dianji_shoudong(); } } } } void init()//初始化函数 { uint i,j; //函数初始化 LcdInit();//LCD初始化函数 Ds18b20Init(); //I/O口初始化 heatting=1;//不制热 refrigerating=1;//不制冷 normal=1;//正常温度指示灯不显示 unnormal=1;//不正常温度指示灯不显示 warning=1;//蜂鸣器不报警 //LCD初始化显示 LcdWriteCom(0x80);//第一行显示 j=strlen(num1); for(i=0; i LcdWriteData(num1[i]); delay_ms(1); } LcdWriteCom(0x80+0x40);//第二行显示 j=strlen(num2); for(i=0; i LcdWriteData(num2[i]); delay_ms(1); } LcdWriteCom(0x04); //关闭写一个指针加1 } uint get_temp(uint temp)//计算温度函数 { float tp; tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量 //如果温度是正的那么,那么正数的原码就是补码它本身 temp=tp0.0625100+0.5; //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点 //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就 //算加上0.5,还是在小数点后面。 return temp; } void display_real_tenp(uint temp)//实时温度显示函数 { uchar datas[] = {0, 0, 0, 0}; //定义数组 datas[0] = temp % 10000 / 1000; datas[1] = temp % 1000 / 100; datas[2] = temp % 100 / 10; datas[3] = temp % 10; LcdWriteCom(0x80+0x0a); //写地址 80表示初始地址 LcdWriteData(‘0’+datas[0]); //十位 LcdWriteCom(0x80+0x0b); //写地址 80表示初始地址 LcdWriteData(‘0’+datas[1]); //个位 LcdWriteCom(0x80+0x0d); //写地址 80表示初始地址 LcdWriteData(‘0’+datas[2]); //显示小数点 LcdWriteCom(0x80+0x0e); //写地址 80表示初始地址 LcdWriteData(‘0’+datas[3]); //显示小数点 } void temp_control()//控制温度上下限函数 { if(limit_choise0)//选择按键 { delay_ms(5); if(limit_choise0) { while(!limit_choise); limit_choise_num++; if(limit_choise_num>=3) { limit_choise_num=0; } } } if(limit_choise_num==0)//正常显示 { LcdWriteCom(0x0c);//关闭光标 display_real_tenp(get_temp(Ds18b20ReadTemp()));//显示函数 } if(limit_choise_num1)//调节上限温度 { LcdWriteCom(0x80+0X40+2); LcdWriteCom(0x0f);//开启光标 if(increase_temperature0)//增加温度 { delay_ms(5); if(increase_temperature0) { while(!increase_temperature); up_limit_temp++; if(up_limit_temp>=100) { up_limit_temp=0; } //写入新数据 LcdWriteCom(0x80+0X40+0x03); LcdWriteData(‘0’+up_limit_temp/10); LcdWriteCom(0x80+0X40+0x04); LcdWriteData(‘0’+up_limit_temp%10); LcdWriteCom(0x80+0X40+2);//光标回写 } } if(reduce_temperature0)//减少温度 { delay_ms(5); if(reduce_temperature==0) { while(!reduce_temperature); up_limit_temp–; if(up_limit_temp<0) { up_limit_temp=99; } //写入新数据 LcdWriteCom(0x80+0X40+0x03); LcdWriteData(‘0’+up_limit_temp/10); LcdWriteCom(0x80+0X40+0x04); LcdWriteData(‘0’+up_limit_temp%10); LcdWriteCom(0x80+0X40+2);//光标回写 } } } if(limit_choise_num2)//调节下限温度 { LcdWriteCom(0x80+0X40+12); LcdWriteCom(0x0f);//开启光标 if(increase_temperature0)//增加温度 { delay_ms(5); if(increase_temperature0) { while(!increase_temperature); down_limit_temp++; if(down_limit_temp>=100) { down_limit_temp=0; } //写入新数据 LcdWriteCom(0x80+0X40+0x0d); LcdWriteData(‘0’+down_limit_temp/10); LcdWriteCom(0x80+0X40+0x0e); LcdWriteData(‘0’+down_limit_temp%10); LcdWriteCom(0x80+0X40+12);//光标回写 } } if(reduce_temperature0)//减少温度 { delay_ms(5); if(reduce_temperature==0) { while(!reduce_temperature); down_limit_temp–; if(down_limit_temp<0) { down_limit_temp=99; } //写入新数据 LcdWriteCom(0x80+0X40+0x0d); LcdWriteData(‘0’+down_limit_temp/10); LcdWriteCom(0x80+0X40+0x0e); LcdWriteData(‘0’+down_limit_temp%10); LcdWriteCom(0x80+0X40+12);//光标回写 } } } } void unnormal_proccessing(uint temp,uint up_temp,uint down_temp)//恒温控制函数 { uchar datas[] = {0, 0, 0, 0}; //定义数组 uint temp1=0; datas[0] = temp % 10000 / 1000; datas[1] = temp % 1000 / 100; datas[2] = temp % 100 / 10; datas[3] = temp % 10; temp1=datas[0]*1000+datas[1]*100+datas[2]*10+datas[3];//实际的温度乘以100 if(temp1 < down_temp*100)//升温函数 { heatting=0;//制热 refrigerating=1;//不制冷 unnormal=0;//不正常温度指示灯显示 normal=1;//正常温度指示灯不显示 //蜂鸣器报警 //warning=0; //delay_ms(10); //warning=1; } else if(temp1 > up_temp*100)//降温函数 { heatting=1;//不制热 refrigerating=0;//制冷 unnormal=0;//不正常温度指示灯显示 normal=1;//正常温度指示灯不显示 //蜂鸣器报警 // warning=0; // delay_ms(10); // warning=1; } else//正常 { heatting=1;//不制热 refrigerating=1;//不制冷 unnormal=1;//不正常温度指示灯不显示 normal=0;//正常温度指示灯显示 //蜂鸣器不报警 // warning=1; } } void Time0() interrupt 1 { static u8 i; TH0=0xB8; //11.0592M晶振 定时20ms TL0=0x00; i++; if(i>=50) //1秒时间到 { i=0; 鉴于篇幅有限,只能写部分代码
上一篇:单片机锂电池容量测试仪设计制作
下一篇:单片机做的半导体制冷小冰箱
设计资源 培训 开发板 精华推荐
- FDMF6705 XS DrMOS超小型、高性能、高频DrMOS模块典型应用电路
- 基于ST1PS01AJR 400 mA纳米静态同步降压转换器的评估板
- ASM1117模块
- 使用 NXP Semiconductors 的 ISP1161 的参考设计
- LTC3630AMPMSE 4V 至 24V 输入至 3.3V 输出、具有外部软启动、小尺寸的 250mA 稳压器的典型应用电路
- 使用 STMicroelectronics 的 RTDA7569BLV 的参考设计
- 使用 Diodes Incorporated 的 ZR78L048 的参考设计
- EVAL-AD7328CB,用于 AD7328、13 位、1MSPS、8CH ADC 的评估板
- WCT-5W1COILTX:单线圈无线充电器参考设计使用飞思卡尔的 MWCT1000 传输控制器 IC 来管理和执行所有控制功能
- LT3853EUJ 演示板,6.5V < VIN< 14V,输出电压:1.2V/15A、1.8V/15A、2.5V/15A