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;  ///初始频率为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站演示视频:

B站演示视频

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

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

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

相关推荐
Aczone2818 小时前
硬件(五) 存储、ARM 架构与指令系统
arm开发·嵌入式硬件·架构
LS·Cui18 小时前
单片机按键示例功能
单片机
【ql君】qlexcel18 小时前
MCU上电到运行的全过程
单片机·嵌入式硬件·mcu·启动过程
搞一搞汽车电子18 小时前
S32K3平台eMIOS 应用说明
开发语言·驱动开发·笔记·单片机·嵌入式硬件·汽车
pQAQqa19 小时前
FreeRTOS项目(2)摇杆按键检测
stm32·单片机·嵌入式硬件·freertos
小莞尔20 小时前
【51单片机】【protues仿真】基于51单片机停车场的车位管理系统
c语言·开发语言·单片机·嵌入式硬件·51单片机
一川月白70921 小时前
51单片机---硬件学习(跑马灯、数码管、外部中断、按键、蜂鸣器)
单片机·学习·51单片机·外部中断·蜂鸣器·数码管·跑马灯
月阳羊21 小时前
【硬件-笔试面试题-69】硬件/电子工程师,笔试面试题(知识点:电机驱动电路的反馈电路)
java·经验分享·嵌入式硬件·面试
weixin_468466851 天前
树莓派32位与64位系统安装teamviewer远程软件
linux·单片机·自动化·树莓派·远程控制·vnc·teamviewer
沐欣工作室_lvyiyi1 天前
2025-2026单片机物联网毕业设计题目推荐(定稿付款)
单片机·物联网·课程设计