目次
一、主要功能
二、硬件资源
三、程序编程
四、实现现象
一、主要功能
基于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站演示视频:
基于单片机的信号选择与温度变化
全部资料(源程序、仿真文件、安装包、演示视频):
百度网盘资料下载https://pan.baidu.com/s/1EBYR-K9DWYQ4wROr5oqfNg?pwd=gqo9
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |