标题: DS18B20测温度MAX7219数码管显示程序与仿真 [打印本页]

作者: 145454    时间: 2017-11-18 13:32
标题: DS18B20测温度MAX7219数码管显示程序与仿真
使用DS18B20测温度,8个LED数码管显示,前两个数码管显示当前温度,,后两个数码管显示设定温度

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned  int
  5. sbit din=P1^0;        //MAX7219数据串行输入端
  6. sbit cs=P1^1;  //MAX7219数据输入允许端
  7. sbit clk=P1^2;         //MAX7219时钟信号
  8. sbit DQ=P1^5;         //DS18B20端口DQ
  9. sbit sb=P0^0;
  10. sbit sq=P0^1;
  11. sbit led=P2^0;
  12. uchar dig;
  13. sbit DIN=P0^7;                        //小数点
  14. bit list_flag=0;                //显示开关标志
  15. uchar code tab[]={0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,
  16. 0x70,0x7f,0x7b,0x4E,0x63,0x01,0x00}; //表示不译方式0~9;0x4E为C;0x63为.;0x01为—;0x00不显示
  17. uchar data temp_data[2]={0x00,0x00};
  18. unsigned char data display[]={0x00,0x00,0x00,0x00,0x00,0x00};
  19. unsigned char code ditab[]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
  20. unsigned char x=56;
  21. void Delay(uint ms)                         //延时函数
  22. {
  23. while(ms--);
  24. }
  25. uchar Init_DS18B20(void)                //初始化DS18B20
  26. {
  27. uchar status;                       
  28. DQ=1;                                        //DQ复位
  29. Delay(8);                                //延时片刻
  30. DQ=0;                                                         //单片机将DQ拉低
  31. Delay(90);                                                        //精确延时,大于480us
  32. DQ=1;                                                                //拉低总线
  33. Delay(8);                                                       
  34. status=DQ;                                                        //如果为0,则初始化成功;为1,则初始化失败
  35. Delay(100);
  36. DQ=1;
  37. return(status);
  38. }
  39. uchar ReadOneByte(void)                           //读一个字节
  40. {
  41. uchar i=0;
  42. uchar dat=0;
  43. for(i=8;i>0;i--)
  44. {
  45. DQ=0;                                                          //给脉冲信号
  46. dat>>= 1;
  47. DQ=1;                                                           //给脉冲信号
  48. _nop_();
  49. _nop_();
  50. if(DQ)
  51. {
  52. dat|=0x80;
  53. }
  54. Delay(4);
  55. DQ=1;
  56. }
  57. return(dat);
  58. }
  59. void WriteOneByte(uchar dat)                   //写一个字节
  60. {
  61. uchar i=0;
  62. for(i=8;i>0;i--)
  63. {
  64. DQ=0;
  65. DQ=dat&0x01;
  66. Delay(5);
  67. DQ=1;
  68. dat>>=1;
  69. }
  70. }
  71. void Read_Temperature(void)                                   //读取温度
  72. {
  73. if(Init_DS18B20()==1)
  74. {
  75. list_flag=1;                                                          //DS18B20不正常
  76. }
  77. else
  78. {
  79. list_flag=0;
  80. WriteOneByte(0xCC);                                                //跳过读序号列号的操作
  81. WriteOneByte(0x44);                                                  //启动温度转换
  82. Init_DS18B20();
  83. WriteOneByte(0xCC);                                                 //跳过读序号列号的操作
  84. WriteOneByte(0xBE);                                                   //读取温度寄存器
  85. temp_data[0]=ReadOneByte();                                  //温度低8位
  86. temp_data[1]=ReadOneByte();                                        //温度高8位
  87.         }
  88. }
  89. void Temperature_trans()                                 //温度处理
  90. {
  91. uchar ng=0;
  92. if((temp_data[1]&0xF8)==0xF8)
  93. {
  94. temp_data[1]=~temp_data[1];
  95.   temp_data[0]=~temp_data[0]+1;
  96.   if( temp_data[0]==0x00)
  97.   {
  98.    temp_data[1]++;
  99.   }
  100.   ng=1;
  101. }
  102. display[4]=temp_data[0]&0x0f;
  103. display[0]=ditab[display[4]];                         //查表得小数位的值
  104. display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);
  105. display[3]=display[4]/100;
  106. display[1]=display[4]%100;
  107. display[2]=display[1]/10;
  108. display[1]=display[1]%10;
  109. display[4]=temp_data[0]&0x0f;
  110. if(ng==1)                                                         //温度为0度以下时
  111. {
  112. display[5]=12;                                                  //显示-
  113. }
  114. else
  115. {
  116. display[5]=13;                                                    //不显示-
  117. }
  118. if(!display[3])                                                   //高位为0,不显示
  119. {
  120. display[3]=13;
  121. if(!display[2])                                                        //次高位为0,不显示
  122. display[2]=13;
  123. }
  124. }
  125. void write_7219(uchar add,uchar date)         //add为接受MA7219;date为要写的数据
  126. {
  127. uchar i;
  128. cs=0;
  129. for(i=0;i<8;i++)
  130. {
  131. clk=0;
  132. din=add&0x80;                                                           //按照高位在前,低位在后的顺序发送
  133. add<<=1;                                                                   //先发送地址
  134. clk=1;
  135. }
  136. for (i=0;i<8;i++)                                                   //时钟上升沿写入一位
  137. {
  138. clk=0;
  139. din=date&0x80;
  140. date<<=1;                                                                 //再发送数据
  141. clk=1;
  142. }
  143. cs=1;
  144. }
  145. void init_7219()
  146. {
  147. write_7219(0x0c,0x01);                        //0x0c为关断模式寄存器;0x01表示显示器处于工作状态
  148. write_7219(0x0a,0x0f);                   //0x0a为亮度调节寄存器;0x0f表示使数码管显示亮度为最亮
  149. write_7219(0x09,0x00);                         //0x09为译码模式选择寄存器;0x00表示非译码方式
  150. write_7219(0x0b,0x07);                         //0x0b为扫描限制寄存器;0x07表示8个LED数码管
  151. }

  152. void disp_Max7219(uchar dig, uchar date) //指定位,显示某一数
  153. {
  154. write_7219(dig,date);
  155. }
  156. void main()
  157. { EA=1;ET0=1;
  158.         TMOD=0X01;
  159.         TH0=0X3C;
  160.         TL0=0XB0;
  161.         TR0=1;
  162. init_7219();
  163. while(1)
  164. {
  165. Temperature_trans();
  166. ……………………

  167. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
温度.zip (108.47 KB, 下载次数: 84)





作者: TXWS01    时间: 2017-12-27 07:53
学习了!谢谢分享
作者: h@li    时间: 2019-4-13 11:27
感谢分享




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1