功能实现:
1、设计单片机与16按键的矩阵式键盘接口以及8数码管的接口电路,测试显示和按键功能。
2、设计单片机与DS18B20的接口电路,实现数字温度信息的采集,然后编程处理采集到的数据,得到温度值。
3、将采集的温度信息的显示在数码管上。
4、设计声光报警电路,设置温度的上下限值,实现报警功能
5,将温度上下限显示在数码管上。
6,温度超过温度上限时,步进电机驱动风扇降温。
欢迎超链接过来的读者,功能演示为GIF图片,鼠标请滑慢一点
protues仿真图
功能展示
温度的实时获取
温度的设置与查看
报警效果
代码较长分开说明:
一、 定义与函数声明
。
#include <reg52.h>
#include <intrins.h> // 因为此文件中用到了延时函数_nop_()(延时一个机器周期),所以要包含_nop_()的头文件、
#define u16 unsigned int
#define u8 unsigned char
char temperatureH = 100, temperatureL = -10; //最高温,最低温 char范围-128~127
// 键盘定义
u8 line, row, Sort = 0, kvalue = 0, kscan, kscanA = 0, kscanB = 0;
u8 keyRowLine();
void getKeyVaule();
void setH();
void setL();
void showH();
void showL();
void dealKey();
// 测温定义
sbit SPEAK = P3 ^ 1;
sbit DQ = P3 ^ 7;
u8 flag = 0, EX = 0, setting = 0, led_active = 0;
u16 n = 0;
u8 dat[10] = {
0, 0, 0, 12, 5, 6, 7, 8, 9};
u8 dispcode[] =
{
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71,
0x40, 0x76, 0xb8, 0xb7, 0xbe}; //'-' 'H' 'L' 'n' 'u'
// *****************函数声明*******************
void delay5(u8);
u8 initialize();
void write1Byte(u8 come);
u8 read1Byte();
u16 getTemperature();
void Temp_treatment();
void LED_4();
void alarm();
唯一要注意的是延时函数_nop_()为延时一个机器周期的作用
二、代码逻辑概括 主函数
// *****************主函数**********************
void main()
{
u8 i;
delay5(1000);
while (1)
{
getKeyVaule(); //键盘函数
dealKey(); //处理按键
Temp_treatment(); //温度函数
for (i = 0; i < 30; i++)
{
LED_4(); //显示LED
delay5(1000);
if (EX)
{
alarm(); //报警
delay5(1000);
}
}
}
}
for (i = 0; i < 30; i++) 语句是为了在一次while (1)循环中LED显示次数增多,增强LED显示稳定性。
EX代表温度超过范围,会使蜂鸣器报警。
三、精确延时5us 延时函数
。
// *****************延时函数********************
void delay5(u8 n)
{
do
{
//搭配11.059MHZ 精确延时5us
_nop_();
_nop_();
_nop_();
n--;
} while (n)