测温打铃附代码和电路图

  • 前言
  • 一、测温打铃是什么?
  • 二、具体实现
    • 1.电路图
    • 2.代码
  • 程序效果图

前言

一、测温打铃是什么?

测温打铃是在单片机的基础上实现的一种温度报警装置。它可以通过自己设定报警温度,当温度传感器的温度达到报警温度发出报警声。(本项目添加生日快乐的报警音乐)有想法的可以自己动手实践,做一个真正的单片机实体项目。

二、具体实现

1.电路图

电路图首先要了解需要哪些元件,我在本项目中添加了微调电容、外部晶振、温度传感器、LCD显示屏、排阻、三极管、蜂鸣器、AT89C52。下面是具体电路图。

2.代码

代码注释很清晰,具体代码如下:

#include <reg52.h> //头文件
#include <intrins.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned intsbit DQ=P3^0; //数据传输线接单片机的相应的引脚
sbit beepIO=P3^1; //接PNP型三极管sbit RS = P3^2;//液晶接口,rs0命令,1数据;外部中断0
sbit RW = P3^3;//外部中断1
sbit E = P3^4;//液晶使能端E,控制信号输入端,下降沿使能sbit k3 = P3^5;//k3开关,播放音量
sbit k2 = P3^6;//k2开关,温度上限减
sbit k1 = P3^7;//k1开关,温度上限加float Temp;//温度
uint Temp_H = 60;//温度上限
unsigned char tempL=0; //设全局变量//用于温度进制转化
unsigned char tempH=0;
uchar bz1;//k3按下uchar m,n;
uchar code T[49][2]={{0,0},//各个音调的初始值
{0xF8,0x8B},{0xF8,0xF2},{0xF9,0x5B},{0xF9,0xB7},{0xFA,0x14},{0xFA,0x66},{0xFA,0xB9},{0xFB,0x03},{0xFB,0x4A},{0xFB,0x8F},{0xFB,0xCF},{0xFC,0x0B},
{0xFC,0x43},{0xFC,0x78},{0xFC,0xAB},{0xFC,0xDB},{0xFD,0x08},{0xFD,0x33},{0xFD,0x5B},{0xFD,0x81},{0xFD,0xA5},{0xFD,0xC7},{0xFD,0xE7},{0xFE,0x05},
{0xFE,0x21},{0xFE,0x3C},{0xFE,0x55},{0xFE,0x6D},{0xFE,0x84},{0xFE,0x99},{0xFE,0xAD},{0xFE,0xC0},{0xFE,0x02},{0xFE,0xE3},{0xFE,0xF3},{0xFF,0x02},
{0xFF,0x10},{0xFF,0x1D},{0xFF,0x2A},{0xFF,0x36},{0xFF,0x42},{0xFF,0x4C},{0xFF,0x56},{0xFF,0x60},{0xFF,0x69},{0xFF,0x71},{0xFF,0x79},{0xFF,0x81}
};
uchar code music[][2]={{0,4},
{17,6},{17,2},{19,8},{17,8},{22,8},{21,16},
{17,6},{17,2},{19,8},{17,8},{24,8},{22,16},{17,6},{17,2},{29,8},{26,8},{22,8},{21,8},{19,8},{27,6},{27,2},{26,8},{22,8},{24,8},{22,16},
{0xFF,0xFF}};/***********************************************************延时函数**********************************************************/void delayms(uint x)
{uchar i;while(x--)for(i = 0; i < 120; i++);
}
void delay(unsigned char i)
{for(i;i>0;i--);
}
/***********************************************************************液晶显示*******************************************///写指令
void Write_Order(uchar x)
{delayms(1);RS = 0;//低电平选择指令寄存器RW = 0;//低电平写数据P0 = x;//P0端口设为xE = 1;//使能端高电平(下降沿,赋给传感器)_nop_();//指令延时1us,延时一个机器周期E = 0;//使能端低电平/*让EN引脚从低电平到高电平变化,然后EN引脚再从高电平到低电平出现下降沿,检测到下降沿后,就会读取D0~D7的数据*/RW = 1;//高电平进行读操作
}//写数据
void Write_Data(uchar x)
{delayms(1);RS = 1;//高电平选择数据寄存器RW = 0;//低电平写数据P0 = x;//P0端口设为xE = 1;//使能端高电平_nop_();//指令延时1us,延时一个机器周期E = 0;//使能端低电平RW = 1;//高电平进行读操作
}//初始化LCD(液晶显示器)
void Init_1602(void)
{Write_Order(0x38);//显示设置:8位数据接口,2行,16×2显示,5×7点阵Write_Order(0x08);//显示关闭Write_Order(0x01);//清屏(包含数据指针清零,所有显示清零)Write_Order(0x06);//输入方式:光标右移,屏幕不动Write_Order(0x0c);//整体显示,有光标,不闪烁
}//显示一个字节
void Write_Byte(uchar x,uchar y,uchar dod)
{if(x)y |= 0x40;//逻辑"或"1000000(0x40),X=X|0x40, 即将X的第6位赋值为1。y |= 0x80;//10000000(0x80),即将X的第7位,也就是最高位赋值为1。Write_Order(y);//写y指令Write_Data(dod);//写数据
}//显示一个字符串
void Write_String(uchar x,uchar y,uchar *p)
{uchar i = 0;if(x == 0)y|=0x80;//将X的第7位,也就是最高位赋值为1。if(x == 1)y|=0xc0;if(x == 2)y|=0x94;if(x == 3)y|=0xd4;Write_Order(y);//写字符串指令ywhile(p[i] != 0){Write_Data(p[i++]);//写字符串数据p[i++]}
}
//LCD显示字符
void Display(void)
{uchar Buff[20];sprintf(Buff,"Temp:%3.1f H%d  ",Temp,Temp_H);//显示测试温度和报警上限温度Write_String(0,0,Buff);//LCD显示字符串}/*************************************************************温度检测******************************************************///*******************************************************初始化程序 **********************************************************//void Init_DS18B20(void)
{unsigned char x=0;DQ=1; //DQ先置高 delay(8); //稍延时DQ=0; //发送复位脉冲 delay(80); //延时(>480us) DQ=1; //拉高数据线 delay(5); //等待(15~60us) x=DQ; //用X的值来判断初始化有没有成功,18B20存在的话X=0,否则X=1 delay(20);
} //**********读一个字节************//ReadOneChar(void)  //主机数据线先从高拉至低电平1us以上,再使数据线升为高电平,从而产生读信号
{unsigned char i=0; //每个读周期最短的持续时间为60us,各个读周期之间必须有1us以上的高电平恢复期unsigned char dat=0; for (i=8;i>0;i--) //一个字节有8位 {DQ=1; //DQ先置高 delay(1); DQ=0;//发送复位脉冲dat>>=1; DQ=1; //拉高数据线 if(DQ) dat|=0x80; delay(4);} return(dat);
} //*********************** **写一个字节**************************//void WriteOneChar(unsigned char dat)
{ unsigned char i=0; //数据线从高电平拉至低电平,产生写起始信号。15us之内将所需写的位送到数据线上,for(i=8;i>0;i--) //在15~60us之间对数据线进行采样,如果是高电平就写1,低写0发生。 {DQ=0; //在开始另一个写周期前必须有1us以上的高电平恢复期。 DQ=dat&0x01; delay(5); DQ=1; //继续至高电平dat>>=1;} delay(4);
} //读温度值(低位放tempL;高位放tempH;)
void ReadTemperature(void)
{int TempINT;Init_DS18B20(); //初始化WriteOneChar(0xcc); //跳过读序列号的操作WriteOneChar(0x44); //启动温度转换delay(125); //转换需要一点时间,延时 Init_DS18B20(); //初始化WriteOneChar(0xcc); //跳过读序列号的操作 WriteOneChar(0xbe); //读温度寄存器(头两个值分别为温度的低位和高位) tempL=ReadOneChar(); //读出温度的低位LSBtempH=ReadOneChar(); //读出温度的高位MSB TempINT = tempH<<8|tempL;Temp = TempINT*0.0625;
}
void CL(void)
{ReadTemperature();//读温度值
}
/*********************************************************按键扫描********************************************************/
void keyscand()
{if(k1==0)//k1开关按下,温度上限加{delayms(100);//延时if(k1==0)//k1依然处于低电平状态{Temp_H++;//温度上限加1bz1=0;EA=0;}}if(Temp_H==100)//如果温度上限等于100{Temp_H=50;    //超过元件最大温度,至为50}if(k2==0)//k2开关按下,温度上限减{delayms(100);if(k2==0)//k2依然处于低电平状态{Temp_H--;//温度上限减1bz1=0;EA=0;}}if(Temp_H==0)//k3开关,播放音量{Temp_H=50; }
}
/**********************************************BAOJING************************************************************/
void  bj()//报警
{if(Temp>Temp_H)//温度大于温度上限{beepIO=0;//蜂鸣器鸣叫delayms(200);//超过上限报警}if(Temp<Temp_H)//温度小于温度上限{beepIO=1;//蜂鸣器关闭}}
//k3按键(播放音调)
void k3scand()
{if(k3==0)//如果k3被按下{delayms(100);//延时if(k3==0){bz1++;}}if(bz1==2){bz1=0;}//k3按下标志取值01}/********************************************************主函数***********************************************************///中断T0
void T0_int() interrupt 1
{beepIO=!beepIO;TH0=T[m][0];TL0=T[m][1];
}
//主函数
void main()
{uchar i=0; TMOD=0x01; //开启定时器0,0x10时使用定时器,0x11时启动两个EA=1;//开放所有中断ET0=1; //允许T0中断Init_1602();//初始化LCD(液晶显示器)while(1) {k3scand();//k3按键if(bz1==0)//k3未按下{EA=0;//关闭所有中断CL();//读温度值Display();//LCD显示温度delayms(50);//延时keyscand();//按键扫描bj();//报警}if(bz1==1)//k3按下{EA=1;//开放所有中断m=music[i][0];n=music[i][1]; if(m==0x00){TR0=0;//关闭定时器计数器0delayms(n*100);i++;} else if(m==0xFF){TR0=0;//关闭定时器计数器0delayms(30*100);i=0;} else if(m==music[i+1][0]) {    TR0=1;//打开定时器计数器0delayms(n*100);TR0=0;delayms(100);i++;}else{TR0=1;//开放定时器计数器0delayms(n*100);i++;}}               }
}

程序效果图

链接: https://pan.baidu.com/s/1CFJgNWwhgXQfjJPz5pfX_w
提取码:64kl

【单片机】单片机课程设计(测温打铃)附完整代码和电路图相关推荐

  1. java 数据库工资管理系统设计_数据库课程设计—企业工资管理系统(java版完整代码)...

    数据库课程设计-企业工资管理系统(java版完整代码) 数 据 库 课 程 设 计 报 告2016年 5月 20日 目 录企业工资管理系统姓 名 王 素 文班 级 软 133学 号 139074224 ...

  2. spring-cloud-gateway网关设计最强实践(附完整代码)

    微信号:hbhk1314 一.gateway的常用功能实现 1.动态路由添加(自动或手动)(已支持数据库配置管理功能) 自动:根据注册获取添加 手动:根据spring-cloud-gateway 提供 ...

  3. 51单片机综合课程设计多功能电子秤(显示时间、温度、存储、串口、报警装置等)

    51单片机综合课程设计----多功能电子秤 关键词:proteus仿真.51单片机.DS1302时钟芯片.DB18B20温度芯片.AT24C02存储芯片.LCD1602液晶屏.ADC0832芯片等,文 ...

  4. stc89c51单片机音乐盒系统设计_基于51单片机音乐盒课程设计1.doc

    基于51单片机音乐盒课程设计1 课程名称: 微机原理课程设计 题 目: 基于单片机的音乐盒设计 摘要 随着人类社会的发展,人们对视觉.听觉方面的享受提出了越来越高的要求.小小的音乐盒可以给人们带来美好 ...

  5. 单片机动态从00到99C语言,基于c语言单片机秒表课程设计1.doc

    基于c语言单片机秒表课程设计1 课程设计报告 课程名称:单片机原理及应用 报告题目:秒表 学生姓名: 所在学院:信息科学与工程学院 专业班级: 学生学号: 指导教师: 2013 年 12 月 25 日 ...

  6. 51系列—基于51单片机的校园教室打铃系统(代码+仿真+电路图超级全)

    基于51单片机的校园教室打铃系统(代码+仿真+电路图超级全) 本文主要介绍基于51单片机实现的校园打铃系统设计,实现了基本的上下课打铃功能.本设计基于51单片机,使用单片机定时计数器及LCD1602接 ...

  7. 五子棋java百度文库_JAVA课程设计 五子棋(内附完整代码).doc

    JAVA课程设计 五子棋(内附完整代码) JAVA课程设计 设计题目:五子棋游戏 简要的介绍五子棋 五子棋的起源 五子棋,又被称为"连五子.五子连.串珠.五目.五目碰.五格.五石.五法.五联 ...

  8. 基于cc++课程设计-产品入库管理系统(附源码+可执行程序)

    文章目录 前言 项目简介 涉及知识点 源码获取方法: 根据入库编号删除记录 按入库产品编号从小到大显示记录 判断入库编号是否唯一 统计所有生产入库产品的总金额 源码获取方法: 前言 基于c&c ...

  9. 基于cc++课程设计-个人收支管理系统(附源码+可执行程序)

    文章目录 前言 项目简介 涉及知识点 源码获取方法: 系统登陆界面 判断月份是否唯一 根据月份删除数组中收支信息 结构体数组中的收支信息输出到文件 源码获取方法: 前言 基于c&c++课程设计 ...

最新文章

  1. linux显卡驱动mxm,linux下我的FX5200显卡驱动安装
  2. 统计学习方法|朴素贝叶斯原理剖析及实现
  3. MYBATIS 根据IN条件查询时,数据只查第一个的问题(字符串被截断......)
  4. yii2 跨域请求配置_如何在SpringBoot应用中实现跨域访问资源和消息通信?
  5. UItabelView头部视图;
  6. springCloud Alibaba 与 nacos
  7. 如何使用linux系统下载BT?
  8. 安装nginx--银河麒麟V10(Kylin Linux Advanced Server release V10 (Tercel))操作系统
  9. QQ等级图标排名说明_QQ等级表,QQ最高等级(皇冠) qq到一星要5天
  10. 打工能实现财富自由吗?--互联网老辛的思考
  11. 用户输入一个整数,求出它的各个位数,并求各位数之和
  12. 用sqlcipher对已有的SQLite数据库加密
  13. 计算雅思成绩C语言,雅思考试总成绩计算查分表
  14. 重装系统 linux启动windows系统文件,重装Windows系统后,Linux系统启动引导失败
  15. 喝不完的杯中酒,割不尽的名人头
  16. python中类与对象之间的关系_python类与类之间的关系
  17. Stay hungry stay young
  18. 67.220.90.12/bbs/index.php,对乌云漏洞库payload的整理以及Burp辅助插件
  19. 【YOLOP 解读】You Only Look Once for Panoptic Driving Perception
  20. 安卓微信二次分享不显示描述和图片

热门文章

  1. android 代码规范检测工具,Android 代码规范之Inspection 定制
  2. category.php ecshop,category.php
  3. ftp文件盘服务器回档,企业网盘和FTP服务器对比
  4. 对象的序列化存储:Serializable 和 Parceable
  5. Babel转码时报错 Unexpected EOF at line 1 column 2 of the JSON5 data. Still to read:“”
  6. layui数据表格显示序号
  7. react实现图片预览组件
  8. 2.1立即数的判断方法一
  9. 从spaceX的火箭回收想到的一些事儿
  10. 咕咕机显示服务器请求异常,咕咕机 云服务器异常