找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 34574|回复: 37
收起左侧

单片机数字温度计设计-带原理图 PCB 程序 仿真实验(数码管显示)

  [复制链接]
ID:108715 发表于 2016-5-12 07:56 | 显示全部楼层 |阅读模式
这是一个很详细的基于51单片机的数字温度计课程设计用数码管显示温度,包含Altium Designer画的pcb文件,原理图,还有仿等等。资料仅供参考学习,任何商业用途概不负责。

单片机数字温度计原理图仿真图:
QQ截图20160512075311.jpg

pcb文件:
pcb.jpg

0.png
基于51单片机的数字温度计详细原理图

0.png
本数字温度计设计的所有资料下载:
数字温度计资料.zip (3.67 MB, 下载次数: 748)
坛友修改的版本: 修改后的温度计程序 Proteus7.5版本工程.7z (40.52 KB, 下载次数: 72)
相关试验文档下载:
DS18B20数字温度计设计实验文档(数码管显示的).doc (4.23 MB, 下载次数: 246)
单片机数字温度计设计.doc (395.09 KB, 下载次数: 254)





/*****温度计的元件清单如下*****/

1、四位一体共阳数码管;
2、三极管8550        5个;
3、双孔接线端子        1个;
4、继电器        1个;
5、LED            1个;
6、470电阻        9个;
7、空心三孔插针        1个;
8、蜂鸣器        1个;
9、单片机        1个;

11、4.7K电阻        10个;
12、DIP40        1个;
13、自锁开关        1个;
14、10Uf电解电容    1个;
15、10K电阻        1个;
16、12M晶振        1个;
17、30P瓷片电容        2个;
18、轻触按键        3个;
19、USB接口        1个;
20、二极管IN4148    1个;
21、10K排阻103        1个;
22、7*9万用板        1个;
23、温度传感器DS18B20    1个;
24、USB数据线        1条;
25、电路图纸        1张。
/*****共:25种元件*****/


单片机数字温度计设计的程序源代码:
  1. #include "reg51.h"
  2. #include "intrins.h"        //_nop_();延时函数用
  3. #define  dm P0              //段码输出口

  4. #define  uchar unsigned char
  5. #define  uint  unsigned int
  6. sbit DQ=P2^7;       //温度输入口
  7. sbit w0=P2^0;       //数码管4
  8. sbit w1=P2^1;                //数码管3
  9. sbit w2=P2^2;                //数码管2
  10. sbit w3=P2^3;                 //数码管1
  11. sbit LED=P1^6;                //指示灯
  12. sbit beep=P1^7;      //蜂鸣器
  13. sbit set=P2^6;        //温度设置切换键  
  14. sbit add=P2^4;        //温度加
  15. sbit dec=P2^5;        //温度减
  16. int temp1=0;          //显示当前温度和设置温度的标志位为0时显示当前温度
  17. uint h;
  18. uint temp;
  19. uchar r;
  20. uchar high=30,low=15; //温度范围设置为15-30度
  21. uchar sign;
  22. uchar q=0;
  23. uchar tt=0;
  24. uchar scale;
  25. //**************温度小数部分用查表法***********//
  26. uchar code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};                 //小数断码表

  27. uchar code table_dm[12]={~0x3f,~0x06,~0x5b,~0x4f,~0x66,~0x6d,~0x7d,~0x07,~0x7f,~0x6f,~0x00,~0x40};
  28. //共阳极数码管LED段码表        "0"  "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9" "不亮" "-"  
  29. uchar table_dm1[]={~0xbf,~0x86,~0xdb,~0xcf,~0xe6,~0xed,~0xfd,~0x87,~0xff,~0xef};  //个位带小数点的断码表


  30.   
  31. uchar data temp_data[2]={0x00,0x00};             //读出温度暂放
  32. uchar data display[5]={0x00,0x00,0x00,0x00,0x00};     //显示单元数据,共4个数据和一个运算暂用
  33. /*****************11us延时函数*************************/

  34. void delay(uint t)
  35. {
  36.   for (;t>0;t--);
  37. }

  38. void scan()
  39. {
  40. int j;
  41.         for(j=0;j<4;j++)
  42.         {
  43.                 switch (j)
  44.                 {
  45.                         case 0: dm=table_dm[display[0]];w0=0;delay(50);w0=1;//xiaoshu
  46.                         case 1: dm=table_dm1[display[1]];w1=0;delay(50);w1=1;//gewei
  47.                         case 2: dm=table_dm[display[2]];w2=0;delay(50);w2=1;//shiwei
  48.                         case 3: dm=table_dm[display[3]];w3=0;delay(50);w3=1;//baiwei
  49.                                 //        else{dm=table_dm[b3];w3=0;delay(50);w3=1;}
  50.         }
  51.         }
  52. }

  53. //***************DS18B20复位函数************************/
  54. ow_reset(void)
  55. {
  56. char presence=1;
  57. while(presence)
  58. {
  59.   while(presence)
  60.    {
  61.     DQ=1;_nop_();_nop_();//从高拉倒低
  62. DQ=0;                                       
  63. delay(50);           //550 us
  64. DQ=1;                                       
  65. delay(6);            //66 us
  66. presence=DQ;         //presence=0 复位成功,继续下一步
  67.    }
  68.    delay(45);            //延时500 us
  69.    presence=~DQ;         
  70. }
  71. DQ=1;                   //拉高电平
  72. }
  73. /****************DS18B20写命令函数************************/
  74. //向1-WIRE 总线上写1个字节
  75. void write_byte(uchar val)
  76. {
  77.   uchar i;
  78.   for(i=8;i>0;i--)
  79.   {
  80.    DQ=1;_nop_();_nop_();                  //从高拉倒低
  81.    DQ=0;_nop_();_nop_();_nop_();_nop_();  //5 us
  82.    DQ=val&0x01;                           //最低位移出
  83.    delay(6);                              //66 us
  84.    val=val/2;                             //右移1位
  85.    }
  86.    DQ=1;
  87.    delay(1);
  88. }
  89. /****************DS18B20读1字节函数************************/
  90. //从总线上取1个字节
  91. uchar read_byte(void)
  92. {
  93. uchar i;
  94. uchar value=0;
  95. for(i=8;i>0;i--)
  96. {
  97.   DQ=1;_nop_();_nop_();
  98.   value>>=1;
  99.   DQ=0;_nop_();_nop_();_nop_();_nop_();         //4 us
  100.   DQ=1;_nop_();_nop_();_nop_();_nop_();         //4 us
  101.   if(DQ)value|=0x80;
  102.   delay(6);                                     //66 us
  103. }
  104. DQ=1;
  105. return(value);
  106. }

  107. /*****************读出温度函数************************/
  108. read_temp()
  109. {
  110.   ow_reset();                  //总线复位
  111.   delay(200);
  112.   write_byte(0xcc);            //发命令
  113.   write_byte(0x44);            //发转换命令
  114.   ow_reset();
  115.   delay(1);
  116.   write_byte(0xcc);            //发命令
  117.   write_byte(0xbe);
  118.   temp_data[0]=read_byte();    //读温度值的第字节
  119.   temp_data[1]=read_byte();    //读温度值的高字节
  120.   temp=temp_data[1];
  121.   temp<<=8;                                               
  122.   temp=temp|temp_data[0];      // 两字节合成一个整型变量。
  123. return temp;                 //返回温度值
  124. }
  125. /****************温度数据处理函数************************/
  126. //二进制高字节的低半字节和低字节的高半字节组成一字节,这个
  127. //字节的二进制转换为十进制后,就是温度值的百、十、个位值,而剩
  128. //下的低字节的低半字节转化成十进制后,就是温度值的小数部分
  129. /********************************************************/
  130. work_temp(uint tem)
  131. {
  132. uchar n=0;
  133. if(tem>6348)                        // 温度值正负判断
  134.      {tem=65536-tem;n=1;}            // 负温度求补码,标志位置1
  135.       display[4]=tem&0x0f;           // 取小数部分的值
  136.   display[0]=ditab[display[4]];  // 存入小数部分显示值
  137.       display[4]=tem>>4;             // 取中间八位,即整数部分的值
  138. display[3]=display[4]/100;     // 取百位数据暂存
  139.   display[1]=display[4]%100;     // 取后两位数据暂存
  140.   display[2]=display[1]/10;      // 取十位数据暂存
  141.   display[1]=display[1]%10;     //个位数据
  142.   r=display[1]+display[2]*10+display[3]*100;
  143. /////符号位显示判断/////
  144.   if(!display[3])
  145.   {
  146.     display[3]=0x0a;           //最高位为0时不显示
  147.     if(!display[2])
  148. {
  149.    display[2]=0x0a;        //次高位为0时不显示
  150. }
  151.   }
  152.   if(n){display[3]=0x0b;}      //负温度时最高位显示"-"
  153. }

  154. void BEEP()
  155. {
  156.         if((r>=high&&r<129)||r<low)
  157.         {
  158.                 beep=!beep;
  159.                 LED=0;
  160.         }
  161.         else
  162.         {
  163.                 beep=1;
  164.                 LED=1;
  165.         }
  166. }
  167. //*********设置温度显示转换************//
  168. void xianshi(int horl)
  169. {
  170.         int n=0;
  171.         if(horl>128)
  172.         {
  173.                 horl=256-horl;n=1;
  174.         }
  175.         display[3]=horl/100;
  176.         display[3]=display[3]&0x0f;
  177.         display[2]=horl%100/10;
  178.         display[1]=horl%10;
  179.         display[0]=0;
  180.         if(!display[3])
  181.         {
  182.             display[3]=0x0a;          //最高位为0时不显示
  183.             if(!display[2])
  184.                 {
  185.                    display[2]=0x0a;        //次高位为0时不显示
  186.                 }
  187.         }
  188.           if(n)
  189.           {
  190.                   display[3]=0x0b; //负温度时最高位显示"-"
  191.           }     

  192. }

  193. //*********按键查询程序**************//
  194. void keyscan()
  195. {
  196.         int temp1;   //最高温度和最低温度标志位
  197.         if(set==0)        
  198.         {
  199.                 while(1)
  200.                 {        
  201.                         delay(500);//消抖
  202.                         if(set==0)
  203.                         {        
  204.                                 temp1++;
  205.                                 while(!set)
  206.                                 scan();
  207.                         }
  208.                         if(temp1==1)
  209.                         {
  210.                                 xianshi(high);
  211.                                 scan();
  212.                                 if(add==0)
  213.                                 {
  214.                                         while(!add)
  215.                                         scan();
  216.                                         high+=1;
  217.                                 }
  218.                                 if(dec==0)
  219.                                 {
  220.                                         while(!dec)
  221.                                         scan();
  222.                                         high-=1;
  223.                                 }
  224.                         }               
  225.                         
  226.                         if(temp1==2)
  227.                         {
  228.                                 xianshi(low);
  229.                                 if(add==0)
  230.                                 {
  231.                                         while(!add)
  232.                                         scan();
  233.                                         low+=1;
  234.                                 }
  235.                                 if(dec==0)
  236.                                 {
  237.                                         while(!dec)
  238.                                         scan();
  239.                                         low-=1;        
  240.                                 }
  241.                                 scan();
  242.                         }
  243.                         if(temp1>=3)
  244.                         {
  245.                                 temp1=0;
  246.                                 break;
  247.                         }
  248.                 }
  249.         }
  250. }

  251. /****************主函数************************/
  252. void main()
  253. {
  254.         
  255.          dm=0x00;                 //初始化端口
  256.          w0=1;
  257.          w1=1;
  258.          w2=1;
  259.          w3=1;
  260.          for(h=0;h<4;h++)              //开机显示"0000"
  261.          {
  262.                 display[h]=0;
  263.          }
  264.          ow_reset();                   //开机先转换一次
  265.          write_byte(0xcc);             //Skip ROM
  266.          write_byte(0x44);             //发转换命令
  267.          for(h=0;h<100;h++)            //开机显示"0000"
  268.          {
  269.                  scan();
  270.          }
  271.          while(1)
  272.          {               
  273.                  if (temp1==0)
  274.                 {
  275.                           work_temp(read_temp());     //处理温度数据
  276.                 BEEP();               
  277.                         scan();                    //显示温度值
  278.                 keyscan();
  279.                 }
  280.                    else
  281.                          keyscan();
  282.                   }
  283. }
复制代码


评分

参与人数 3黑币 +110 收起 理由
去瞧瞧去去去 + 5 绝世好帖!
天才2333333 + 5 很给力!
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:122642 发表于 2016-5-24 14:02 | 显示全部楼层
感谢楼主。发现只能用Proteus7.8版本才可以,其他版本都不行,不过楼主的程序有问题,无法显示,我花了半天的时间修改了一下,奉献给大家,完美运行: 修改后的温度计程序+Proteus7.5版本工程.7z (40.52 KB, 下载次数: 48)
51hei.png

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:20345 发表于 2018-10-17 15:43 | 显示全部楼层
2017年3月份焊接好后,弄了好长时间,一直不亮。一直耿耿于怀。2018年10月16日拿出仔细检查,发现去年焊接时限流电阻阻值焊接错了,还有段码端接错4根,蜂鸣器没接地。按楼主的原理图焊接改好,烧好程序,接上电源,一切正常,能声光报警。高兴。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:108622 发表于 2016-10-12 20:59 来自触屏版 | 显示全部楼层
不知道有没有0下温度
回复

使用道具 举报

ID:127881 发表于 2016-12-31 19:49 | 显示全部楼层
好东西,拿来学习学习
回复

使用道具 举报

ID:164699 发表于 2017-2-15 08:56 | 显示全部楼层
楼主棒棒哒。
回复

使用道具 举报

ID:147958 发表于 2017-2-15 09:02 | 显示全部楼层
好东西,拿来学习学习
回复

使用道具 举报

ID:162689 发表于 2017-2-15 22:40 | 显示全部楼层
学习学习...........
回复

使用道具 举报

ID:159600 发表于 2017-2-17 00:04 | 显示全部楼层
谢谢共享,lz很帅呀
回复

使用道具 举报

ID:194143 发表于 2017-4-30 21:02 | 显示全部楼层
看来不错,不知道用得起不
回复

使用道具 举报

ID:211251 发表于 2017-6-14 18:13 来自触屏版 | 显示全部楼层
好东西,拿来学习学习
回复

使用道具 举报

ID:329939 发表于 2018-5-15 16:14 | 显示全部楼层
单片机好难,要好好研究一下了
回复

使用道具 举报

ID:292628 发表于 2018-5-31 19:58 | 显示全部楼层
这个资料有问题吧,程序弄进去没用
回复

使用道具 举报

ID:342752 发表于 2018-6-8 16:46 | 显示全部楼层
下载不了文件,好伤心
回复

使用道具 举报

ID:348910 发表于 2018-6-11 20:41 | 显示全部楼层
为啥我的数码管不亮??
回复

使用道具 举报

ID:350557 发表于 2018-6-12 19:43 | 显示全部楼层
学习学习
回复

使用道具 举报

ID:342752 发表于 2018-6-20 09:49 | 显示全部楼层
怎么把小数点改成摄氏度"C"  自己改了好久还是失败了
回复

使用道具 举报

ID:323367 发表于 2018-6-21 10:23 | 显示全部楼层
你好   看您使用了蜂鸣器  请问这个设计包括温度上下限报警嘛???
回复

使用道具 举报

ID:359236 发表于 2018-6-27 15:46 | 显示全部楼层
好资料,51黑有你更精彩
回复

使用道具 举报

ID:367019 发表于 2018-7-7 20:21 | 显示全部楼层
数码管不能正常工作,有解决办法吗
回复

使用道具 举报

ID:159857 发表于 2020-5-14 22:06 | 显示全部楼层
好东西,拿来学习学习!谢谢楼主!
回复

使用道具 举报

ID:749309 发表于 2020-5-15 13:51 | 显示全部楼层
好东西哦,借来分享
回复

使用道具 举报

ID:750686 发表于 2020-5-16 09:07 | 显示全部楼层
求解下为啥我仿真不成功啊,按照图做的啊
回复

使用道具 举报

ID:760117 发表于 2020-5-24 20:03 | 显示全部楼层
很有用,非常感谢
回复

使用道具 举报

ID:760117 发表于 2020-5-24 22:29 | 显示全部楼层
很实用,非常感谢
回复

使用道具 举报

ID:760117 发表于 2020-5-24 22:33 | 显示全部楼层
为什么照着这个仿真,结果出不来?
回复

使用道具 举报

ID:760949 发表于 2020-5-25 18:00 | 显示全部楼层
为什么我用仿真就不行呢???
回复

使用道具 举报

ID:763783 发表于 2020-5-28 21:28 | 显示全部楼层
很好,非常感谢
回复

使用道具 举报

ID:767160 发表于 2020-6-3 11:00 | 显示全部楼层
楼主太厉害了,没有头绪的时候看到了楼主,豁然开朗
回复

使用道具 举报

ID:863613 发表于 2020-12-19 22:36 | 显示全部楼层
用了程序后数码管显示不了数据,是怎么回事啦
回复

使用道具 举报

ID:865002 发表于 2020-12-21 20:13 | 显示全部楼层
学习了,今天跑了一下楼主的程序,可以运行,非常感谢,学到新知识了
回复

使用道具 举报

ID:848824 发表于 2020-12-22 15:31 | 显示全部楼层
仿真可以用,实验数码管不亮怎么回事
回复

使用道具 举报

ID:843940 发表于 2021-1-7 10:19 | 显示全部楼层
你这个程序有问题
回复

使用道具 举报

ID:89286 发表于 2021-1-9 09:13 | 显示全部楼层
thanks for sharing
回复

使用道具 举报

ID:561361 发表于 2021-4-13 13:44 | 显示全部楼层
王梓名 发表于 2020-5-24 20:03
很有用,非常感谢

兄弟  帮个忙   为啥 仿真文件夹里的HEX  文件能仿真,程序里的HEX 文件 没实现
回复

使用道具 举报

ID:995569 发表于 2021-12-22 11:00 来自触屏版 | 显示全部楼层
2201651598 发表于 2021-4-13 13:44
兄弟  帮个忙   为啥 仿真文件夹里的HEX  文件能仿真,程序里的HEX 文件 没实现

先运行一下,再链接,在云行
回复

使用道具 举报

ID:1133323 发表于 2024-10-10 14:28 | 显示全部楼层
发表于 2018-10-17 15:43
2017年3月份焊接好后,弄了好长时间,一直不亮。一直耿耿于怀。2018年10月16日拿出仔细检查,发现去年焊接 ...

厉害厉害
回复

使用道具 举报

ID:1135335 发表于 2024-11-2 17:50 | 显示全部楼层
好东西,拿来学习学习
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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