当前位置: 首页 > news >正文

45 基于单片机的信号选择与温度变化

目录

一、主要功能

二、硬件资源

三、程序编程

四、实现现象


一、主要功能

基于51单片机,采用DS18B20检测温度,通过三种LED灯代表不同状态。

采用DAC0832显示信号脉冲,通过8位数码管显示温度。

信号脉冲可以根据两个按键分别调整为正弦或者方波。

频率与温度成正比。

二、硬件资源

基于KEIL5编写C++代码,PROTEUS8.15进行仿真,全部资源在页尾,提供安装包。

编辑

三、程序编程

#include <reg51.h>  //定义头文件#include "DS18B20.h"#include "stdio.h"#include "Seg.h"#include <data.h>#define dataout P3  #define uchar unsigned char   #define uint unsigned int   unsigned char pos = 0;//用于数码管显示第几位unsigned char Seg\_Buf\[8\] = {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};数码管段码显示unsigned char Seg\_String\[8\];/数码管位码显示unsigned int  ms\_Tick;unsigned int Temperature;//设置温度变量unsigned int  led1\_Tick = 0;//led1计数unsigned int  led2\_Tick = 0;//led2计数unsigned int  led3\_Tick = 0;//led3计数unsigned int  beep_Tick = 0;//beep计数uchar fre\[5\] ="001Hz";
uint data THHL=65536-3906;
uchar data keyword,n=0;   
uchar data Signal_chose = 0; 
uchar data div = 1;
sbit led1=P1^0;   //led1灯定义引脚sbit led2=P1^1;   //led2灯定义引脚sbit led3=P1^2;   //led3灯定义引脚sbit beep = P1^6;	 //定义蜂鸣器的引脚sbit key1 = P1^3;
sbit key2 = P1^4;extern low\_temperature=30;///全局变量设置低温度extern hight\_temperature=50;/全局变量设置高温度static int flag=0;void Timer0Init(void)		//5微秒@12.000MHz{TMOD &= 0xF0;		//设置定时器模式TMOD |= 0x01;		//设置定时器模式TL0 = 0x88;		//设置定时初值TH0 = 0xFF;		//设置定时初值TF0 = 0;		//清除TF0标志TR0 = 1;		//定时器0开始计时ET0 =1;EA = 1;
}void init()	//初始化 {   dataout=0x00;THHL=65536-3906;  ///初始频率为1HzTH1=THHL/256;TL1=THHL%256;   TMOD=0x11;ET1=1;TR1=1;EA=1;   
}   void beep\_Proc(void) /蜂鸣器报警函数{		if(beep\_Tick==100){beep=1;}		if(beep_Tick==220){beep=0;beep_Tick=0;}}void led1\_Proc(void) /led1灯闪烁函数{    if(led1\_Tick==250)	{led1=1;}		if(led1_Tick==500){led1=0;led1_Tick=0;}
}void led2\_Proc(void) /led2灯闪烁函数{    if(led2\_Tick==80)	{led2=1;}		if(led2_Tick==200){led2=0;led2_Tick=0;}
}void led3\_Proc(void) /led3灯闪烁函数{    if(led3\_Tick==160)	{led3=1;}		if(led3_Tick==400){led3=0;led3_Tick=0;}
}void keyscan()   {    if(!key1){flag = 1;		while(!key1);}	if(!key2){flag = 2;		while(!key2);}div = Temperature/2.0;	if(div<=0){div = 1;}THHL=65536-3906/div;	switch(flag){		case 62: {							if(div>=100) THHL=65536-39; else {div++;THHL=65536-3906/div;}//频率upfre\[0\]=div/100 + '0';fre\[1\]=div/10%10 + '0';fre\[2\]=div%10 + '0';TR1=1; break;}   case 61: {							if(div<=1) THHL=65536-3906; else {div--;THHL=65536-3906/div;}//频率down}   			case 1: {Signal_chose=0;TR1=0;TR1=1; break;}  	//正弦波case 2: {Signal_chose=1;TR1=0;TR1=1; break;}		//方波}}   void Key\_Proc(void)   {	sprintf(Seg\_String,"%2d      ",(unsigned int)Temperature);//通过printf把温度的打印到数码管显示的数组里Seg\_Tran(Seg\_String,Seg_Buf);数码管显示函数}void main(void){	Timer0Init();Temperature = (unsigned int)ReadTemperature();/DS18B20温度检测,把温度的值直接给TemperatureDelay100ms();beep =0;  init();	while(1){		keyscan(); switch(Signal_chose)   {   case 0: {dataout=sin_tab\[n\]; break;}  //正弦波case 1: {dataout=squ_tab\[n\]; break;}  //方波default:{break;}   }   		if(Temperature < low_temperature)///将Temperature和设置的温度来进行比较{led1\_Tick++;				led1\_Proc();led2 = 0;///led2灯灭led3 = 0;///led3灯灭beep=0;}	    if(Temperature<hight\_temperature&&Temperature>low\_temperature){led3\_Tick++;				led3\_Proc();led2 = 0;///led2灯灭led1 = 0;///led3灯灭beep=0;}				if(Temperature>hight_temperature){led2\_Tick++;				led2\_Proc();led1 = 0;///led1灯灭led3 = 0;///led3灯灭beep\_Tick++;				beep\_Proc();}		Key_Proc();//ms_Tick++;	if(((ms_Tick % 50) == 0)){EA = 0;Temperature = (unsigned int)ReadTemperature();EA = 1;}}
}void time_intt1(void) interrupt 3   
{   TL1=THHL%256;TH1=THHL/256;   n++;
}   
void Timer0(void) interrupt 1				
{TL0 = 0x20;		//设置定时初值TH0 = 0xf1;		//设置定时初值if(++pos == 8)pos = 0;从第一位数码管来进行显示Seg\_Disp(Seg\_Buf,pos);}

四、实现现象

具体动态效果看B站演示视频:

B站演示视频

基于单片机的信号选择与温度变化

全部资料(源程序、仿真文件、安装包、演示视频):

百度网盘资料下载3A&pos_id=img-5prTl0IU-1733102967688)https://pan.baidu.com/s/1EBYR-K9DWYQ4wROr5oqfNg?pwd=gqo9

http://www.lryc.cn/news/496188.html

相关文章:

  • #JAVA-常用API-爬虫
  • Qt 面试题复习10~12_2024-12-2
  • 在OpenHarmony系统下开发支持Android应用的双框架系统
  • 对力扣77组合优化的剪枝操作的理解
  • SpringMVC中的Handler、HandlerMapping、HandlerAdapter
  • tomcat 8在idea启动控制台乱码
  • windows下kafka初体验简易demo
  • 证明直纹极小曲面是平面或者正螺旋面.
  • matlab2024a安装
  • Observability:如何在 Kubernetes pod 中轻松添加应用程序监控
  • 关于Nginx前后端分离部署spring boot和vue工程以及反向代理的配置说明
  • redis渐进式遍历
  • 【C++】数据类型与操作实践:详细解析与优化
  • C# 集合(Collection)
  • 【智能控制】实验,基于MATLAB的模糊推理系统设计,模糊控制系统设计
  • 前端跳转路由的时候,清掉缓存
  • 基于 LlamaFactory 的 LoRA 微调模型支持 vllm 批量推理的实现
  • 【赵渝强老师】PostgreSQL的物理存储结构
  • 智能探针技术:实现可视、可知、可诊的主动网络运维策略
  • CTF-PWN: 全保护下格式化字符串利用 [第一届“吾杯”网络安全技能大赛 如果能重来] 赛后学习(不会)
  • debian 11 虚拟机环境搭建过坑记录
  • MYSQL 什么是内连接 外连接 左连接 右连接?及适用场景
  • 利用Ubuntu批量下载modis图像(New)
  • 【Springboot】@Autowired和@Resource的区别
  • UIE与ERNIE-Layout:智能视频问答任务初探
  • 数据结构:树
  • docker 怎么启动nginx
  • 【智商检测——DP】
  • YOLOv11改进,YOLOv11添加SAConv可切换空洞卷积,二次创新C3k2结构
  • 使用R语言优雅的获取任意区域的POI,道路,河流等数据