找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5623|回复: 0
收起左侧

温度单片机P0口用74HC373或74HC573锁存

[复制链接]
ID:77367 发表于 2015-4-19 03:29 | 显示全部楼层 |阅读模式


  1. #include <AT89X52.h>       //调用51单片机的头文件
  2. #include <Intrins.h>
  3. sbit ds18b20=P3^7;
  4. sbit OK=P3^6;
  5. unsigned char TT,temp1,num,TL=20,TH=27,w,s,m,n;
  6. unsigned char temp,temp2,key,dat;
  7. unsigned char  code tabcc[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xff};//共阴极
  8. unsigned char  code tabca[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xBF};//共阳极
  9. //---------------------------------------
  10. //名称:复位DS18B20函数
  11. //---------------------
  12. void delay(int ms)
  13. {
  14.   int i;
  15.   while(ms--)
  16.    for(i=0;i<120;i++);
  17. }

  18. void disp(w,s)                  
  19. {
  20.    unsigned char temp=0x01;
  21.    ///////////////////
  22.       P0=tabca[s]; //显示一位数据  
  23.    P2 &=0xFC;
  24.     _nop_();
  25.    P2 |=0x03;
  26.    _nop_();   

  27.   
  28.    P0=1<<w-1;          //一位位选
  29.    P2 =0x01;
  30.    _nop_();
  31.    P2 |=0x03;
  32.    _nop_();
  33.    delay(6);
  34.    /////////////////////////
  35.    P0=0xff;         //一位显示完后清屏  
  36.    P2 &=0xFC;
  37.    _nop_();
  38.    P2 |=0x03;
  39.    _nop_();
  40.    ///////////////////
  41. }
  42. void main()
  43.   {
  44.     char i;
  45. while(1)
  46. {
  47.    TT++;
  48.    if(TT==100)
  49.       TT=0;
  50.    n=TT/10;
  51.    m=TT%10;
  52.    for(i=0;i<20;i++)
  53.      {
  54.     disp(1,m); //个位
  55.     disp(2,n); //十位

  56.     disp(6,10);//右杠
  57.     disp(7,2);//区间
  58.     disp(8,10);//左杠
  59.      
  60.      }

  61.    }
  62. }
复制代码





  1. #include <AT89X52.h>       //调用51单片机的头文件
  2. #include <Intrins.h>
  3. sbit ds18b20=P3^7;
  4. sbit OK=P3^6;
  5. unsigned char TT,temp1,num,TL=20,TH=27,y;
  6. unsigned char temp,temp2,key,dat;
  7. unsigned char  code tabcc[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xff};//共阴极
  8. unsigned char  code tabca[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x00};//共阳极
  9. //---------------------------------------
  10. //名称:复位DS18B20函数
  11. //---------------------
  12. void delay(int ms)
  13. {
  14.   int i;
  15.   while(ms--)
  16.    for(i=0;i<120;i++);
  17. }


  18. void disp(void)
  19. {
  20.    unsigned char temp=0x01;
  21.    ///////////////////
  22.       P0=tabca[TT%10]; //第一位显示数据  
  23. P2 &=0xFC;
  24.   _nop_();
  25. P2 |=0x03;
  26. _nop_();   

  27. P0=0x01;          //第一位位选
  28. P2 =0x01;
  29. _nop_();
  30. P2 |=0x03;
  31. _nop_();

  32. delay(6);
  33. /////////////////////////
  34. P0=0xff; //第一位显示数据  
  35. P2 &=0xFC;
  36. _nop_();
  37. P2 |=0x03;
  38. _nop_();

  39. ///////////////////

  40. P0=tabca[TT/10]; //第二位显示数据  
  41. P2 &=0xFC;
  42.   _nop_();
  43. P2 |=0x03;
  44. _nop_();   

  45. P0=0x02;          //第二位位选
  46. P2 =0x01;
  47. _nop_();
  48. P2 |=0x03;
  49. _nop_();
  50. delay(6);
  51. //////////////////////
  52. P0=0xff; //第一位显示数据  
  53. P2 &=0xFC;
  54. _nop_();
  55. P2 |=0x03;
  56. _nop_();
  57.      /////////////////////

  58. }

  59. void main()
  60.   {
  61.     char i;
  62. while(1)
  63. {
  64. TT++;
  65. if(TT==100)
  66.     TT=0;
  67. for(i=0;i<20;i++)
  68.    {
  69. disp();
  70.   
  71.    }

  72.    }
  73. }
复制代码





  1. #include <AT89X52.h>       //调用51单片机的头文件
  2. #include <Intrins.h>
  3. sbit ds18b20=P3^7;
  4. sbit OK=P3^6;
  5. unsigned char TT,temp1,num,TL=20,TH=27,w,s,m,n;
  6. unsigned char temp,temp2,key,dat;
  7. unsigned char  code tabcc[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xff};//共阴极
  8. unsigned char  code tabca[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xBF,0xFF};//共阳极
  9. //---------------------------------------
  10. //名称:ms延迟
  11. //---------------------
  12. void delay(int ms)
  13. {
  14.   int i;
  15.   while(ms--)
  16.    for(i=0;i<120;i++);
  17. }
  18. //---------------------------------------
  19. //名称:复位DS18B20函数
  20. //---------------------
  21. bit Reset(void)
  22. {
  23.    unsigned int i;
  24.    bit k;
  25.    ds18b20=0;           
  26.    i=95;         
  27.    while(i--);  
  28.                     
  29.    ds18b20=1;   
  30.    i=9;        
  31.    while(i--);      
  32.               
  33.    k=ds18b20;           
  34.    i=55;         
  35.    while(i--);     
  36.                
  37.    return k;         
  38. }
  39. //---------------------------------------
  40. //名称:读一字节函数
  41. //---------------------------------------
  42. unsigned char ReadByte(void)
  43. {
  44.    unsigned int i;
  45.    unsigned char j,buf=0;
  46.    for(j=0;j<8;j++)  
  47.    {
  48.         buf=buf>>1;   
  49.         ds18b20=0;        
  50.         _nop_();      
  51.         _nop_();              
  52.         ds18b20=1;   
  53.         _nop_();        
  54.         _nop_();   
  55.         _nop_();     
  56.         _nop_();      
  57.         _nop_();        
  58.         _nop_();      
  59.         _nop_();        
  60.        if(ds18b20==1)
  61.        buf|=0x80;
  62.        i=7;     
  63.           while(i--);  
  64.                
  65.    }
  66.    return buf;         
  67. }
  68. //---------------------------------------
  69. //名称:写一字节函数
  70. //---------------------------------------
  71. void WriteByte(unsigned char dat)
  72. {
  73. unsigned int i;
  74.     unsigned char j;
  75.     for(j=0;j<8;j++)
  76.      {            
  77.        if(dat&0x01)   //如果写1
  78.          {     
  79.             ds18b20=0;    //拉低     
  80.             _nop_();        //维持2US,符合大于1US小于15US的规范
  81.             _nop_();        //维持2US,符合大于1US小于15US的规范
  82.             ds18b20=1;     //拉高      
  83.             i=7;      //维持约63US,符合不低于60US的要求
  84.             while(i--);    //维持约63US,符合不低于60US的要求        
  85.          }
  86.       else      //如果写0
  87.          {           
  88.             ds18b20=0;    //拉低         
  89.             i=7;     //维持约63US,符合不低于60US的要求
  90.             while(i--);   //维持约63US,符合不低于60US的要求              
  91.             ds18b20=1;    //拉高        
  92.             _nop_();        //维持2US,符合大于1US的规范
  93.             _nop_();        //维持2US,符合大于1US的规范        
  94.          }
  95.       dat=dat>>1;    //写入字节右移1位
  96. }
  97. }
  98. //---------------------------------------
  99. //名称:DS18B20温度转换函数
  100. //---------------------------------------
  101. bit Convert(void)
  102. {   
  103. if(Reset()==0)          //复位DS18B20成功
  104.    {
  105.         WriteByte(0xcc);  //写入跳过序列号命令字 Skip Rom
  106.         WriteByte(0x44);  //写入温度转换命令字 Convert T
  107.         return 1;            //启动温度转换成功
  108.    }
  109. else                    //失败
  110.    {  
  111.         return 0;            //启动温度转换失败
  112.    }
  113. }
  114. //---------------------------------------
  115. //名称:转换结束处理函数
  116. //---------------------------------------
  117. void ReadFlash(void)
  118. {   
  119. unsigned char Lsb,Msb;
  120.     if(Reset()==0)          //复位DS18B20成功
  121.     {
  122.         WriteByte(0xcc);  //写入跳过序列号命令字 Skip Rom
  123.         WriteByte(0xbe);  //写入读取数据令字 Read Scratchpad
  124.         Lsb=ReadByte();  //读出第一个字节暂存于LSB
  125.         Msb=ReadByte();  //读出第二个字节暂存于MSB
  126.         temp1=Lsb;       //temp1内装温度参数的小数部分
  127.         temp2=Msb; //(Msb>>4)|(Lsb<<4);//temp2内装温度参数的整数部分  
  128.     }
  129. else
  130.     {
  131.         temp1=0;     //如果复位失败,温度参数清零
  132.         temp2=0;     //如果复位失败,温度参数清零
  133.     }
  134. }

  135. void disp(w,s)                  
  136. {
  137.    unsigned char temp=0x01;
  138.    ///////////////////
  139.       P0=tabca[s]; //显示一位数据  
  140.       P2 &=0xFC;
  141.       _nop_();
  142.       P2 |=0x03;
  143.       _nop_();   

  144.   
  145.       P0=1<<w-1;          //一位位选
  146.       P2 =0x01;
  147.       _nop_();
  148.       P2 |=0x03;
  149.       _nop_();
  150.       delay(4);
  151.    /////////////////////////
  152.       P0=0xff;         //一位显示完后清屏  
  153.       P2 &=0xFC;
  154.       _nop_();
  155.       P2 |=0x03;
  156.       _nop_();
  157.    ///////////////////
  158. }
  159. void main()
  160. {      
  161.   while(1)
  162.   {   
  163.       {
  164.       if(Convert()==1);
  165.         {
  166.       ReadFlash();
  167.       TT=(temp2<<4)|(temp1>>4);     
  168.      }
  169.    if(TT<TL)
  170.        num=0;
  171.    else if(TT>TH)
  172.        num=2;
  173.       else   //((TT>=TL)&(TT<=TH))
  174.        num=1;
  175.       disp(1,TT%10); //个位
  176.       disp(2,TT/10); //十位
  177.    
  178.   
  179.   
  180.       disp(6,10);//右杠
  181.       disp(7,num);//区间
  182.       disp(8,10);//左杠      
  183.       }     
  184.   
  185.   }
  186. }
复制代码





回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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