找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2846|回复: 2
收起左侧

基于DS18B20设计的温度计(有时钟、警报、lcd1602模块)

[复制链接]
ID:193210 发表于 2017-7-27 20:04 | 显示全部楼层 |阅读模式
0.png

0.png

单片机源程序如下:
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char                        
  4. #define uint unsigned int  
  5. uchar i;
  6. sbit RS=P3^0;
  7. sbit RW=P3^1;
  8. sbit E=P3^2;//LCD的RS RW E三个端口的定义
  9. sbit BF=P2^7;
  10. sbit  d1=P1^0;
  11. sbit  d2=P1^1;//警报定义
  12. sbit key=P1^5;//总开关控制标志位
  13. sbit key1=P1^6;//加开关
  14. sbit key2=P1^7;//减开关
  15. uchar code t0[]="0000-00-00";
  16. uchar code t1[]="T:";
  17. uchar code t2[]="00:00:00";
  18. uchar code t3[]="Mon ";//清屏显示
  19. uchar code wendu[]="0123456789";//定义数字,以方便显示温度以及时间
  20. uchar code weeks[]="Mon Tue Wed Thu Fri Sat Sun ";//定义一到星期天
  21. sbit DQ = P3^7;//DQ的数据线输入输出口
  22. uchar Temp;
  23. void delay(uint z)
  24. {
  25.         uint x,y;
  26.         for(x=20;x>1;x--)
  27.                 for(y=z;y>1;y--);
  28. }//延迟函数
  29. bit BusyTest(void)//忙检测指令。对寄存器的操作,如果忙返回1,如果空闲返回0
  30.   {
  31.     bit result;
  32.           RS=0;      
  33.     RW=1;//RS=0;RW=1时可以读寄存器的状态
  34.     E=1;   //E=1才允许读写   
  35.     _nop_(); //空操作,主要作用类似于延迟
  36.     _nop_();
  37.     _nop_();
  38.     _nop_();   
  39.     result=BF; //将忙碌标志位赋值给result作为忙检测指令的返回值
  40.    E=0; //将E重新置为低电平        
  41.    return result;
  42.   }

  43. void write_com(uchar com)//写命令
  44. {
  45.         while(BusyTest()==1); //如果忙就等待  
  46.         RS=0;
  47.         RW=0;
  48.         P2=com;       
  49.         delay(5);
  50.         E=1;
  51.         delay(5);
  52.         E=0;
  53. }
  54. void write_date(uchar date)//写数据
  55. {
  56.         while(BusyTest()==1); //如果忙就等待  
  57.         RS=1;
  58.         RW=0;
  59.         P2=date;
  60.         delay(5);
  61.         E=1;
  62.         delay(5);
  63.         E=0;
  64. }
  65. void init_lcd()//初始化
  66. {
  67.         E=0;
  68.         RW=0;
  69.         write_com(0x38);//LCD初始化设置 (显示模式设置:16X2显示,8位数据接口)  
  70.         write_com(0x01);//清屏,将以前的显示清除
  71.         write_com(0x0c);//开显示。无光标,光标不闪烁
  72.         write_com(0x06);//让光标右移,字符不移动   
  73.         write_com(0x80);//初始化位置(第一行第一列)       
  74.         for(i=0;i<10;i++)
  75.                 {
  76.                         write_date(t0[i]);
  77.                         delay(0);//显示"0000-00-00";
  78.                 }       
  79.                 write_com(0x80+13);       
  80.   for(i=0;i<4;i++)
  81.                 {
  82.                         write_date(t3[i]);//显示"Mon "
  83.                         delay(0);
  84.                 }
  85.         write_com(0x80+0x40);
  86.         for(i=0;i<8;i++)
  87.                 {
  88.                         write_date(t2[i]);//显示"00:00:00"
  89.                         delay(0);
  90.                 }
  91.         write_com(0x80+0x40+10);
  92.         for(i=0;i<2;i++)
  93.                 {
  94.                         write_date(t1[i]);//显示"T:"
  95.                         delay(0);
  96.                 }
  97.                

  98. }


  99. void tmpDelay(int num)//做延迟用
  100. {
  101.         while(num--) ;
  102. }       
  103. void Init_DS18B20()//初始化设置

  104. {
  105.         unsigned char x=0;
  106.         DQ = 1; //先将数据线拉高         
  107.         tmpDelay(8);  
  108.         DQ = 0; //再将数据从高拉到低 。要求保持480~960us   
  109.         tmpDelay(80);//延迟略微在480~960us,以向DS18B20发出一持续的480~960us低电平复位脉冲   
  110.         DQ = 1;   //释放数据线,将数据线拉高  
  111.         tmpDelay(14);//延迟给硬件反应时间
  112. //        x=DQ; //让单片机检测是否输出了存在脉冲(DQ=0表示存在),可有可无     
  113.         tmpDelay(20);
  114. }
  115.   unsigned char ReadOneChar()//读一个字节
  116. {
  117.         unsigned char i=0;
  118.         unsigned char dat = 0;
  119.         for (i=8;i>0;i--)
  120.         {
  121.                 DQ = 0;
  122.                 dat>>=1;
  123.                 DQ = 1;
  124.                 if(DQ)
  125.                 dat|=0x80;
  126.                 tmpDelay(4);

  127.         }
  128.         return(dat);
  129. }
  130. void WriteOneChar(unsigned char dat)//写一个字节数据
  131. {
  132.         unsigned char i=0;
  133.         for (i=8; i>0; i--)
  134.         {
  135.                 DQ = 0;
  136.                 DQ = dat&0x01;
  137.                 tmpDelay(5);
  138.                 DQ = 1;
  139.                 dat>>=1;
  140.         }
  141. }

  142. unsigned int Readtemp()
  143. {
  144.         unsigned char a=0;
  145.         unsigned char b=0;
  146.         unsigned int t=0;
  147.         float tt=0;       
  148.         Init_DS18B20();//初始化

  149.         WriteOneChar(0xCC); //跳过ROM
  150.         WriteOneChar(0x44); //温度转换
  151.         Init_DS18B20();//初始化,每次执行都要初始化
  152.         WriteOneChar(0xCC); //跳过ROM
  153.         WriteOneChar(0xBE);//存暂存器
  154.         a=ReadOneChar();  //将低两位放在a中
  155.         b=ReadOneChar();  //将高两位放在b中                        
  156.         t=b;
  157.         t<<=8;
  158.         t=t|a;
  159.         tt=t*0.0625;  
  160.         t= tt*10+0.5;
  161.         return(t);
  162. }
  163. unsigned int num,num1;  

  164. void display()//动态显示
  165. {
  166.         unsigned int num,num1;  
  167.         unsigned int shi,ge,xiaoshu;
  168.   
  169.         num=Readtemp();
  170.         num1=num/10;
  171.        
  172. /*****温度高于100度或者低于10度时警报器响红灯亮*****/
  173.         if(num1>100)
  174.         {
  175.                 d1=0;d2=0;
  176.   }       
  177.   else if(num1<10)
  178.         {
  179.                 d1=0;d2=0;
  180.   }       
  181. else
  182. {
  183.         d1=1;d2=1;
  184. }       
  185. /*********************************************/
  186.         shi=num/100;//温度的十位
  187.         ge=num/10%10;//温度的个位
  188.         xiaoshu=num%10;//温度的小数位

  189.         write_com(0x80+0x40+12);//显示的位置
  190.         write_date(wendu[shi]);//显示十位

  191.         write_com(0x80+0x40+13);//显示的位置
  192.         write_date(wendu[ge]);//显示个位

  193.         write_com(0x80+0x40+14);//显示的位置
  194.         write_date(0x2e);//显示小数点

  195.         write_com(0x80+0x40+15);//显示的位置
  196.         write_date(wendu[xiaoshu]);//显示十位
  197. }
  198. unsigned char shis=23,fen=59,miao=50;//定义时分秒
  199. unsigned int nian=2017,yue=5,ri=24,xingqi=8,k=0;//定义年月日
  200. void LCD_time()//时间
  201. {
  202. /**********年月日*****************/
  203.           write_com(0x80);
  204.           write_date(wendu[nian/1000]);//千位
  205.           write_date(wendu[nian%1000/100]);//百位
  206.           write_date(wendu[nian%100/10]);//十位
  207.           write_date(wendu[nian%10]);//个位
  208.           write_com(0x80+5);
  209.           write_date(wendu[yue/10]);
  210.           write_date(wendu[yue%10]);
  211.            write_com(0x80+8);
  212.           write_date(wendu[ri/10]);
  213.           write_date(wendu[ri%10]);
  214. /***********星 期****************/
  215.           write_com(0x80+13);
  216.           for(k=0+xingqi;k<4+xingqi;k++)
  217.         {
  218.              write_date(weeks[k]);
  219.         }               
  220. /***********时分秒***************/
  221.                 write_com(0x80+0x40);
  222.           write_date(wendu[shis/10]);
  223.           write_date(wendu[shis%10]);
  224.           write_com(0x80+0x40+3);
  225.           write_date(wendu[fen/10]);
  226.           write_date(wendu[fen%10]);
  227.            write_com(0x80+0x40+6);
  228.           write_date(wendu[miao/10]);
  229.           write_date(wendu[miao%10]);
  230. }
  231. /*************************************
  232. 函数功能:秒钟走动时,时,分 年 月 日以及星期的换算
  233. **************************************/
  234. void zou()
  235. {
  236.                 if(fen==60)
  237.                 {
  238.                 fen=0;
  239.                 shis++;
  240.                 }
  241.                 if(shis==24)
  242.                 {
  243.                  shis=0;
  244.                  ri++;
  245.                  xingqi+=4;
  246.                  if(xingqi==28)
  247.                                 xingqi=0;
  248.                 }
  249.     if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12)
  250.                 {
  251.                   if(ri==32)
  252.                   {
  253.                   ri=1;
  254.                   yue++;
  255.                   }
  256.                 }       
  257.     else if(yue==2&&((nian%400==0)||(nian%4==0&&nian%100!=0)))
  258.                 {
  259.                         if(ri==30)
  260.                   {
  261.                   ri=1;
  262.                   yue++;
  263.                   }
  264.     }       
  265.                
  266.     else if(yue==4||yue==6||yue==9||yue==11)
  267.                 {
  268.                         if(ri==31)
  269.                   {
  270.                   ri=1;
  271.                   yue++;
  272.                   }
  273.     }       
  274.    else       
  275.          {
  276.      if(ri==29)
  277.                   {
  278.                   ri=1;
  279.                   yue++;
  280.                   }
  281.    }                 
  282.                 if(yue==13)
  283.                 {
  284.                 yue=1;
  285.                 nian++;
  286.                 }
  287. }
  288. /*******************************************************
  289. 函数功能:总开关控制调时间的标识为Temp,Temp为1时可调秒
  290. Temp为2时,调分依次到可调年后Temp重置为0,时间继续走
  291. *******************************************************/
  292. void keys()
  293. {
  294.         if(key==0)
  295.         {
  296.                 delay(10);
  297.                 if(key==0)
  298.                 {
  299.                         while(key==0)
  300.                           display();
  301.       TR0=0;
  302.                         Temp++;
  303.                         if(Temp==8)
  304.                         {       
  305.                                 Temp=0;
  306.                                 TR0=1;
  307.                         }
  308.     }
  309.   }
  310. }
  311. /*定义以下函数*/
  312. void mins(uchar);
  313. uchar key_button(uchar Times,Temp);
  314. uint key_nian(uint Times);
  315. void key_Temp(uchar Temp);
  316. uchar key_xingqi(uchar Times);
  317. uchar Y;
  318. void main()
  319. {
  320.         EA=1;
  321.         ET0=1;
  322.         TMOD=0X01;
  323.         TH0=(65536-50000)/256;
  324.         TL0=(65536-50000)%256;
  325.         TR0=1;//时钟的初始化
  326.         init_lcd();//初始化LCD
  327.         d1=1;d2=1;
  328.         while(1)
  329.         {

  330.           display();//温度显示
  331.                 zou();//判断时间之间的运算,实现秒钟走可以控制时分,年月日以及星期的换算
  332.                 key_Temp(Temp);//根据标识位置确定可以调节那个时间
  333.                 keys();//总开关
  334.                 LCD_time();//时间显示
  335.   }

  336. }

  337. void int0() interrupt 1  //定时器中断1
  338. {
  339.         unsigned char ms;
  340.         TH0=(65536-50000)/256;
  341.         TL0=(65536-50000)%256;
  342.         ms++;
  343.         if(ms==20)
  344.         {
  345.                 ms=0;
  346.                 miao++;
  347.                 if(miao==60)
  348.                 {
  349.                         miao=0;
  350.                         fen++;
  351.                 }
  352.   }
  353. }
  354. /********************************************************/
  355. void key_Temp(uchar Temp)//实现调节时钟时闪烁的效果,
  356.         {
  357.      switch(Temp)
  358.                                  {
  359.                                          case 1:
  360.                                               Y=5;
  361.                                                  while(Y--){   mins(Temp);      miao=key_button(miao,1);keys();}
  362.                                                     Y=5;
  363.                                                  while(Y--){  LCD_time();        miao=key_button(miao,1);keys();}
  364.                                            break;
  365.                                          case 2:
  366.                                               Y=5;
  367.                                                  while(Y--){   mins(Temp);     fen=key_button(fen,2);keys();}
  368.                                                     Y=5;
  369.                                                  while(Y--){ LCD_time();       fen=key_button(fen,2);keys();}
  370.                                            break;
  371.                                          case 3:
  372.                                               Y=5;
  373.                                                  while(Y--){  mins(Temp);      shis=key_button(shis,3);keys();}
  374.                                                     Y=5;
  375.                                                  while(Y--){ LCD_time();       shis=key_button(shis,3);keys();}
  376.                                          break;
  377.                                                  case 4:
  378.                                               Y=5;
  379.                                                  while(Y--){  mins(Temp);      xingqi=key_xingqi(xingqi);keys();}
  380.                                                     Y=5;
  381.                                                  while(Y--){  LCD_time();       xingqi=key_xingqi(xingqi);keys();}
  382.                                            break;
  383.                                                  case 5:
  384.                                               Y=5;
  385.                                                  while(Y--){  mins(Temp);      ri=key_button(ri,Temp);keys();}
  386.                                                     Y=5;
  387.                                                  while(Y--){  LCD_time();      ri=key_button(ri,Temp);keys();}
  388.                                         break;
  389.                                                  case 6:
  390.                                                           Y=5;
  391.                                                  while(Y--){  mins(Temp);      yue=key_button(yue,Temp);keys();}
  392.                                                     Y=5;
  393.                                                  while(Y--){  LCD_time();      yue=key_button(yue,Temp);keys();}
  394.                                                  break;
  395.                                                  case 7:
  396.                                                           Y=5;
  397.                                                  while(Y--){  mins(Temp);      nian=key_nian(nian);keys();}
  398.                                                     Y=5;
  399.                                                  while(Y--){      LCD_time();  nian=key_nian(nian);keys();}
  400.                                                  break;
  401.          }


  402.   }
  403. /********************************************************/
  404. uchar key_button(uchar Times,Temp)//月、日、时分秒
  405. {
  406.          if(key1==0)
  407.                  {
  408.                    delay(10);
  409.                          if(key1==0)
  410.                          {
  411.                                  while(key1==0)
  412.                                     LCD_time();  
  413.                                  Times++;
  414.                                  if(Temp==3)
  415.                                  {
  416.                                          if(Times==24)
  417.                                                   Times=0;
  418.          }
  419.                                  else if(Temp==1||Temp==2)
  420.                                  {
  421.                                          if(Times==60)
  422.                                                  Times=0;
  423.          }
  424.                                 else if(Temp==5)
  425.                                  {
  426.                                          if(Times==32)
  427.                                                  Times=0;
  428.          }
  429.                                  else if(Temp=6)
  430.                                  {
  431.                                          if(Times==13)
  432.                                                  Times=0;
  433.          }
  434.                                  
  435.                                  
  436.        }
  437.                           
  438.      }
  439.                  if(key2==0)
  440.                  {
  441.                    delay(10);
  442.                          if(key2==0)
  443.                          {
  444.                                  while(key2==0)
  445.                                    display();
  446.                                  Times--;
  447.                                  if(Temp==3)
  448.                                  {
  449.                                          if(Times==255)
  450.                                                  Times=23;
  451.          }
  452.                                  else if(Temp==1||Temp==2)
  453.                                  {
  454.                                          if(Times==255)
  455.                                                  Times=59;
  456.          }
  457.                                 else if(Temp==5)
  458.                                  {
  459.                                          if(Times==255)
  460.                                                  Times=31;
  461.          }
  462.                                  else if(Temp==6)
  463.                                  {
  464.                                          if(Times==255)
  465.                                                  Times=12;
  466.          }
  467.        }
  468.                  
  469.      }
  470.    return Times;
  471. }
  472. /********************************************************/
  473. uint key_nian(uint Times)//年的加减
  474. {
  475.          if(key1==0)
  476.                  {
  477.                    delay(10);
  478.                          if(key1==0)
  479.                          {
  480.                                  while(key1==0)
  481.                                    display();
  482.                                  Times++;
  483.        }
  484.                           
  485.      }
  486.                  if(key2==0)
  487.                  {
  488.                    delay(10);
  489.                          if(key2==0)
  490.                          {
  491.                                  while(key2==0)
  492.                                    display();
  493.                                      Times--;
  494.                                  if(Times==1980)
  495.                                            Times=1980;
  496.        }
  497.                           
  498.      }
  499.    return Times;
  500. }
  501. /********************************************************/
  502. uchar key_xingqi(uchar Times)//星期的加减
  503. {
  504.          if(key1==0)
  505.                  {
  506.                    delay(10);
  507.                          if(key1==0)
  508.                          {
  509.                                  while(key1==0)
  510.                                    display();
  511.                                  Times+=4;
  512.                                  if(Times==28)
  513.                                          Times=0;
  514.        }
  515.                           
  516.      }
  517.                  if(key2==0)
  518.                  {
  519.                    delay(10);
  520.                          if(key2==0)
  521.                          {
  522.                                  while(key2==0)
  523.                                    display();
  524.                                      Times-=4;
  525.                                  if(Times==-4)
  526.                                            Times=24;
  527.        }
  528.                           
  529.      }
  530.    return Times;
  531. }
  532. void mins(uchar Temp)//不显示shijian的动态显示
  533. {

  534. /**********年月日*****************/
  535.           write_com(0x80);
  536.          if(Temp==7)
  537.          {
  538.                  write_date(' ');
  539.                  write_date(' ');
  540.                  write_date(' ');
  541.                  write_date(' ');
  542.          }
  543.          else
  544.          {
  545.           write_date(wendu[nian/1000]);//千位
  546.           write_date(wendu[nian%1000/100]);//百位
  547.           write_date(wendu[nian%100/10]);//十位
  548.           write_date(wendu[nian%10]);//个位
  549.          }
  550.           write_com(0x80+5);
  551.          if(Temp==6)
  552.          {
  553.                  write_date(' ');
  554.                  write_date(' ');
  555.          }
  556.          else
  557.          {
  558.           write_date(wendu[yue/10]);
  559.           write_date(wendu[yue%10]);
  560. ……………………

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

所有资料51hei提供下载:
wenduji.zip (114.92 KB, 下载次数: 31)
回复

使用道具 举报

ID:222394 发表于 2017-7-28 10:30 | 显示全部楼层
我这个是1604显示温度,按键控制步进电机的程序

#include<reg51.h>
#include"lcd.h"
#include"temp.h"
#define uchar  unsigned char
#define uint unsigned int
typedef unsigned int u16;          //对数据类型进行声明定义
typedef unsigned char u8;
unsigned char keyval;
unsigned char ID;
uchar CNCHAR[6] = "摄氏度";
void LcdDisplay(int);
void UsartConfiguration();
  
sbit IN1=P1^0; /*第一个电机*/
sbit IN2=P1^1;        /*第一个电机*/
sbit IN3=P1^2;         /*第一个电机*/
sbit IN4=P1^3;         /*第一个电机*/
sbit IN5=P1^4;//高电位        使能口
sbit IN6=P1^5;//高电位        使能口
    uint j=100;
            uint g;

sbit k1=P3^6;         //定义P31口是k1
sbit k2=P3^5;        //按键
sbit k3=P1^7;        //按键
sbit k4=P1^6;        //按键
void delay(uint i);
//  void Go();
//  void zhong();
//  void fan();
//
void Go( )        //一档
{
                         
     IN1=1;IN2=0;IN3=0;IN4=0;
   delay(150);

   IN1=1;IN2=1;IN3=0;IN4=0;
   delay(150);
   IN1=0;IN2=1;IN3=0;IN4=0;
   delay(150);

IN1=0;IN2=1;IN3=1;IN4=0;
  delay(150);
   IN1=0;IN2=0;IN3=1;IN4=0;
   delay(150);

   IN1=0;IN2=0;IN3=1;IN4=1;
   delay(150);
   IN1=0;IN2=0;IN3=0;IN4=1;
   delay(150);
   
  IN1=1;IN2=0;IN3=0;IN4=1;
   delay(150);
  }
  void zhong(void)          //二档
{       
     IN1=1;IN2=0;IN3=0;IN4=0;
   delay(300);
  
   IN1=1;IN2=1;IN3=0;IN4=0;
   delay(300);
   IN1=0;IN2=1;IN3=0;IN4=0;
   delay(300);

IN1=0;IN2=1;IN3=1;IN4=0;
  delay(300);
   IN1=0;IN2=0;IN3=1;IN4=0;
   delay(300);

   IN1=0;IN2=0;IN3=1;IN4=1;
   delay(300);
   IN1=0;IN2=0;IN3=0;IN4=1;
   delay(300);
   
  IN1=1;IN2=0;IN3=0;IN4=1;
   delay(300);
  }
  void fan( )        //反转
{
      IN1=1;IN2=0;IN3=0;IN4=1;
   delay(150);

    IN1=0;IN2=0;IN3=0;IN4=1;
   delay(150);
   IN1=0;IN2=0;IN3=1;IN4=1;
   delay(150);

IN1=0;IN2=0;IN3=1;IN4=0;
  delay(150);
   IN1=0;IN2=1;IN3=1;IN4=0;
   delay(150);

   IN1=0;IN2=1;IN3=0;IN4=0;
   delay(150);
   IN1=1;IN2=1;IN3=0;IN4=0;
   delay(150);
   
  IN1=1;IN2=0;IN3=0;IN4=0;
   delay(150);
  }
  void LcdDisplay(int temp)          //lcd显示
{
   
          unsigned char i, datas[] = {0, 0, 0, 0, 0}; //定义数组
        float tp;  
        if(temp< 0)                                //当温度值为负数
          {
                  LcdWriteCom(0x80);                //写地址 80表示初始地址
                SBUF='-';//将接收到的数据放入到发送寄存器
                while(!TI);                                 //等待发送数据完成
                TI=0;                                                 //清除发送完成标志位
            LcdWriteData('-');                  //显示负
                //因为读取的温度是实际温度的补码,所以减1,再取反求出原码
                temp=temp-1;
                temp=~temp;
                tp=temp;
                temp=tp*0.0625*100+0.5;       
                //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
                //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
                //算由?.5,还是在小数点后面。

          }
        else
          {                       
                  LcdWriteCom(0x80);                //写地址 80表示初始地址
            LcdWriteData('+');                 //显示正
                SBUF='+';//将接收到的数据放入到发送寄存器
                while(!TI);                                 //等待发送数据完成
                TI=0;                                                 //清除发送完成标志位
                tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量
                //如果温度是正的那么,那么正数的原码就是补码它本身
                temp=tp*0.0625*100+0.5;       
                //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
                //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
                //算加上0.5,还是在小数点后面。
        }
        datas[0] = temp / 10000;
        datas[1] = temp % 10000 / 1000;
        datas[2] = temp % 1000 / 100;
        datas[3] = temp % 100 / 10;
        datas[4] = temp % 10;

        LcdWriteCom(0x82);                  //写地址 80表示初始地址
        LcdWriteData('0'+datas[0]); //百位
        SBUF = '0'+datas[0];//将接收到的数据放入到发送寄存器
        while (!TI);                                 //等待发送数据完成
        TI = 0;
       
        LcdWriteCom(0x83);                 //写地址 80表示初始地址
        LcdWriteData('0'+datas[1]); //十位
        SBUF = '0'+datas[1];//将接收到的数据放入到发送寄存器
        while (!TI);                                 //等待发送数据完成
        TI = 0;

        LcdWriteCom(0x84);                //写地址 80表示初始地址
        LcdWriteData('0'+datas[2]); //个位
        SBUF = '0'+datas[2];//将接收到的数据放入到发送寄存器
        while (!TI);                                 //等待发送数据完成
        TI = 0;

        LcdWriteCom(0x85);                //写地址 80表示初始地址
        LcdWriteData('.');                 //显示 ‘.’
        SBUF = '.';//将接收到的数据放入到发送寄存器
        while (!TI);                                 //等待发送数据完成
        TI = 0;

        LcdWriteCom(0x86);                 //写地址 80表示初始地址
        LcdWriteData('0'+datas[3]); //显示小数点  
        SBUF = '0'+datas[3];//将接收到的数据放入到发送寄存器
        while (!TI);                                 //等待发送数据完成
        TI = 0;

        LcdWriteCom(0x87);                 //写地址 80表示初始地址
        LcdWriteData('0'+datas[4]); //显示小数点
        SBUF = '0'+datas[4];//将接收到的数据放入到发送寄存器
        while (!TI);                                 //等待发送数据完成
        TI = 0;
        for(i=0; i<6; i++)
        {
                 SBUF = CNCHAR[i];//将接收到的数据放入到发送寄存器
                while (!TI);                                 //等待发送数据完成
                TI = 0;
        }

         
}
/*******************************************************************************
* 函 数 名         :UsartConfiguration()
* 函数功能                   :设置串口
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/

void UsartConfiguration()
{
        SCON=0X50;                        //设置为工作方式1
        TMOD=0X20;                        //设置计数器工作方式2
        PCON=0X80;                        //波特率加倍
        TH1=0XF3;                                //计数器初始值设置,注意波特率是4800的
        TL1=0XF3;
//        ES=1;                                                //打开接收中断
//        EA=1;                                                //打开总中断
        TR1=1;                                        //打开计数器
}

void wendu()
{
//         UsartConfiguration();
        LcdInit();                         //初始化LCD1602
        LcdWriteCom(0x88);        //写地址 80表示初始地址
        LcdWriteData('C');
//        while(1)
//        {
                LcdDisplay(Ds18b20ReadTemp());
//                Delay1ms(100);//1s钟刷一次
// }
}


/*******************************************************************************
* 函 数 名         : delay
* 函数功能                   : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{
        while(i--);       
}

/*******************************************************************************
* 函 数 名         : keypros
* 函数功能                   : 按键处理函数,判断按键K1是否按下
*******************************************************************************/
          void Time0_serve(void)interrupt 1 using 1
{
   
        TH0=(65536-200)/256;
    TL0=(65536-200)%256;

                          if(k1==0)
                     keyval=1;
                          if(k2==0)
                       keyval=2;
                            if(k3==0)
                         keyval=3;
                            if(k4==0)
                         keyval=4;
}
/*******************************************************************************
* 函 数 名       : main
* 函数功能                 : 主函数
* 输    入       : 无
* 输    出             : 无
*******************************************************************************/
void main()
{       IN5=1;
            IN6=1;
       

//
//    if(k1==0){g=1;}
//        if(k2==0){g=2;}
//        if(k3==0){g=3;}
//        if(k4==0){g=4;}
//         if(g==1){zhong();}
//         if(g==2){Go();}
//         if(g==3){fan();}
//         if(g==4){wendu();}
//}
    IN5=1;
        IN6=1;
          while(1)
        {
//          TMOD=0x01;
//        EA=1;
//        ET0=1;
//        TR0=1;
//        TH0=(65536-200)/256;
//        TL0=(65536-200)%256;
//        keyval=0;
//        ID=0;
        keyval = 0;
             while(1)
                {

                        if(k1==0)
                             keyval=1;
                        if(k2==0)
                         keyval=2;
                        if(k3==0)
                         keyval=3;
                         if(k4==0)
                         keyval=4;          
                    switch(keyval)
                        {         
                            case 1 :zhong();
                                        break;
                            case 2 :Go();
                                        break;
                            case 3 :fan();
                                        break;
                             case 4 :wendu();
                                           break;
                        }
                }
               
        }               
}
回复

使用道具 举报

ID:193210 发表于 2017-7-30 15:52 | 显示全部楼层
零度时空 发表于 2017-7-28 10:30
我这个是1604显示温度,按键控制步进电机的程序

#include

嗯  不错的
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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