星球的眼睛 发表于 2024-10-8 08:45:01

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



目次
一、主要功能
二、硬件资源
三、程序编程
四、实现现象
一、主要功能

基于51单片机,采用DS18B20检测温度,通过三种LED灯代表不同状态。
采用DAC0832表现信号脉冲,通过8位数码管表现温度。
信号脉冲可以根据两个按键分别调整为正弦大概方波。
频率与温度成正比。
二、硬件资源

基于KEIL5编写C++代码,PROTEUS8.15进行仿真,全部资源在页尾,提供安装包。
https://i-blog.csdnimg.cn/direct/07a4b0250b424e8ea77ee2390621c901.png
三、程序编程


#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 = {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};数码管段码显示
unsigned char Seg_String;/数码管位码显示
unsigned intms_Tick;
unsigned int Temperature;//设置温度变量
unsigned intled1_Tick = 0;//led1计数
unsigned intled2_Tick = 0;//led2计数
unsigned intled3_Tick = 0;//led3计数
unsigned intbeep_Tick = 0;//beep计数

uchar fre ="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=div/100 + '0';fre=div/10%10 + '0';fre=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; break;}//正弦波
                                case 1: {dataout=squ_tab; 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站演示视频:
   基于单片机的信号选择与温度变化
全部资料(源程序、仿真文件、安装包、演示视频):
百度网盘资料下载https://csdnimg.cn/release/blog_editor_html/release2.3.7/ckeditor/plugins/CsdnLink/icons/icon-default.png?t=O83Ahttps://pan.baidu.com/s/1EBYR-K9DWYQ4wROr5oqfNg?pwd=gqo9



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 基于单片机的信号选择与温度变化