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

打印 上一主题 下一主题

主题 504|帖子 504|积分 1512



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

一、主要功能

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

基于KEIL5编写C++代码,PROTEUS8.15进行仿真,全部资源在页尾,提供安装包。

三、程序编程

  1. #include <reg51.h>  //定义头文件
  2. #include "DS18B20.h"
  3. #include "stdio.h"
  4. #include "Seg.h"
  5. #include <data.h>
  6. #define dataout P3  
  7. #define uchar unsigned char   
  8. #define uint unsigned int   
  9. unsigned char pos = 0;//用于数码管显示第几位
  10. unsigned char Seg_Buf[8] = {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};数码管段码显示
  11. unsigned char Seg_String[8];/数码管位码显示
  12. unsigned int  ms_Tick;
  13. unsigned int Temperature;//设置温度变量
  14. unsigned int  led1_Tick = 0;//led1计数
  15. unsigned int  led2_Tick = 0;//led2计数
  16. unsigned int  led3_Tick = 0;//led3计数
  17. unsigned int  beep_Tick = 0;//beep计数
  18. uchar fre[5] ="001Hz";
  19. uint data THHL=65536-3906;
  20. uchar data keyword,n=0;   
  21. uchar data Signal_chose = 0;
  22. uchar data div = 1;
  23. sbit led1=P1^0;   //led1灯定义引脚
  24. sbit led2=P1^1;   //led2灯定义引脚
  25. sbit led3=P1^2;   //led3灯定义引脚
  26. sbit beep = P1^6;         //定义蜂鸣器的引脚
  27. sbit key1 = P1^3;
  28. sbit key2 = P1^4;
  29. extern low_temperature=30;///全局变量设置低温度
  30. extern hight_temperature=50;/全局变量设置高温度
  31. static int flag=0;
  32. void Timer0Init(void)                //5微秒@12.000MHz
  33. {
  34.         TMOD &= 0xF0;                //设置定时器模式
  35.         TMOD |= 0x01;                //设置定时器模式
  36.         TL0 = 0x88;                //设置定时初值
  37.         TH0 = 0xFF;                //设置定时初值
  38.         TF0 = 0;                //清除TF0标志
  39.         TR0 = 1;                //定时器0开始计时
  40.         ET0 =1;
  41.         EA = 1;
  42. }
  43. void init()        //初始化
  44. {   
  45. dataout=0x00;
  46. THHL=65536-3906;  ///初始频率为1Hz
  47. TH1=THHL/256;
  48. TL1=THHL%256;   
  49. TMOD=0x11;
  50. ET1=1;
  51. TR1=1;
  52. EA=1;   
  53. }   
  54. void beep_Proc(void) /蜂鸣器报警函数
  55. {
  56.                 if(beep_Tick==100)
  57.                 {
  58.                         beep=1;
  59.                 }
  60.                 if(beep_Tick==220)
  61.                 {
  62.                   beep=0;
  63.                         beep_Tick=0;
  64.                 }
  65.                
  66. }
  67. void led1_Proc(void) /led1灯闪烁函数
  68. {
  69.     if(led1_Tick==250)       
  70.                 {
  71.                         led1=1;
  72.                 }
  73.                 if(led1_Tick==500)
  74.                 {
  75.                   led1=0;
  76.                         led1_Tick=0;
  77.                 }
  78. }
  79. void led2_Proc(void) /led2灯闪烁函数
  80. {
  81.     if(led2_Tick==80)       
  82.                 {
  83.                         led2=1;
  84.                 }
  85.                 if(led2_Tick==200)
  86.                 {
  87.                   led2=0;
  88.                         led2_Tick=0;
  89.                 }
  90. }
  91. void led3_Proc(void) /led3灯闪烁函数
  92. {
  93.     if(led3_Tick==160)       
  94.                 {
  95.                         led3=1;
  96.                 }
  97.                 if(led3_Tick==400)
  98.                 {
  99.                   led3=0;
  100.                         led3_Tick=0;
  101.                 }
  102. }
  103. void keyscan()   
  104. {   
  105.   if(!key1)
  106.         {
  107.                 flag = 1;
  108.                 while(!key1);
  109.         }
  110.        
  111.         if(!key2)
  112.         {
  113.                 flag = 2;
  114.                 while(!key2);
  115.         }
  116.   div = Temperature/2.0;
  117.         if(div<=0)
  118.         {
  119.                 div = 1;
  120.         }
  121.         THHL=65536-3906/div;
  122.         switch(flag)
  123.         {
  124.                
  125.                         case 62: {
  126.                                                         if(div>=100)
  127.                                                         THHL=65536-39;
  128.                                                         else
  129.                                                         {div++;THHL=65536-3906/div;}//频率up
  130.                                                         fre[0]=div/100 + '0';fre[1]=div/10%10 + '0';fre[2]=div%10 + '0';
  131.                                                         TR1=1; break;
  132.                                                         }   
  133.                 case 61: {
  134.                                                         if(div<=1) THHL=65536-3906; else {div--;THHL=65536-3906/div;}//频率down
  135.                                                         }                          
  136.                 case 1: {Signal_chose=0;TR1=0;TR1=1; break;}          //正弦波
  137.                 case 2: {Signal_chose=1;TR1=0;TR1=1; break;}                //方波
  138.         }
  139.   
  140. }   
  141. void Key_Proc(void)   
  142. {
  143.         sprintf(Seg_String,"%2d      ",(unsigned int)Temperature);//通过printf把温度的打印到数码管显示的数组里
  144.         Seg_Tran(Seg_String,Seg_Buf);数码管显示函数
  145. }
  146. void main(void)
  147. {
  148.         Timer0Init();
  149.         Temperature = (unsigned int)ReadTemperature();/DS18B20温度检测,把温度的值直接给Temperature
  150.         Delay100ms();
  151.         beep =0;
  152.   init();
  153.         while(1)
  154.         {
  155.                
  156.                 keyscan();
  157.                 switch(Signal_chose)   
  158.                         {   
  159.                                 case 0: {dataout=sin_tab[n]; break;}  //正弦波
  160.                                 case 1: {dataout=squ_tab[n]; break;}  //方波
  161.                                 default:{break;}   
  162.                          }                  
  163.                        
  164.                          if(Temperature < low_temperature)///将Temperature和设置的温度来进行比较
  165.                         {
  166.                                 led1_Tick++;
  167.                                 led1_Proc();
  168.                                 led2 = 0;///led2灯灭
  169.                                 led3 = 0;///led3灯灭
  170.                                  beep=0;
  171.                                 }
  172.             if(Temperature<hight_temperature&&Temperature>low_temperature)
  173.                         {
  174.                                 led3_Tick++;
  175.                                 led3_Proc();
  176.                                 led2 = 0;///led2灯灭
  177.                                 led1 = 0;///led3灯灭
  178.                                  beep=0;
  179.                         }
  180.                                 if(Temperature>hight_temperature)
  181.                         {
  182.                                 led2_Tick++;
  183.                                 led2_Proc();
  184.                                 led1 = 0;///led1灯灭
  185.                                 led3 = 0;///led3灯灭
  186.                                 beep_Tick++;
  187.                                 beep_Proc();
  188.                                
  189.                         }
  190.                
  191.                 Key_Proc();//
  192.                 ms_Tick++;
  193.        
  194.                 if(((ms_Tick % 50) == 0))
  195.                 {
  196.                         EA = 0;
  197.                         Temperature = (unsigned int)ReadTemperature();
  198.                         EA = 1;
  199.                
  200.                 }
  201.        
  202.         }
  203. }
  204. void time_intt1(void) interrupt 3   
  205. {   
  206.         TL1=THHL%256;TH1=THHL/256;   
  207.         n++;
  208. }   
  209. void Timer0(void) interrupt 1                               
  210. {
  211.         TL0 = 0x20;                //设置定时初值
  212.         TH0 = 0xf1;                //设置定时初值
  213.        
  214.         if(++pos == 8)pos = 0;从第一位数码管来进行显示
  215.        
  216.         Seg_Disp(Seg_Buf,pos);
  217.        
  218. }
复制代码
四、实现现象

具体动态效果看B站演示视频:
     基于单片机的信号选择与温度变化
  全部资料(源程序、仿真文件、安装包、演示视频):
百度网盘资料下载
https://pan.baidu.com/s/1EBYR-K9DWYQ4wROr5oqfNg?pwd=gqo9



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

星球的眼睛

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表