找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1640|回复: 1
打印 上一主题 下一主题
收起左侧

哪位大神可以教教我该如何接线

[复制链接]
跳转到指定楼层
楼主
ID:262337 发表于 2017-12-16 13:42 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
  1. #include < reg52.h >
  2. #include < intrins.h >
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit LEDB=P1^0; //---LED蓝灯
  6. sbit LEDR=P1^1;  //LED红灯
  7. sbit LEDG=P1^2; //LED绿色
  8. sbit LEDC=P1^3;//白的灯泡
  9. bit ledjc=0;//led检测 ,
  10. sbit k1=P1^4;  //---按键1
  11. sbit k2=P1^5;  //---按键2
  12. sbit k3=P1^6;  //---按键3
  13. sbit stop=P1^7;  //---按键4
  14. sbit DQ1 = P2^0;    //温度显示
  15. sbit E=P2^7;        //1602使能引脚
  16. sbit RW=P2^6;       //1602读写引脚  
  17. sbit RS=P2^5;       //1602数据/命令选择引脚
  18. ucharrcount,bCount,yCount,rZKB,bZKB,yZKB,temp;
  19. uchar TempBuffer[5],temp_value,play,wendu;
  20. uchar ge,shi,bai,num,wendu,play,mode;
  21. uint PWM_LOW=0;//定义周期并赋值
  22. uint bCYCLE=900,rCYCLE=700,gCYCLE=600;
  23. void inti();
  24. void keyscan();
  25. void display();
  26. void display1();
  27. void display2();
  28. void fuction();
  29. void delayms(uint z);
  30. void Delay(unsigned int t); //函数声明
  31. void show_temperture();
  32. uchar key();
  33. void Delay(uint t);
  34. /********************************************************************
  35. * 名称 :delay()
  36. * 功能 : 延时,延时时间大概为5US。
  37. * 输入 : 无
  38. * 输出 : 无
  39. ***********************************************************************/
  40. void delay()
  41. {
  42.     _nop_();
  43.     _nop_();
  44.     _nop_();
  45.     _nop_();
  46.     _nop_();
  47. }     
  48. void delayms(uint z)
  49. {
  50. uint x,y;
  51. for(x=z;x>0;x--)
  52. for(y=110;y>0;y--);
  53. }
  54. /********************************************************************
  55. * 名称 : bitBusy(void)
  56. * 功能 : 这个是一个读状态函数,读出函数是否处在忙状态
  57. * 输入 : 输入的命令值
  58. * 输出 : 无
  59. ***********************************************************************/
  60. bit Busy(void)
  61. {
  62.     bitbusy_flag = 0;
  63.     RS= 0;
  64.     RW= 1;
  65.     E= 1;
  66.     delay();
  67.     busy_flag= (bit)(P0 & 0x80);
  68.     E= 0;
  69.     returnbusy_flag;
  70. }
  71. /********************************************************************
  72. * 名称 :wcmd(uchar del)
  73. * 功能 : 1602命令函数
  74. * 输入 : 输入的命令值
  75. * 输出 : 无
  76. ***********************************************************************/
  77. void wcmd(uchar del)
  78. {
  79.     while(Busy());
  80.     RS= 0;
  81.     RW= 0;
  82.     E= 0;
  83.     delay();
  84.     P0= del;
  85.     delay();
  86.     E= 1;
  87.     delay();
  88.     E= 0;
  89. }
  90. /********************************************************************
  91. * 名称 :wdata(uchar del)
  92. * 功能 : 1602写数据函数
  93. * 输入 : 需要写入1602的数据
  94. * 输出 : 无
  95. ***********************************************************************/
  96. void wdata(uchar del)
  97. { while(Busy());
  98.     RS= 1;
  99.     RW= 0;
  100.     E= 0;
  101.     delay();
  102.     P0= del;
  103.    delay();
  104.     E= 1;
  105.     delay();
  106.     E= 0;
  107. }
  108. /********************************************************************
  109. * 名称 :L1602_init()
  110. * 功能 : 1602初始化,请参考1602的资料
  111. * 输入 : 无
  112. * 输出 : 无
  113. ***********************************************************************/
  114. void L1602_init(void)
  115. {
  116.     wcmd(0x38);
  117.     delay();
  118.     wcmd(0x38);
  119.     delay();
  120.     wcmd(0x38);
  121.     delay();
  122.     wcmd(0x38);
  123.     delay();
  124.     wcmd(0x0c);
  125.     wcmd(0x06);
  126.     delay();
  127.     wcmd(0x01);
  128. }
  129. /********************************************************************
  130. * 名称 :L1602_char(uchar hang,uchar lie,char sign)
  131. * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符显示"b" ,调用该函数如下
  132.          L1602_char(1,5,'b')
  133. * 输入 : 行,列,需要输入1602的数据
  134. * 输出 : 无
  135. ***********************************************************************/
  136. void L1602_char(uchar hang,ucharlie,uchar sign)
  137. {  
  138.    uchar a;
  139.     if(hang== 1) a = 0x80;
  140.     if(hang== 2) a = 0xc0;
  141.     a= a + lie - 1;
  142.     wcmd(a);
  143.     wdata(0x30+sign);
  144. }
  145. /********************************************************************
  146. * 名称 :L1602_string(uchar hang,uchar lie,uchar *p)
  147. * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下
  148.          L1602_string(1,5,"ab cd ef;")
  149. * 输入 : 行,列,需要输入1602的数据
  150. * 输出 : 无
  151. ***********************************************************************/
  152. void L1602_string(uchar hang,ucharlie,uchar *p)
  153. {
  154.     uchara,b=0;
  155.     if(hang== 1) a = 0x80;
  156.     if(hang== 2) a = 0xc0;
  157.     a= a + lie - 1;
  158.     while(1)
  159.     {
  160.         wcmd(a++);
  161.         b++;
  162.         if((*p == '\0')||(b==16)) break;
  163.         wdata(*p);
  164.         p++;
  165.     }
  166. }
  167. /**********************************************************/
  168. // 定时器 0中断服务程序.
  169. /*********************************************************/
  170. void timer0() interrupt 1  
  171. {  
  172.    TH0=(65536-10)/256;//装入初值,定时50ms;
  173.    TL0=(65536-10)%256;
  174.     rcount++;
  175.     bCount++;
  176.     yCount++;
  177.    if(rcount>599) rcount=0;
  178.     if(bCount>599)bCount=0;
  179.     if(yCount>599)yCount=0;
  180. if (rcount>=rZKB)
  181. {LEDG=1;}
  182. else
  183. {LEDG=0;}
  184. if (yCount>=yZKB)
  185. {LEDR=1;}
  186. else
  187. {LEDR=0;}
  188. if (bCount>=bZKB)
  189. {LEDB=1;}
  190. else
  191. {LEDB=0;}
  192. }
  193. void w1()
  194. {   rZKB++;
  195.          if(rZKB>=600&&rZKB<600)
  196.        rZKB=599;
  197.        if(rZKB>=600)   
  198.        rZKB = 0;
  199.         //num=0;
  200.         }
  201. void w2()
  202. {
  203.    bZKB ++;
  204.          if(bZKB>=600&&bZKB<600)
  205.        bZKB=599;
  206.        if(bZKB>=600)   
  207.        bZKB = 0;
  208.         //num=0;
  209. }
  210. void w3()
  211. {  delay();
  212.        yZKB ++;
  213.          if(yZKB>=600&&yZKB<600)
  214.        yZKB=599;
  215.        if(yZKB>=600)   
  216.        yZKB = 0;
  217.         //num=0;
  218. }
  219.           //启动输出
  220. void w4()
  221. {
  222.      if((rZKB<=600)&&(0==ledjc))
  223.      {
  224.        rZKB+=8;
  225.        if(rZKB>600)   
  226.        {
  227.        ledjc=1;
  228.        rZKB=600;
  229.        }
  230.        }
  231.        if((rZKB>=0)&&(1==ledjc))
  232.      {
  233.        rZKB-=8;
  234.        if(rZKB<0)     
  235.        {
  236.        ledjc=0;
  237.        rZKB=0;
  238.        }
  239.         num=0;
  240. }
  241. }
  242. void w5()
  243. {
  244.    bZKB +=8;
  245.          if(bZKB>=600&&bZKB<600)
  246.        bZKB=599;
  247.        if(bZKB>=600)   
  248.        bZKB = 0;
  249.         num=0;
  250. }
  251.   void w6()
  252. {        
  253.         //delay();
  254.           yZKB +=8;
  255.          if(yZKB>=600&&yZKB<600)
  256.        yZKB=599;
  257.        if(yZKB>=600)   
  258.        yZKB = 0;
  259.         num=0;
  260. }
  261. /*********************************************************/
  262. // 定时器初始化
  263. /*********************************************************/
  264. void inti()
  265.   {
  266.    TMOD=0x1;//T0方式1工作
  267.    IE=0x82;//EA=1;允许所有中断,ET0==1;允许T0中断
  268.     TH0=(65536-8)/256;//装入初值,定时50ms;
  269.    TL0=(65536-8)%256;
  270.    TR0=1;//启动定时器
  271.   }
  272. /*******************************************************
  273. //LCD1602占空比显示程序
  274. *******************************************************/
  275. void display()
  276. {
  277.     L1602_string(1,1,"B");
  278.      bai=(uchar)rZKB/100;
  279.      shi=(uchar)rZKB%100/10;
  280.        ge=(uchar)rZKB%10;
  281.         delay();
  282.        L1602_char(1,2,bai);
  283.         L1602_char(1,3,shi);
  284.         L1602_string(1,4,".");
  285.         L1602_char(1,5,ge);
  286.        L1602_string(1,6,"%");
  287.     }
  288. void display1()
  289. {
  290.    L1602_string(1,8,"R");
  291.      bai=(uchar)bZKB/100;
  292.      shi=(uchar)bZKB%100/10;
  293.        ge=(uchar)bZKB%10;
  294.         delay();
  295.        L1602_char(1,9,bai);
  296.         L1602_char(1,10,shi);
  297.         L1602_string(1,11,".");
  298.         L1602_char(1,12,ge);
  299.         L1602_string(1,13,"%");  
  300. }
  301. void display2()
  302. {
  303.   
  304.         L1602_string(2,1,"G");
  305.         bai=(uchar)yZKB/100;
  306.         shi=(uchar)yZKB%100/10;
  307.        ge=(uchar)yZKB%10;
  308.         delay();
  309.        L1602_char(2,2,bai);
  310.         L1602_char(2,3,shi);
  311.         L1602_string(2,4,".");
  312.         L1602_char(2,5,ge);
  313.        L1602_string(2,6,"%");
  314.         }
  315. /*------------------------------------------------
  316. 延时函数,含有输入参数 unsigned int t,无返回值
  317. unsigned int 是定义无符号整形变量,其值的范围是
  318. 0~65535
  319. ------------------------------------------------*/
  320. void Delay(uint t)
  321. {
  322. while(--t);
  323. }
  324. /*------------------------------------------------
  325.                     自动播放
  326. ------------------------------------------------*/
  327. void display3 ()
  328. {
  329. while (1)         //主循环
  330. {
  331.   show_temperture();
  332.      LEDB=1;
  333. Delay(60000);        //特意加延时,可以看到熄灭的过程
  334. for(PWM_LOW=1;PWM_LOW<bCYCLE;PWM_LOW++)
  335. {//PWM_LOW表示低
  336. //电平时间,这个循环中低电平时长从1累加到CYCLE(周期)的值,即600次
  337.        LEDB=0;        //点亮LED  
  338.        Delay(PWM_LOW);//延时长度,600次循环中从1加至599
  339.        LEDB=1;        //熄灭LED
  340.         Delay(bCYCLE-PWM_LOW);//延时长度,600次循环中从599减至1      
  341.   }
  342. LEDB=0;         
  343. for(PWM_LOW=bCYCLE-1;PWM_LOW>0;PWM_LOW--)
  344. {//与逐渐变亮相反的过程
  345.         LEDB=0;
  346.        Delay(PWM_LOW);
  347.        LEDB=1;
  348.         Delay(bCYCLE-PWM_LOW);
  349.                  }
  350. /********************************************
  351. //红灯
  352. *****************************************/
  353.     LEDR=1;
  354. Delay(60000);        //特意加延时,可以看到熄灭的过程
  355.   for(PWM_LOW=1;PWM_LOW<rCYCLE;PWM_LOW++)
  356. {//PWM_LOW表示低
  357. //电平时间,这个循环中低电平时长从1累加到CYCLE(周期)的值,即600次
  358.         LEDR=0;        //点亮LED  
  359.        Delay(PWM_LOW);//延时长度,600次循环中从1加至599
  360.        LEDR=1;        //熄灭LED
  361.         Delay(rCYCLE-PWM_LOW);//延时长度,600次循环中从599减至1     
  362.   }
  363.    LEDR=0;
  364. for(PWM_LOW=rCYCLE-1;PWM_LOW>0;PWM_LOW--)
  365. {//与逐渐变亮相反的过程
  366.         LEDR=0;
  367.        Delay(PWM_LOW);
  368.        LEDR=1;
  369.         Delay(rCYCLE-PWM_LOW);
  370.         }
  371. /********************************************
  372. //绿灯灯
  373. *****************************************/
  374. LEDG=1;
  375. Delay(60000);        //特意加延时,可以看到熄灭的过程
  376. for(PWM_LOW=1;PWM_LOW<bCYCLE;PWM_LOW++)
  377. {//PWM_LOW表示低
  378. //电平时间,这个循环中低电平时长从1累加到CYCLE(周期)的值,即600次
  379.         LEDG=0;        //点亮LED  
  380.        Delay(PWM_LOW);//延时长度,600次循环中从1加至599
  381.        LEDG=1;        //熄灭LED
  382.         Delay(bCYCLE-PWM_LOW);//延时长度,600次循环中从599减至1
  383.   }
  384.   LEDB=0;
  385.   for(PWM_LOW=bCYCLE-1;PWM_LOW>0;PWM_LOW--)
  386. {//与逐渐变亮相反的过程
  387.         LEDG=0;
  388.        Delay(PWM_LOW);
  389.        LEDG=1;
  390.         Delay(bCYCLE-PWM_LOW);
  391.    }
  392.    if(stop==1);
  393.     break;                //主循环中添加其他需要一直工作的程序
  394. }
  395.     }
  396.      
  397. /*********************************************************/
  398. // 键盘扫描
  399. /*********************************************************/
  400. void keyscan()
  401. {  
  402.    inti();
  403.        if(k1==0)
  404.        w1();
  405.        if(k2==0)  
  406.        w2();
  407.         if(k3==0)
  408.         w3();
  409.         }         
  410. /****************************************************
  411. //矩阵键盘调用
  412. *****************************************************/
  413. uchar key()
  414. {
  415.     P3=0xfe;
  416.     temp=P3;
  417.     temp=temp&0xf0;
  418.     while(temp!=0xf0)
  419.     {
  420.         delayms(5);
  421.         temp=P3;
  422.         temp=temp&0xf0;
  423.         while(temp!=0xf0)
  424.         {   temp=P3;
  425.             switch(temp)
  426.             {
  427.                 case 0xee:num=1;
  428.                 break;
  429.                 case 0xde:num=2;
  430.                 break;
  431.                 case 0xbe:num=3;
  432.                 break;
  433.                 case 0x7e:num=4;
  434.                 break;
  435.                 }
  436.             while(temp!=0xf0)
  437.             {
  438.                 temp=P3;
  439.                 temp=temp&0xf0;
  440.                 }
  441.               }
  442.               }
  443.         P3=0xfd;
  444.     temp=P3;
  445.     temp=temp&0xf0;
  446.     while(temp!=0xf0)
  447.     {
  448.         delayms(5);
  449.         temp=P3;
  450.         temp=temp&0xf0;
  451.         while(temp!=0xf0)
  452.         {   temp=P3;
  453.             switch(temp)
  454.             {
  455.                 case 0xed:num=5;
  456.                 break;
  457.                 case 0xdd:num=6;
  458.                 break;
  459.                 case 0xbd:num=7;
  460.                 break;
  461.                 case 0x7d:num=8;
  462.                 break;
  463.                 }
  464.             while(temp!=0xf0)
  465.             {
  466.                 temp=P3;
  467.                 temp=temp&0xf0;
  468.                 }
  469.               }
  470.               }
  471.             P3=0xfb;
  472.     temp=P3;
  473.     temp=temp&0xf0;
  474.     while(temp!=0xf0)
  475.     {
  476.         delayms(5);
  477.         temp=P3;
  478.         temp=temp&0xf0;
  479.         while(temp!=0xf0)
  480.         {   temp=P3;
  481.             switch(temp)
  482.             {
  483.                 case 0xeb:num=9;
  484.                 break;
  485.                 case 0xdb:num=10;
  486.                 break;
  487.                 case 0xbb:num=11;
  488.                 break;
  489.                 case 0x7b:num=12;
  490.                 break;
  491.                 }
  492.             while(temp!=0xf0)
  493.             {
  494.                 temp=P3;
  495.                 temp=temp&0xf0;
  496.                 }
  497.               }
  498.               }
  499.          P3=0xf7;
  500.     temp=P3;
  501.     temp=temp&0xf0;
  502.     while(temp!=0xf0)
  503.     {
  504.         delayms(5);
  505.         temp=P3;
  506.         temp=temp&0xf0;
  507.         while(temp!=0xf0)
  508.         {   temp=P3;
  509.             switch(temp)
  510.             {
  511.                 case 0xe7:num=13;
  512.                 break;
  513.                 case 0xd7:num=14;
  514.                 break;
  515.                 case 0xb7:num=15;
  516.                 break;
  517.                 case 0x77:num=16;
  518.                 break;
  519.                 }
  520.             while(temp!=0xf0)
  521.             {
  522.                 temp=P3;
  523.                 temp=temp&0xf0;
  524.                 }
  525.               }
  526.               }
  527.         return num;
  528.         }
  529. /***********ds18b20子程序*************************/
  530. /***********ds18b20延迟子函数(晶振12MHz )*******/
  531. void delay_18B20(unsigned int i)
  532. {
  533.     while(i--);
  534. }
  535. /**********ds18b20初始化函数**********************/
  536. void Init_DS18B20(void)
  537. {
  538.      unsigned char x=0;
  539.      DQ1 = 1;          //DQ复位
  540.      delay_18B20(8);  //稍做延时
  541.      DQ1 = 0;         //单片机将DQ拉低
  542.      delay_18B20(80); //精确延时 大于 480us
  543.      DQ1 = 1;          //拉高总线
  544.      delay_18B20(14);
  545.      x=DQ1;            //稍做延时后 如果x=0则初始化成功 x=1则初始
  546.      delay_18B20(20);
  547. }
  548. /***********ds18b20读一个字节**************/
  549. unsigned char ReadOneChar(void)
  550. {
  551.     uchari=0;
  552.     uchardat = 0;
  553.     for(i=8;i>0;i--)
  554.      {
  555.           DQ1= 0; // 给脉冲信号
  556.          dat>>=1;
  557.           DQ1= 1; // 给脉冲信号
  558.          if(DQ1)
  559.          dat|=0x80;
  560.          delay_18B20(4);
  561.      }
  562.     return(dat);
  563. }
  564. /*************ds18b20写一个字节****************/
  565. void WriteOneChar(uchar dat)
  566. {
  567.     unsigned char i=0;
  568.     for (i=8; i>0; i--)
  569.     {
  570.         DQ1 =0;
  571.         DQ1= dat&0x01;
  572.     delay_18B20(5);
  573.         DQ1= 1;
  574.     dat>>=1;
  575. }
  576. }
  577. /**************读取ds18b20当前温度************/
  578. void ReadTemp(void)
  579. {   unsignedchar a=0;
  580.     unsignedchar b=0;
  581.     unsignedchar t=0;
  582.     Init_DS18B20();
  583.     WriteOneChar(0xCC);      // 跳过读序号列号的操作
  584.     WriteOneChar(0x44); // 启动温度转换
  585.     delay_18B20(100);       // this message is Very important
  586.     Init_DS18B20();
  587.     WriteOneChar(0xCC); //跳过读序号列号的操作
  588.     WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器)
  589.     delay_18B20(100);
  590.     a=ReadOneChar();     //读取温度值低位
  591.     b=ReadOneChar();        //读取温度值高位
  592.     temp_value=b<<4;
  593.     temp_value+=(a&0xf0)>>4;               
  594. }
  595. void temp_to_str()   //温度数据转换成液晶字符显示
  596. {
  597. TempBuffer[0]=temp_value/10+'0'; //十位
  598. TempBuffer[1]=temp_value%10+'0'; //个位
  599. TempBuffer[2]=0xdf;   //温度符号
  600. TempBuffer[3]='C';
  601. TempBuffer[4]='\0';
  602. }
  603. void show_temperture()   //液晶显示程序
  604. {
  605.   ReadTemp();                    //开启温度采集程序
  606. temp_to_str();            //温度数据转换成液晶字符
  607. L1602_string(2,7,"temp1:");
  608. L1602_string(2,13,TempBuffer);            //显示温度
  609. }
  610. voidTEM_INIT()
  611. {
  612.         Init_DS18B20( );      //DS18B20初始化
  613. }
  614. void fuction()
  615. {       if(key()==1)
  616.        w4();
  617.       if(key()==2)        
  618.        w5();
  619.     if(key()==3)   
  620.         w6();      
  621. }
  622. /*************************************************
  623.   //主函数
  624.     ***************************************************/
  625.     voidmain()
  626. {
  627.   //inti();
  628.    LEDC=0;
  629.   L1602_string(1,1,"Instructor ZHF");
  630.   L1602_string(2,1,"Produced by MZM");
  631.   delayms(500);
  632.   L1602_init();
  633.   TEM_INIT();
  634.   display3 ();
  635. while(1)
  636. {      //display3 ();
  637.      //keyscan ();
  638.          keyscan ();
  639.        fuction  ();
  640.         display ();
  641.         display1 ();
  642.     display2 ();
  643.         //display3 ();
  644.                      }
  645.             }
  646.   
  647.    
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:242623 发表于 2017-12-16 22:09 | 只看该作者
sbit LEDB=P1^0; //---LED蓝灯
sbit LEDR=P1^1;  //LED红灯
sbit LEDG=P1^2; //LED绿色
sbit LEDC=P1^3;//白的灯泡
bit ledjc=0;//led检测 ,
sbit k1=P1^4;  //---按键1
sbit k2=P1^5;  //---按键2
sbit k3=P1^6;  //---按键3
sbit stop=P1^7;  //---按键4
sbit DQ1 = P2^0;    //温度显示
sbit E=P2^7;        //1602使能引脚
sbit RW=P2^6;       //1602读写引脚  
sbit RS=P2^5;       //1602数据/命令选择引脚   定义了引脚呀
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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