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

相关推荐
憧憬一下10 分钟前
Linux内核早期打印机制与RS485通信技术
arm开发·嵌入式硬件·嵌入式·linux驱动开发
电子工程师UP学堂1 小时前
电子应用设计方案-37:智能鼠标系统方案设计
人工智能·单片机·嵌入式硬件·计算机外设
Q23553688721 小时前
100V降压恒流芯片SL2516D 内置MOS管 支持15W功率输出 电动车照明
单片机·嵌入式硬件
石板小湫1 小时前
46 基于单片机的烧水壶系统设计
单片机·嵌入式硬件
lucy1530275107911 小时前
【青牛科技】BISS0001高性能的传感信号处理集成电路芯片,广泛用于安防、自控等领域能
科技·单片机·智能家居·信号处理·安防·工控主板
白天看海11 小时前
40 基于单片机的温湿度检测判断系统
单片机·嵌入式硬件
zcb84964437112 小时前
27 基于51单片机的方向盘模拟系统
嵌入式硬件·51单片机·proteus·方向盘
test猿12 小时前
电与计算机的关系
单片机·嵌入式硬件·物联网
编程圈子14 小时前
STM32 HAL库开发学习3.STM32启动浅析
stm32·嵌入式硬件·学习