找回密码
 注册

QQ登录

只需一步,快速开始

搜索

AT89C51单片机LCD电子时钟的Proteus仿真设计

[复制链接]
coolice 发表于 2020-2-1 23:26:29 | 显示全部楼层 |阅读模式
自己做的设计,经过是仿真与调试,没有问题。利用STC89C51芯片为核心对电子时钟进行开发,实现日期、时间、整点闹铃、实时环境温度监测等功能。LCD1602液晶显示器进行显示,使用芯片内部定时中断完成时钟、日历的基本功能,同时利用温度传感器DS18B20测量环境温度。
仿真原理图,程序工程文件在附件中 LCD时钟课程设计-工程文件.zip (137.55 KB, 售价: 1 E币)
1.jpg

单片机源程序如下:
  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit lcdrs=P2^6;  //定义1602液晶RS端
  5. sbit lcden=P2^7;//定义1602液晶LCDEN端
  6. sbit lcdrw=P2^5;//定义1602液晶LCRW端
  7. sbit s1=P1^4;   //定义按键--功能键
  8. sbit s2=P1^5;        //定义按键--增加键
  9. sbit s3=P1^6;        //定义按键--减小键
  10. sbit s4=P1^7;        //定义按键--确认键
  11. sbit s5=P1^3;        //定义按键--时制转换键
  12. sbit beep=P3^3; //定义蜂鸣器端
  13. sbit led=P2^3;  //定义LED灯端,闪烁测试
  14. sbit s6=P1^2;//定义按键--整点报时开关键
  15. bit s6bit;//定义整点报时开关标志位
  16. read_temp();
  17. bit t;// 定义分号":"闪烁标志位
  18. void ds1820disp();

  19. sbit DQ=P3^7;//温度传感器
  20. uint value;//温度值
  21. uchar flag;//温度符号标志
  22. uchar data disdata[5];

  23. sbit BF=P0^7;//判忙位

  24. uchar count,s1num,s5num,s6num;
  25. char year,month,day,week,miao,shi,fen,pshi;
  26. uchar code table[]=" 20  -  -   ";//定义初始上电时液晶默认显示状态


  27. void delay(uint z)  //延时函数
  28. {
  29.         uint x,y;
  30.         for(x=z;x>0;x--)
  31.                 for(y=110;y>0;y--);
  32. }
  33. void zhuanhuan()
  34. {
  35.         if(shi==0)
  36.             pshi=12;
  37.         if(shi<=12&&shi>=1)
  38.             pshi=shi;
  39.     if(shi>12)
  40.             pshi=shi-12;                                          
  41. }                        


  42. void di_delay(int i)
  43. {
  44.         while(i--);        
  45. }


  46. void di()//蜂鸣器发声函数
  47. {

  48.         beep=~beep;
  49.         di_delay(20);//延时大约20us  通过修改此延时时间达到不同的发声效果        
  50.         
  51. }

  52. ///////////判忙//////////////
  53. uchar lcd_busy(void)
  54. {
  55. bit result;
  56.         lcdrs=0;
  57.   lcdrw=1;
  58.         lcden=1;
  59.         delay(3);
  60.         result=BF;
  61.         lcden=0;
  62.         return result;

  63. }


  64. void write_com(uchar com)//液晶写命令函数

  65. {
  66.         
  67.         while (lcd_busy());
  68.         lcdrs=0;
  69.         lcdrw=0;
  70.         lcden=0;
  71.         P0=com;
  72.         delay(5);
  73.         lcden=1;
  74.         delay(5);
  75.         lcden=0;        
  76.         
  77. }
  78. void write_date(uchar date)//液晶写数据函数

  79. {
  80.         while (lcd_busy());
  81.         lcdrs=1;
  82.         lcdrw=0;
  83.         lcden=0;
  84.         P0=date;
  85.         delay(5);
  86.         lcden=1;
  87.         delay(5);
  88.         lcden=0;        
  89. }
  90. void _shi()        //写"AM"、"PM"函数
  91. {
  92.    if(shi>=12)
  93.    {
  94.          write_com(0x80+0x40+0);//写出"PM"
  95.          write_date('P');
  96.          //write_date('M');
  97.    }
  98.    else
  99.    {
  100.          write_com(0x80+0x40+0);//写出"AM"
  101.          write_date('A');
  102.          //write_date('M');
  103.    }
  104. }
  105. void write_ymd(uchar add1,uchar date1)//写年月日函数
  106. {
  107.         uchar shi,ge;
  108.         shi=date1/10;//分解一个2位数的十位和个位
  109.         ge=date1%10;
  110.         write_com(0x80+add1);//设置显示位置
  111.         write_date(0x30+shi);//送去液晶显示十位
  112.         write_date(0x30+ge); //送去液晶显示个位
  113. }
  114. void write_sfm(uchar add,uchar date)//写时分秒函数
  115. {
  116.         uchar shi,ge;
  117.         shi=date/10;//分解一个2位数的十位和个位
  118.         ge=date%10;
  119.         write_com(0x80+0x40+add);//设置显示位置
  120.         write_date(0x30+shi);//送去液晶显示十位
  121.         write_date(0x30+ge); //送去液晶显示个位
  122. }
  123. void write_week(char week)           //写液晶星期显示函数
  124. {
  125.         write_com(0x80+12);
  126.         switch(week)
  127.         {
  128.                 case 1:        write_date('M');delay(5);
  129.                                 write_date('O');delay(5);
  130.                                 write_date('N');
  131.                                 break;
  132.                 case 2:        write_date('T');delay(5);
  133.                                 write_date('U');delay(5);
  134.                                 write_date('E');
  135.                                 break;
  136.                 case 3:        write_date('W');delay(5);
  137.                                 write_date('E');delay(5);
  138.                                 write_date('D');
  139.                                 break;
  140.                 case 4:        write_date('T');delay(5);
  141.                                 write_date('H');delay(5);
  142.                                 write_date('U');
  143.                                 break;
  144.                 case 5:        write_date('F');delay(5);
  145.                                 write_date('R');delay(5);
  146.                                 write_date('I');
  147.                                 break;
  148.                 case 6:        write_date('S');delay(5);
  149.                                 write_date('A');delay(5);
  150.                                 write_date('T');
  151.                                 break;
  152.                 case 7:        write_date('S');delay(5);
  153.                                 write_date('U');delay(5);
  154.                                 write_date('N');
  155.                                 break;
  156.         }
  157. }
  158. void writeym()
  159. {
  160.    day=1;
  161.    month++;
  162.    if(month==13)
  163.    {
  164.          month=1;
  165.          year++;
  166.          if(year==100)
  167.             year=0;
  168.          write_ymd(3,year);//年若变化则重新写入
  169.         }
  170.         write_ymd(6,month);//月若变化则重新写入
  171. }
  172. void init()//初始化函数
  173. {
  174.    uchar num;
  175.         lcden=0;
  176.         year=19;//初始化种变量值
  177.         month=6;
  178.         day=12;
  179.         week=3;
  180.         shi=13;
  181.         fen=59;
  182.         miao=50;
  183.         count=0;
  184.         s1num=0;
  185.         s5num=0;
  186.         s6num=0;
  187.         write_com(0x38);//初始化1602液晶,5x7点阵,八位数据传输
  188.         write_com(0x0c);//开显示
  189.         write_com(0x06);//写读地址指针自动加一
  190.         write_com(0x01);
  191.         write_com(0x80);//设置显示初始坐标
  192.         for(num=0;num<15;num++)//显示年月日星期
  193.         {
  194.                 write_date(table[num]);
  195.                 delay(5);
  196.         }
  197.                 delay(5);
  198.                 write_com(0x80+0x40+4);//写出时间显示部分的两个":"
  199.                 write_date(':');
  200.                 delay(5);
  201.                 write_com(0x80+0x40+7);
  202.                 write_date(':');
  203.                 delay(5);
  204.         write_week(week);
  205.         write_ymd(3,year);//分别送去液晶显示
  206.         write_ymd(6,month);
  207.         write_ymd(9,day);
  208.         write_sfm(8,miao);//分别送去液晶显示
  209.         write_sfm(5,fen);
  210.         write_sfm(2,shi);
  211.         TMOD=0x01;//设置定时器0工作模式1
  212.         TH0=(65536-50000)/256;//定时器装初值
  213.         TL0=(65536-50000)%256;
  214.         EA=1;        //开总中断
  215.         ET0=1;        //开定时器0中断
  216.         TR0=1;        //启动定时器0
  217. }
  218. void keyscan()//按键扫描函数
  219. {
  220.         if(s1==0)        
  221.         {
  222.                 delay(5);
  223.                 if(s1==0)//确认功能键被按下
  224.                 {        
  225.                     s1num++;//功能键按下次数记录
  226.                         while(!s1);//释放确认                        
  227.                         if(s1num==4)//第一次被按下时
  228.                         {
  229.                             //TR0=0;  //关闭定时器
  230.                                 write_com(0x80+3);//光标定位到年位置
  231.                                 //write_com(0x0f); //光标开始闪烁
  232.                         }
  233.                         if(s1num==5)//第二次按下光标闪烁定位到月位置
  234.                         {
  235.                                 write_com(0x80+6);
  236.                         }
  237.                         if(s1num==6)//第三次按下光标闪烁定位到日位置
  238.                         {
  239.                                 write_com(0x80+9);
  240.                         }
  241.                         if(s1num==7)//第四次按下光标闪烁定位到星期位置
  242.                         {
  243.                                 write_com(0x80+12);
  244.                         }
  245.                         if(s1num==1)//第七次被按下时光标定位到秒位置
  246.                         {
  247.                                  TR0=0;  //关闭定时器
  248.                                 write_com(0x80+0x40+8);
  249.                                 write_com(0x0f); //光标开始闪烁
  250.                         }
  251.                         if(s1num==2)//第六次按下光标闪烁定位到分位置
  252.                         {
  253.                                 write_com(0x80+0x40+5);
  254.                         }
  255.                         if(s1num==3)//第五次按下光标闪烁定位到时位置
  256.                         {
  257.                                 write_com(0x80+0x40+2);
  258.                         }
  259.                         if(s1num==8)//第七次按下
  260.                         {
  261.                                 s1num=0;//记录按键数清零
  262.                                 write_com(0x0c);//取消光标闪烁
  263.                                 TR0=1;        //启动定时器使时钟开始走
  264.                         }               
  265.                 }
  266.         }
  267.         if(s1num!=0)//只有功能键被按下后,增加和减小键才有效
  268.         {
  269.                 if(s4==0)        
  270.           {
  271.                                 delay(5);
  272.                                 if(s4==0)//确认功能键被按下
  273.                                 {        
  274.                                                 while(!s4);//释放确认
  275.                                                 s1num=0;//记录按键数清零
  276.                                                 write_com(0x0c);//取消光标闪烁
  277.                                                 TR0=1;        //启动定时器使时钟开始走
  278.                                 
  279.                                 }
  280.     }
  281.                
  282.                 if(s2==0)
  283.                 {
  284.                         delay(5);
  285.                         if(s2==0)//增加键确认被按下
  286.                         {
  287.                                 while(!s2);//按键释放
  288.                                 if(s1num==4)//若功能键第一次按下
  289.                                 {
  290.                                         year++; //则调整年加1
  291.                                         if(year==100)//若满100后将清零
  292.                                                 year=0;
  293.                                         write_ymd(3,year);//每调节一次送液晶显示一下
  294.                                         write_com(0x80+3);//显示位置重新回到调节处
  295.                                 }
  296.                                 if(s1num==5)//若功能键第二次按下
  297.                                 {
  298.                                         month++;//则调整月加1
  299.                                         if(month==13)//若满12后将置一
  300.                                                 month=1;
  301.                                         write_ymd(6,month);//每调节一次送液晶显示一下
  302.                                         write_com(0x80+6);//显示位置重新回到调节处
  303.                                 }
  304.                                 if(s1num==6)//若功能键第三次按下
  305.                                 {
  306.                                         day++;//则调整日加1
  307.                                         if(year%4==0&&month==2)
  308.                                         {
  309.                                             if(day==30)//若满29后将置一
  310.                                                 day=1;
  311.                                          }
  312.                                          if(year%4!=0&&month==2)
  313.                                         {
  314.                                             if(day==29)//若满28后将置一
  315.                                                 day=1;
  316.                                          }
  317.                                          if(month!=2&&month!=4&&month!=6&&month!=9&&month!=11)
  318.                                          {
  319.                                             if(day==32)//若满31后将置一
  320.                                                 day=1;
  321.                                          }
  322.                                          if(month==4||month==6||month==9||month==11)
  323.                                          {         
  324.                                                 if(day==31)//若满30后将置一
  325.                                                 day=1;
  326.                                          }
  327.                                         write_ymd(9,day);;//每调节一次送液晶显示一下
  328.                                         write_com(0x80+9);//显示位置重新回到调节处
  329.                                 }
  330.                                 if(s1num==7)//若功能键第四次按下
  331.                                 {
  332.                                         week++;//则调整星期加1
  333.                                         if(week==8)//若满8后将置一
  334.                                                 week=1;
  335.                                         write_week(week);//每调节一次送液晶显示一下
  336.                                         write_com(0x80+12);//显示位置重新回到调节处
  337.                                 }
  338.                                 if(s1num==1)//若功能键第七次按下
  339.                                 {
  340.                                         miao++; //则调整秒加1
  341.                                         if(miao==60)//若满60后将清零
  342.                                                 miao=0;
  343.                                         write_sfm(8,miao);//每调节一次送液晶显示一下
  344.                                         write_com(0x80+0x40+8);//显示位置重新回到调节处
  345.                                 }
  346.                                 if(s1num==2)//若功能键第二次按下
  347.                                 {
  348.                                         fen++;//则调整分钟加1
  349.                                         if(fen==60)//若满60后将清零
  350.                                                 fen=0;
  351.                                         write_sfm(5,fen);//每调节一次送液晶显示一下
  352.                                         write_com(0x80+0x40+5);//显示位置重新回到调节处
  353.                                 }
  354.                                 if(s1num==3)//若功能键第五次按下
  355.                                 {                                       
  356.                                         shi++;
  357.                                         if(shi==24)//若满24后将清零
  358.                       {
  359.                                            shi=0;
  360.                                         }
  361.                                            if(s5num==0)
  362.                                            {                                                                                       
  363.                                               write_sfm(2,shi);;//每调节一次送液晶显示一下
  364.                                               write_com(0x80+0x40+2);//显示位置重新回到调节处
  365.                                            }                                          
  366.                                            if(s5num==1)
  367.                                            {
  368.                                                      zhuanhuan();
  369.                                               _shi();
  370.                                               write_sfm(2,pshi);;//每调节一次送液晶显示一下
  371.                                               write_com(0x80+0x40+2);//显示位置重新回到调节处
  372.                                        }                                       
  373.                               }
  374.                         }
  375.                 }
  376.         }
  377.                 if(s3==0)
  378.                 {
  379.                         delay(5);
  380.                         if(s3==0)//确认减小键被按下
  381.                         {
  382.                                 while(!s3);//按键释放
  383.                                 if(s1num==4)//若功能键第一次按下
  384.                                 {
  385.                                         year--;//则调整秒减1
  386.                                         if(year==-1)//若减到负数则将其重新设置为99
  387.                                                 year=99;
  388.                                         write_ymd(3,year);//每调节一次送液晶显示一下
  389.                                         write_com(0x80+3);//显示位置重新回到调节处
  390.                                 }
  391.                                 if(s1num==5)//若功能键第二次按下
  392.                                 {
  393.                                         month--;//则调整分钟减1
  394.                                         if(month==0)//若减到负数则将其重新设置为59
  395.                                                 month=12;
  396.                                         write_ymd(6,month);//每调节一次送液晶显示一下
  397.                                         write_com(0x80+6);//显示位置重新回到调节处
  398.                                 }
  399.                                 if(s1num==6)//若功能键第二次按下
  400.                                 {
  401.                                         day--;//则调整日加1
  402.                                         if(year%4==0&&month==2)
  403.                                         {
  404.                                             if(day==0)//若满29后将置一
  405.                                                 day=29;
  406.                                          }
  407.                                          if(year%4!=0&&month==2)
  408.                                         {
  409.                                             if(day==0)//若满28后将置一
  410.                                                 day=28;
  411.                                          }
  412.                                          if(month!=2&&month!=4&&month!=6&&month!=9&&month!=11)
  413.                                          {
  414.                                             if(day==0)//若满31后将置一
  415.                                                 day=31;
  416.                                          }
  417.                                          if(month==4||month==6||month==9||month==11)
  418.                                          {         
  419.                                                 if(day==0)//若满30后将置一
  420.                                                 day=30;
  421.                                          }
  422.                                         write_ymd(9,day);;//每调节一次送液晶显示一下
  423.                                         write_com(0x80+9);//显示位置重新回到调节处
  424.                                 }
  425.                                 if(s1num==7)//若功能键第二次按下
  426.                                 {
  427.                                         week--;//则调整小时减1
  428.                                         if(week==0)//若减到负数则将其重新设置为23
  429.                                                 week=7;
  430.                                         write_week(week);//每调节一次送液晶显示一下
  431.                                         write_com(0x80+12);//显示位置重新回到调节处
  432.                                 }
  433.                                 if(s1num==1)//若功能键第一次按下
  434.                                 {
  435.                                         miao--;//则调整秒减1
  436.                                         if(miao==-1)//若减到负数则将其重新设置为59
  437.                                                 miao=59;
  438.                                         write_sfm(8,miao);//每调节一次送液晶显示一下
  439.                                         write_com(0x80+0x40+8);//显示位置重新回到调节处
  440.                                 }
  441.                                 if(s1num==2)//若功能键第二次按下
  442.                                 {
  443.                                         fen--;//则调整分钟减1
  444.                                         if(fen==-1)//若减到负数则将其重新设置为59
  445.                                                 fen=59;
  446.                                         write_sfm(5,fen);//每调节一次送液晶显示一下
  447.                                         write_com(0x80+0x40+5);//显示位置重新回到调节处
  448.                                 }
  449.                                 if(s1num==3)//若功能键第二次按下
  450.                                 {
  451.                                         shi--;
  452.                                         if(shi==-1)//若满24后将清零
  453.                                            shi=23;
  454.                                            if(s5num==0)
  455.                                            {                                                                                    
  456.                                               write_sfm(2,shi);;//每调节一次送液晶显示一下
  457.                                               write_com(0x80+0x40+2);//显示位置重新回到调节处                                                     
  458.                                            }
  459.                                            if(s5num==1)
  460.                                            {                                          
  461.                               zhuanhuan();
  462.                                               _shi();
  463.                                               write_sfm(2,pshi);;//每调节一次送液晶显示一下
  464.                                               write_com(0x80+0x40+2);//显示位置重新回到调节处
  465.                                        }                                       
  466.                              }
  467.                 }
  468.         }
  469.         if(s1num==0)
  470.         {
  471.           if(s5==0)        
  472.           {
  473.                         delay(5);
  474.                         if(s5==0)//确认功能键被按下
  475.                         {        
  476.                                         s5num++;//功能键按下次数记录
  477.                                 while(!s5);//释放确认                        
  478.                                 if(s5num==1)//第一次被按下时
  479.                                 {
  480.                                                 zhuanhuan();
  481.                                         _shi();
  482.                                         write_sfm(2,pshi);
  483.                                 }                        
  484.                                 if(s5num==2)//第二次按下
  485.                                 {
  486.                                         s5num=0;//记录按键数清零
  487.                                         write_com(0x80+0x40+0);
  488.                                         write_date(' ');
  489.                                         //write_date(' ');
  490.                                         write_sfm(2,shi);
  491.                                 }               
  492.                         }
  493.     }
  494.                
  495. /////S6_beep_text//////////////
  496.                 if(s6==0)        
  497.           {
  498.                         delay(5);
  499.                         if(s6==0)//确认功能键被按下
  500.                         {        
  501.                                         s6num++;//功能键按下次数记录
  502.                                 while(!s6);//释放确认                        
  503.                                 if(s6num==1)//第一次被按下时
  504.                                 {
  505.                                                 s6bit=1;
  506.                                         write_com(0x80+0x40+1);
  507.                                         write_date(0xa1);
  508.                                 }                        
  509.                                 if(s6num==2)//第二次按下
  510.                                 {
  511.                                         s6num=0;//记录按键数清零
  512.                                         s6bit=0;
  513.                                         write_com(0x80+0x40+1);
  514.                                         write_date(' ');
  515.                                 }               
  516.                         }
  517.     }
  518.                
  519.         
  520.                
  521.         }   
  522. }


  523. //////////////////定时器0中断服务程序///////////////////////////

  524. void timer0() interrupt 1
  525. {
  526.         TH0=(65536-50000)/256;//再次装定时器初值
  527.         TL0=(65536-50000)%256;
  528.         count++;                //中断次数累加
  529.         if(count==20) //20次50毫秒为1秒
  530.         {
  531.                 count=0;
  532.                 miao++;
  533.                 if(miao==60)//秒加到60则进位分钟
  534.                 {
  535.                         miao=0;//同时秒数清零
  536.                         fen++;
  537.                         if(fen==60)//分钟加到60则进位小时
  538.                         {
  539.                                 fen=0;//同时分钟数清零
  540.                                 shi++;                                
  541.                                 if(shi==24)//小时加到24则小时清零
  542.                                 {
  543.                                         shi=0;
  544.                                         week++;
  545.                                            if(week==8)
  546.                                            {
  547.                                                week=1;
  548.                                            }
  549.                                            write_week(week);//星期若变化则重新写入
  550.                                         day++;
  551.                                            if(year%4==0&&month==2)//判断是否为闰年的2月
  552.                                            {
  553.                                               if(day==30)
  554.                                                   {
  555.                                                      writeym();                                                                                                                                                         
  556.                                                   }
  557.                                                   write_ymd(9,day);//日若变化则重新写入
  558.                                            }
  559.                                            if(year%4!=0&&month==2)//判断是否为平年的2月
  560.                                            {
  561.                                               if(day==29)
  562.                                                   {
  563.                                                      writeym();                                                                                                  
  564.                                                   }
  565.                                                   write_ymd(9,day);//日若变化则重新写入
  566.                                            }
  567.                                            if(month!=2&&month!=4&&month!=6&&month!=9&&month!=11)
  568.                                            {
  569.                                               if(day==32)
  570.                                                   {
  571.                                                      writeym();                                                                                                  
  572.                                                   }
  573.                                                   write_ymd(9,day);//日若变化则重新写入
  574.                                            }
  575.                                            if(month==4||month==6||month==9||month==11)
  576.                                            {
  577.                                               if(day==31)
  578.                                                   {
  579.                                                      writeym();                                                                                                  
  580.                                                   }
  581.                                                   write_ymd(9,day);//日若变化则重新写入
  582.                                            }
  583.                                 }
  584.                                 if(s5num==1)
  585.                                   {
  586.                                      zhuanhuan();
  587.                                          _shi();                                 
  588.                                      write_sfm(2,pshi);//12小时制小时若变化则重新写入
  589.                                   }
  590.                                 else write_sfm(2,shi);//24小时制小时若变化则重新写入                                
  591.                         }
  592.                         write_sfm(5,fen);//分钟若变化则重新写入
  593.                 }
  594.                 read_temp();//读取温度
  595.     ds1820disp();//温度显示
  596.    
  597.                 write_sfm(8,miao);//秒若变化则重新写入        
  598.                
  599.         ////////分号":"闪烁////////
  600.                 t=miao%2;
  601.                 if(t==0)
  602.                 {write_com(0x80+0x40+7);
  603.                 write_date(' ');}//显示为空白
  604.                 else{write_com(0x80+0x40+7);
  605.                 write_date(':');}
  606.                
  607.         }        
  608. }


  609. /*****18B20延时1微秒 *****/
  610. void delay_18B20(unsigned int i){
  611. while(i--);
  612. }
  613. /*****ds1820复位*****/
  614. void ds1820rst()
  615. {
  616. unsigned char x=0;
  617. DQ = 1;          //DQ复位
  618. delay_18B20(4);  //延时
  619. DQ = 0;          //DQ拉低
  620. delay_18B20(100); //精确延时大于480us
  621. DQ = 1;          //拉高
  622. delay_18B20(40);   
  623. }  
  624. /*读数据*/
  625. uchar ds1820rd()  
  626. {
  627. unsigned char i=0;
  628. unsigned char dat = 0;
  629. for (i=8;i>0;i--)
  630. {  DQ = 0; //给脉冲信号
  631. dat>>=1;
  632. DQ = 1; //给脉冲信号
  633. if(DQ)
  634. dat|=0x80;
  635. delay_18B20(10);
  636. }
  637. return(dat);
  638. }
  639. /*写数据*/
  640. void ds1820wr(uchar wdata)
  641. {unsigned char i=0;
  642. for (i=8; i>0; i--)
  643. { DQ = 0;
  644. DQ = wdata&0x01;
  645. delay_18B20(10);
  646. DQ = 1;
  647. wdata>>=1;
  648. }
  649. }

  650. read_temp()/*读取温度值并转换*/
  651. {uchar a,b;
  652. ds1820rst();   
  653. ds1820wr(0xcc);//*跳过读序列号*/
  654. ds1820wr(0x44);//*启动温度转换*/

  655. ds1820rst();   
  656. ds1820wr(0xcc);//*跳过读序列号*/
  657. ds1820wr(0xbe);//*读取温度*/
  658. a=ds1820rd();
  659. b=ds1820rd();
  660. value=b;
  661. value<<=8;
  662. value=value|a;
  663. if(value<0x0fff)
  664. flag=0;
  665. else
  666. {value=~value+1;
  667. flag=1;
  668. }
  669. value=value*(0.625);//温度值扩大10倍,精确到1位小数
  670. return(value);
  671. }


  672. /****************温度值显示*****************/
  673. void ds1820disp()
  674. {
  675. uchar flagdat;
  676. disdata[0]=value/1000+0x30;//百位数;加0x30使其与字库中数字字符对应
  677. disdata[1]=value%1000/100+0x30;//十位数
  678. disdata[2]=value%100/10+0x30;//个位数
  679. disdata[3]=value%10+0x30;//小数位
  680. if(flag==0)
  681. flagdat=0x20;//正温度不显示符号;0x20在字库中对应字符为"空"
  682. else
  683. flagdat=0x2d;//负温度显示负号:-
  684. if(disdata[0]==0x30)
  685. {
  686.         disdata[0]=0x20;//如果百位为0,不显示
  687.   if(disdata[1]==0x30)
  688.   {disdata[1]=0x20;//如果百位为0,十位为0也不显示
  689.    }
  690. }
  691. write_com(0x80+0x40+10);
  692. write_date(flagdat);//显示符号位
  693. write_com(0x80+0x40+11);
  694. write_date(disdata[0]);//显示百位
  695. write_com(0x80+0x40+12);
  696. write_date(disdata[1]);//显示十位   
  697. write_com(0x80+0x40+13);
  698. write_date(disdata[2]);//显示个位   
  699. write_com(0x80+0x40+14);
  700. write_date(0x2e);//显示小数点   
  701. write_com(0x80+0x40+15);
  702. write_date(disdata[3]);//显示小数位

  703. }


  704. /********************主函数*************************/


  705. void main()
  706. {
  707.         init();//首先初始化各数据               
  708.         while(1)//进入主程序大循环
  709.         {
  710.                
  711.                 keyscan();//不停的检测按键是否被按下
  712.                 if(s1num!=0)
  713.                    led=0;
  714.                 else            
  715.                    led=miao%2;
  716.                
  717.                 if((s6bit==1)&&(fen==0)&&(miao==0)&&(s1num==0))        
  718.                 {
  719.                  di();                 
  720.                  }                                

  721.          }
  722.         
  723.          
  724.          
  725. }
复制代码


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

本版积分规则

QQ|手机版|小黑屋|ELEOK |网站地图

GMT+8, 2024-11-22 20:51

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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