目录
一、主要功能
基于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站演示视频:
基于单片机的信号选择与温度变化
全部资料(源程序、仿真文件、安装包、演示视频):