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

相关推荐
智商偏低1 小时前
单片机之helloworld
单片机·嵌入式硬件
青牛科技-Allen2 小时前
GC3910S:一款高性能双通道直流电机驱动芯片
stm32·单片机·嵌入式硬件·机器人·医疗器械·水泵、
森焱森4 小时前
无人机三轴稳定控制(2)____根据目标俯仰角,实现俯仰稳定化控制,计算出升降舵输出
c语言·单片机·算法·架构·无人机
白鱼不小白4 小时前
stm32 USART串口协议与外设(程序)——江协教程踩坑经验分享
stm32·单片机·嵌入式硬件
S,D5 小时前
MCU引脚的漏电流、灌电流、拉电流区别是什么
驱动开发·stm32·单片机·嵌入式硬件·mcu·物联网·硬件工程
芯岭技术8 小时前
PY32F002A单片机 低成本控制器解决方案,提供多种封装
单片机·嵌入式硬件
youmdt8 小时前
Arduino IDE ESP8266连接0.96寸SSD1306 IIC单色屏显示北京时间
单片机·嵌入式硬件
嘿·嘘8 小时前
第七章 STM32内部FLASH读写
stm32·单片机·嵌入式硬件
Meraki.Zhang8 小时前
【STM32实践篇】:I2C驱动编写
stm32·单片机·iic·驱动·i2c
几个几个n11 小时前
STM32-第二节-GPIO输入(按键,传感器)
单片机·嵌入式硬件