单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 883|回复: 3
打印 上一主题 下一主题
收起左侧

自己看书写的一个DS18B20温度传感器温度报警器单片机程序

[复制链接]
跳转到指定楼层
楼主
这个是我的课件做的,所以电路图不知道怎么画   就用画图程序画了一个,将就看吧,功能很简单就是检测温度的高低,高于某个值就报警,蜂鸣器响,同理低于某个值也响,最高值和最低值可以通过修改源码初始化值重新编译下载到单片机里,当然,我也设置了功能按键,可以通过diy板上的键设置这两个值,区别在于每次断电后这两个值会恢复到源码里面设置那个值,好了上图上源码


单片机源程序如下:
  1. //采用共阴极数码管
  2.                         //P0接数码管段选                可加一个排阻
  3.                         //P2接数码管位选
  4.                         //P1^1接温度传感器
  5.                         //P1^0接蜂鸣器(需要一个三极管放大来驱动蜂鸣器,通常是8550)
  6.                         //仅供参考(八哥)
  7. /*****************************************************************************/
  8. //程序部分开始//
  9. /****************************************************************************/
  10. //头文件
  11. #include <reg51.h>
  12. /*****************************************************************************/
  13. //数码管的段码编码
  14. unsigned char code table[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
  15. //下一行的数组可以显示数值外,还可以显示数码管的点
  16. unsigned char code table_d[16] = {0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1};
  17. unsigned char code LED_W[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
  18. unsigned int sec = 0,item_h=300,item_l=100;
  19. bit w = 0;
  20. bit v = 1;
  21. /*****************************************************************************/
  22. sbit KEY_1 = P1^4;
  23. sbit KEY_2 = P1^5;
  24. sbit KEY_3 = P1^6;
  25. sbit KEY_4 = P1^7;
  26. sbit led_r = P1^3;
  27. sbit led_g = P1^2;
  28. sbit DQ = P1^1;//ds18B20
  29. sbit        beep   = P1^0;//蜂鸣器
  30. /******************************************************************************/
  31. //DS18B20温度传感器驱动(显示0至60度)
  32. /******************************************************************************/
  33. void Delay(int num){//延时函数
  34.         while(num--) ;
  35. }        
  36. /****************************************************************************/
  37. void Delay_1ms(unsigned int a){//延时函数 1MS/次        
  38.                 unsigned char i;
  39.                 while( --a != 0){               
  40.                         for(i = 0; i < 125; i++);  //一个 ; 表示空语句,CPU空转。
  41.                 }                                      //i 从0加到125,CPU大概就耗时1毫秒
  42. }
  43. /****************************************************************************/
  44. /******************************************************************************/
  45. void Init_DS18B20(void){//初始化ds1820
  46.         unsigned char x=0;
  47.         DQ = 1;    //DQ复位
  48.         Delay(8);  //稍做延时
  49.         DQ = 0;    //单片机将DQ拉低
  50.         Delay(80); //精确延时 大于 480us
  51.         DQ = 1;    //拉高总线
  52.         Delay(14);
  53.         x=DQ;      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
  54.         Delay(20);
  55. }
  56. /******************************************************************************/
  57. unsigned char ReadOneChar(void){//读一个字节
  58.         unsigned char i=0;
  59.         unsigned char dat = 0;
  60.         for (i=8;i>0;i--){
  61.                 DQ = 0; // 给脉冲信号
  62.                 dat>>=1;
  63.                 DQ = 1; // 给脉冲信号
  64.                 if(DQ)
  65.                 dat|=0x80;
  66.                 Delay(4);
  67.         }
  68.         return(dat);
  69. }
  70. /******************************************************************************/
  71. void WriteOneChar(unsigned char dat){//写一个字节
  72.         unsigned char i=0;
  73.         for (i=8; i>0; i--){
  74.                 DQ = 0;
  75.                 DQ = dat&0x01;
  76.                 Delay(5);
  77.                 DQ = 1;
  78.                 dat>>=1;
  79.         }
  80. }
  81. /******************************************************************************/
  82. unsigned int ReadTemperature(void){//读取温度
  83.         unsigned char a=0;
  84.         unsigned char b=0;
  85.         unsigned int t=0;
  86.         float tt=0;
  87.         Init_DS18B20();
  88.         WriteOneChar(0xCC); // 跳过读序号列号的操作
  89.         WriteOneChar(0x44); // 启动温度转换
  90.         Init_DS18B20();
  91.         WriteOneChar(0xCC); //跳过读序号列号的操作
  92.         WriteOneChar(0xBE); //读取温度寄存器
  93.         a=ReadOneChar();  //读低8位
  94.         b=ReadOneChar(); //读高8位
  95.         t=b;
  96.         t<<=8;
  97.         t=t|a;
  98.         tt=t*0.0625;
  99.         t= tt*10+0.5; //放大10倍输出并四舍五入
  100.         return(t);
  101. }
  102. /*****************************************************************************/
  103. void Display(unsigned int i)
  104. {        
  105.         unsigned char a=0,b=0,c=0;
  106.         a=i/100;
  107.         b=(i/10)%10;
  108.         c=i%10;
  109.         
  110.         P0 = 0;
  111.         P2 = LED_W[3];
  112.         P0 = table[12];        //显示C
  113.         Delay_1ms(7.5);
  114.         
  115.         P0 = 0;
  116.         P2 = LED_W[2];
  117.         P0 = table[c];        //显示小数位温度
  118.         Delay_1ms(7.5);
  119.         
  120.         P0 = 0;
  121.         P2 = LED_W[1];
  122.         P0 = table_d[b];        //显示个位温度,带点显示
  123.         Delay_1ms(7.5);
  124.         
  125.         P0 = 0;
  126.         P2 = LED_W[0];
  127.         P0 = table[a];        //显示十位温度
  128.         Delay_1ms(7.5);
  129. }        
  130. /*****************************************************************************/
  131. void Beep_key(void){//-扬声器--按键音
  132.         if (v == 1)
  133.         {
  134.                 unsigned char a;//定义变量用于发声的长度设置
  135.                 for(a=100;a>0;a--){//声音的长度
  136.                         beep = ~beep;
  137.                         Delay(50);//音调设置延时
  138.                 }
  139.                 beep = 1;//音乐结束后扬声器拉高关闭
  140.         }
  141. }               
  142. /*****************************************************************************/
  143. void set_t(unsigned char sel)
  144. {
  145.         if (sel==0)
  146.         {
  147.                 Display(item_h);
  148.                 led_r = 1;
  149.                 led_g = 0;
  150.         }
  151.         if (sel==1)
  152.         {
  153.                 Display(item_l);
  154.                 led_r = 0;
  155.                 led_g = 1;
  156.         }
  157.         if (KEY_1 == 0)
  158.         {
  159.                 if (KEY_1 == 0 && sel == 0) item_h--;
  160.                 if (KEY_1 == 0 && sel == 1)        item_l--;
  161.                 //if (KEY_1 == 0 && sel == 2)        v = 1;
  162.         }
  163.         if (KEY_2 == 0)
  164.         {
  165.                 if (KEY_2 == 0 && sel == 0) item_h++;
  166.                 if (KEY_2 == 0 && sel == 1)        item_l++;
  167.                 //if (KEY_1 == 0 && sel == 2)        v = 0;
  168.         }
  169. }
  170. /*****************************************************************************/
  171. void main(void)
  172. {
  173.         unsigned char e=0;
  174.         beep = 1;
  175.         while(1)
  176.         {
  177.                 if(w == 0)
  178.                 {
  179.                         sec=ReadTemperature();//读温度并送显
  180.                         Display(sec);
  181.                         if (sec > item_h || sec < item_l)beep = 0;        //蜂鸣器响
  182.                         else beep = 1;
  183.                 }
  184.                 else
  185.                 {
  186.                         if(e==0)Display(item_h);
  187.                         if(e==1)Display(item_l);
  188.                 }
  189. /*******************************************************/
  190.                 if (KEY_1 == 0)                //减调整
  191.                 {
  192.                         Delay_1ms(15);
  193.                         if (KEY_1 == 0 && w == 1)//调温状态减调整
  194.                         {
  195.                                 Beep_key();
  196.                                 set_t(e);
  197.                         }
  198.                 }
  199. /*******************************************************/
  200.                 if (KEY_2 == 0)                        //加调整
  201.                 {
  202.                         Delay_1ms(15);
  203.                         if (KEY_2 == 0 && w == 1)//调温状态加调整
  204.                         {
  205.                                 Beep_key();//按键音
  206.                                 set_t(e);
  207.                         }
  208.                 }
  209. /*******************************************************/
  210.                 if (KEY_3 == 0)                //模式调节
  211.                 {
  212.                         Delay_1ms(15);
  213.                         if (KEY_3 == 0 && w == 0)        //正常显示状态进入调温状态
  214.                         {
  215.                                 Beep_key();
  216.                                 w = 1;
  217.                         }
  218.                         if (KEY_3 == 0 && w == 1)        //调温状态选择上下限调节
  219.                         {
  220.                                 e++;
  221.                                 if (e>1)        e = 0;
  222.                                 set_t(e);
  223.                         }
  224.                 }
  225. /*******************************************************/
  226.                 if (KEY_4 == 0)                        //调温状时退出调温
  227.                 {
  228.                         Delay_1ms(15);
  229.                         if (KEY_4 == 0 && w == 1)
  230.                         {
  231.                                 Beep_key();        
  232.                                 w = 0;
  233.                         }
  234.                 }
  235.         }
  236. }
复制代码

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 转播转播 分享分享 分享淘帖 顶 踩
回复

使用道具 举报

沙发
bhjyqjs 发表于 2019-9-10 09:06 | 只看该作者
佩服这位仁兄,用画图软件画出这么漂亮的图
回复

使用道具 举报

板凳
Toxic_pill 发表于 2019-9-10 10:51 | 只看该作者
兄嘚 有PCB吗
回复

使用道具 举报

地板
ping264888 发表于 2019-9-10 11:26 | 只看该作者
不過晶振那裡要修改一下, 是通過電容接地, 不是直接接地.
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|单片机论坛 |51黑电子论坛技术交流 QQ 管理员QQ:125739409;技术交流QQ群636986012

Powered by 单片机教程网

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