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

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

目录

一、主要功能

二、硬件资源

三、程序编程

四、实现现象


一、主要功能

基于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;  ///初始频率为1Hz
 TH1=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;}//频率up
							fre[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温度检测,把温度的值直接给Temperature
	Delay100ms();
	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站演示视频:

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

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

百度网盘资料下载icon-default.png?t=O83Ahttps://pan.baidu.com/s/1EBYR-K9DWYQ4wROr5oqfNg?pwd=gqo9


http://www.kler.cn/news/337285.html

相关文章:

  • 线性代数入门
  • Vgg16使用和修改
  • 【EXCEL数据处理】保姆级教程 000016案例 EXCEL的vlookup函数。
  • 畅享免费服务:PDF 转图片在线转换软件的魅力
  • C++(异常)
  • Redis:高性能的内存数据库
  • 机器学习:开启智能时代的钥匙
  • OpenFeign-查询参数-日期格式化:LocalDate、Date、@DateTimeFormat(低版本无效)
  • 【STM32 Blue Pill编程实例】-OLED显示DHT22传感器数据
  • [CCPC 2023 北京市赛] 图 洛谷10048
  • 墙绘艺术在线交易平台:SpringBoot技术详解
  • x++、++x的一些问题
  • EmEditor传奇脚本编辑器
  • Nginx04-核心配置文件
  • Vue2与Vue3: 关键差异与新特性介绍
  • EtherNet/IP 转 EtherNet/IP, EtherCAT/Ethernet/IP/Profinet/ModbusTCP协议互转工业串口网关
  • 于BERT的中文问答系统12
  • [C++]使用纯opencv部署yolov11-cls图像分类onnx模型
  • Composer入门详解
  • C++中类和对象的基本概念