找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机数字温度计,高低两路限温控制可在0~100范围内独立设计

[复制链接]
ID:353914 发表于 2018-6-19 09:58 | 显示全部楼层 |阅读模式
1.基本要求
(1)能数字显示被测温度,测量温度范围0~100
(2)分辨率不低于0.5度
(3)带有计时和时间显示功能
(4)有高低两路限温控制输出接口控制外部电路。实际制作时可以用发光二极管模拟现实
(5)高低两路限温控制可在0~100范围内独立设计
(6)当温度达高低两限控制点声光报警

单片机源程序如下:
  1. /*预处理命令*/
  2. #include<reg52.h>    //包含单片机寄存器的头文件
  3. #include<intrins.h> //包含_nop_()函数定义的头文件
  4. #define uchar unsigned char
  5. #define uint  unsigned int
  6. #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};

  7. sbit IRIN=P3^2;           //红外接收器数据线
  8. sbit sclk = P1^0;                        //时钟
  9. sbit dio = P1^1;
  10. sbit ce = P1^2;
  11. sbit wela = P2^7;
  12. sbit dula = P2^6;
  13. sbit beep=P2^3;

  14. //sbit mscl = P2^1;                                    // 24c02
  15. //sbit msda = P2^0;
  16. sbit msda=P2^0;                          //IO口定义
  17. sbit mscl=P2^1;
  18. sbit DS=P2^2;
  19. sbit DS1=P2^4;
  20. sbit led1=P3^0;
  21. sbit led2=P3^1;
  22. sbit led3=P3^3;
  23. sbit led4=P3^4;

  24. uint p;
  25. uint wendu=0,wendu1=0;
  26. uchar flag,h1,h2,m1,m2,h3,h4,m3,m4;

  27. uint htemp = 30;       //高温限
  28. uint ltemp = 5 ;        // 低温限
  29. uint htemp1 = 30;       //高温限
  30. uint ltemp1 = 5 ;        // 低温限
  31. bit hmodel ;                        // 高温设置
  32. bit lmodel ;            // 低温设置
  33. bit hmodel1 ;                        // 高温设置
  34. bit lmodel1 ;            // 低温设置
  35. unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
  36.                         0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
  37. unsigned char code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,                          //加点的数码管
  38.                              0x87,0xff,0xef};
  39. uchar IRCOM[7];
  40. uchar pin=0,pinjian;

  41. void dsreset(void);
  42. void tmpwritebyte(uchar dat);
  43. uint tmp();
  44. void dsreset1(void);
  45. void tmpwritebyte1(uchar dat);
  46. uint tmp1();

  47. void write_1302(uchar add,dat);
  48. uchar read_1302(uchar add);
  49. void display(uchar a,uchar b,uchar c,uchar d,uchar e,uchar f,uchar g,uchar h);
  50. void delay1ms();
  51. void delay(unsigned char x) ;
  52. void delayds(uint z);
  53. void delay1(int ms);
  54. void display1(uchar a,uchar b);

  55. void fanhui(); //7号
  56. void displayall();//2号
  57. void displayall1();//3号
  58. void huicha();//4号
  59. /*******************************************************************/

  60. /*24c02 初始化程序*/
  61. void delay_24c02()
  62. {
  63.     uchar i;
  64.     for(i=10;i--;i>0);
  65. }
  66. /*地址 A2A1A0 = 000*/
  67. /* 0x00 ,0x01 存放 第一路的高低温限
  68.    0x02,0x03    存放 第二路的高低温限
  69.    以后每两个相邻单元分别存放测试时间和温度值 (时间在前)*/
  70. void init_24c02()
  71. {
  72.   msda = 1;
  73.   delay_24c02();
  74.   mscl =  1;
  75.   delay_24c02();

  76. }
  77. /*24c02启动程序*/
  78. void start_24c02()
  79. {
  80.    msda = 1;
  81.    delay_24c02();
  82.    mscl = 1;
  83.    delay_24c02();
  84.    msda = 0;
  85.    delay_24c02();
  86. }
  87. /*24c02停止程序*/
  88. void stop_24c02()
  89. {
  90.    msda = 0;
  91.    delay_24c02();
  92.    mscl = 1;
  93.    delay_24c02();
  94.    msda = 1;
  95.     delay_24c02();
  96. }
  97. /*24c02的回应函数*/
  98. void respons()  //回应信号
  99. {
  100.         uchar i=0;
  101.         mscl=1;
  102.         delay_24c02();
  103.         while((msda==1)&&(i<250))i++;
  104.         mscl=0;
  105.         delay_24c02();
  106. }
  107. void writebyte(uchar date)// 写一个字节
  108. {
  109. uchar i,temp;
  110. temp=date;
  111. for(i=0;i<8;i++)
  112. {
  113.   temp=temp<<1;
  114.   mscl=0;
  115.   delay_24c02();
  116.   msda=CY;
  117.   delay_24c02();
  118.   mscl=1;
  119.   delay_24c02();
  120. }
  121. mscl=0;
  122. delay_24c02();
  123. msda=1;
  124. delay_24c02();
  125. }
  126. uchar readbyte()  //读一个字节
  127. {
  128. uchar i,j,k;
  129. mscl=0;
  130. delay_24c02();
  131. msda=1;
  132. for(i=0;i<8;i++)
  133. {
  134.   mscl=1;
  135.   delay_24c02();
  136.   if(msda==1)
  137.     j=1;
  138.   else
  139.     j=0;
  140.   k=(k<<1)|j;
  141.   mscl=0;
  142.   delay_24c02();
  143. }
  144. delay_24c02();
  145. return k;
  146. }
  147. //指定地址写一个字节数据
  148. void write_add(uchar address,uchar info)
  149. {
  150. start_24c02();
  151. writebyte(0xa0);
  152. respons();
  153. writebyte(address);
  154. respons();
  155. writebyte(info);
  156. respons();
  157. stop_24c02();
  158. }
  159. //指定地址读一个字节数据
  160. uchar read_add(uchar address)  
  161. {
  162. uchar dd;
  163. start_24c02();
  164. writebyte(0xa0);
  165. respons();
  166. writebyte(address);
  167. respons();
  168. start_24c02();
  169. writebyte(0xa1);
  170. respons();
  171. dd=readbyte();
  172. stop_24c02();
  173. return dd;
  174. }





  175. void main()
  176. {
  177.          unsigned int  a;
  178.          uchar A1,A2,A3;
  179.          uint  A2t;
  180.          uchar hour,minute,second;
  181.          uchar ho,min,h01,h02,m01,m02;
  182.          led1=0;led2=0;led3=0;led4=0;
  183.         IRIN=1;                    //I/O口初始化       
  184.         IE=0x81;                 //允许总中断中断,使能 INT0 外部中断
  185.         TCON=TCON|0x01;               //触发方式为脉冲负边沿触发
  186.        
  187.          while(1)
  188.          {
  189. //            write_1302(0x8e,0x00);
  190. //            write_1302(0xc0,0xfe);
  191. //            write_1302(0xc2,0xff);       
  192. //            write_1302(0x80,0x00);           //sec
  193. //            write_1302(0x82,0x00);           //min
  194. //            write_1302(0x84,0x16);            //hour
  195. //            write_1302(0x8e,0x80);       
  196.                
  197. //            for(a=100;a>0;a--)

  198.      if(hmodel==1)
  199.      {display1(htemp/10,htemp%10);
  200.           }
  201.          if(lmodel==1)
  202.          {display1(ltemp/10,ltemp%10);
  203.      }
  204.          
  205.          if(flag==1)
  206.           {
  207.             write_1302(0x8e,0x00);
  208.                 hour=read_1302(0x85);               
  209.                 minute=read_1302(0x83);               
  210.                 second=read_1302(0x81);
  211.                 write_1302(0x8e,0x80);       
  212.                 h1=hour/10;h2=hour%10;
  213.                 m1=minute/10;m2=minute%10;
  214.            
  215.                 TR0=0;                                                          
  216.            dsreset();                         //温度开始转换
  217.        delayds(1);
  218.        tmpwritebyte(0xcc);  // address all drivers on bus
  219.        tmpwritebyte(0x44);  //  initiates a single temperature conversion
  220.            for(a=10;a>0;a--)
  221.               {          
  222.             wendu=tmp();
  223.                 A1=wendu/100;
  224.         A2t=wendu%100;
  225.         A2=A2t/10;
  226.         A3=A2t%10;
  227.                 display(h1,h2,m1,m2,16,A1,A2,A3);

  228. //
  229. //            TMOD=0x01;                          //定时器工作在方式1
  230. //            ET0=1;
  231. //            EA=1;
  232. //            TH0=(65536-50000)/256; //对TH0 TL0赋值
  233. //            TL0=(65536-50000)%256; //使定时器0.05秒中断一次
  234. //             TR0=1;                                           //开始计时
  235. //
  236. //
  237. //              if(wendu>=htemp*10)
  238. //                     {
  239. //                        beep=0;
  240. //                        led1=0;
  241. //                   }
  242. //                if(wendu<=ltemp*10)
  243. //                   {
  244. //                        beep=0;
  245. //                        led2=0;
  246. //                    }
  247. //               
  248.             }
  249.                                   
  250.             TMOD=0x01;                          //定时器工作在方式1
  251.             ET0=1;
  252.             EA=1;
  253.             TH0=(65536-50000)/256; //对TH0 TL0赋值
  254.             TL0=(65536-50000)%256; //使定时器0.05秒中断一次
  255.              TR0=1;                                           //开始计时


  256.               if(wendu>=htemp*10)
  257.                      {
  258.                         beep=0;
  259.                         led1=0;
  260.                    }
  261.                 if(wendu<=ltemp*10)
  262.                    {
  263.                         beep=0;
  264.                         led2=0;
  265.                     }
  266.                
  267.                 }
  268.           
  269.            if(flag==2)       
  270.          {write_1302(0x8e,0x00);
  271.                 hour=read_1302(0x85);               
  272.                 minute=read_1302(0x83);               
  273.                 second=read_1302(0x81);
  274.                 write_1302(0x8e,0x80);       
  275.                 h3=hour/10;
  276.                 h4=hour%10;
  277.                 m3=minute/10;
  278.                 m4=minute%10;
  279.             TR0=0;                                                          
  280.            dsreset1();                         //温度开始转换
  281.        delayds(1);
  282.        tmpwritebyte1(0xcc);  // address all drivers on bus
  283.        tmpwritebyte1(0x44);  //  initiates a single temperature conversion
  284.            for(a=10;a>0;a--)
  285.             {          
  286.             wendu1=tmp1();
  287.                 A1=wendu1/100;
  288.         A2t=wendu1%100;
  289.         A2=A2t/10;
  290.         A3=A2t%10;
  291.                 display(h3,h4,m3,m4,16,A1,A2,A3);
  292. //              if(wendu1>=htemp1*10)
  293. //                   {
  294. //                        beep=0;
  295. //                        led3=0;
  296. //                }
  297. //                if(wendu1<=ltemp1*10)
  298. //                {
  299. //                        beep=0;
  300. //                        led4=0;
  301. //                }
  302.              }
  303.                 TR0=1;
  304.                         if(wendu1>=htemp1*10)
  305.                    {
  306.                         beep=0;
  307.                         led3=0;
  308.                 }
  309.                 if(wendu1<=ltemp1*10)
  310.                 {
  311.                         beep=0;
  312.                         led4=0;
  313.                 }
  314.           }
  315.           if(flag==3)
  316.           {
  317.             ho=read_add(pinjian-4);
  318.                 min=read_add(pinjian-3);
  319.                 h01=ho/10;h02=ho%10;
  320.                 m01=min/10;m02=min%10;
  321.                                                                                                          
  322.                 A2t=read_add(pinjian-2)*256+read_add(pinjian-1);
  323.                 A1=A2t/100;
  324.                 A2=A2t/10%10;
  325.                 A3=        A2t%10;                          
  326.                 display(h01,h02,m01,m02,16,A1,A2,A3);


  327.          }

  328.                                    
  329.   }
  330. }
  331. /**********************************************************/
  332. void IR_IN() interrupt 0 using 0
  333. {
  334.         unsigned char j,k,N=0;
  335.         unsigned char q=0;
  336.         EX0 = 0;   
  337.         delay(15);
  338.         if (IRIN==1)
  339.         {
  340.                 EX0 =1;
  341.                 return;
  342.         }
  343.                    //确认IR信号出现
  344.         while (!IRIN)            //等IR变为高电平,跳过9ms的前导低电平信号。
  345.                 delay(1);
  346.        
  347.         for (j=0;j<4;j++)            //收集四组数据
  348.         {
  349.                 for (k=0;k<8;k++)        //每组数据有8位
  350.                 {
  351.                         while (IRIN)            //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
  352.                         { delay(1);}
  353.                         while (!IRIN)          //等 IR 变为高电平
  354.                                 delay(1);
  355.                         while (IRIN)           //计算IR高电平时长
  356.                         {
  357.                                 delay(1);
  358.                                 N++;           
  359.                                 if (N>=30)
  360.                                 {
  361.                                         EX0=1;
  362.                                         return;
  363.                                 }                  //0.14ms计数过长自动离开。
  364.                         }                        //高电平计数完毕               
  365.                         IRCOM[j]=IRCOM[j] >> 1;     //数据最高位补“0”
  366.                         if(N>=8)
  367.                         {
  368.                                 IRCOM[j] = IRCOM[j] | 0x80;                  //数据最高位补“1”
  369.                         }  
  370.                         N=0;
  371.                 }
  372.         }
  373.        
  374.         if(IRCOM[2]!=~IRCOM[3])                 // 数据出错
  375.         {
  376.                 EX0=1;
  377.                 return;
  378.         }
  379.        
  380.         IRCOM[5]=IRCOM[2] & 0x0F;     //取键码的低四位
  381.         IRCOM[6]=IRCOM[2] >> 4;       //右移4次,高四位变为低四位
  382.        
  383.         if(IRCOM[5]>9)
  384.         {
  385.                 IRCOM[5]=IRCOM[5]+0x37;
  386.         }
  387.         else
  388.         IRCOM[5]=IRCOM[5]+0x30;
  389.        
  390.         if(IRCOM[6]>9)
  391.         {
  392.                 IRCOM[6]=IRCOM[6]+0x37;
  393.         }
  394.         else
  395.         IRCOM[6]=IRCOM[6]+0x30;

  396.         q= (((IRCOM[6]&0x0f)<<4) + (IRCOM[5]&0x0f));
  397.    

  398.         switch(q)      //判断按键键码值
  399.         {
  400.         /*0: 设置高温限,1:设置低温限*/
  401.         /* 8: +1 ,9: -1            */
  402.                 case 0x16:
  403.                     hmodel =1;lmodel =0;     // 进入高温限设置
  404.                  break;              //串口发送0
  405.                 case 0x03:
  406.                    hmodel=0;  lmodel=1 ; // 进入低温限设置
  407.                    break;             //串口发送01
  408.                 case 0x18: displayall() ;break;  //串口发送02
  409.                 case 0x55: displayall1();break;  //串口发送03
  410.                 case 0x08: huicha();break;  //串口发送04
  411.                 case 0x13: TR0=0;pinjian-=4;if(pinjian==0){pinjian=4;};
  412.                                          break;  //串口发送05
  413.                 case 0x51:  flag=6;
  414.                             break;  //串口发送06
  415.                 case 0x42: fanhui() ;TR0=1; ;break;  //串口发送07
  416.                 case 0x52:                         // 加高低温限值
  417.                   if(hmodel==1)           // 设置高温限
  418.                   {
  419.                     htemp++;
  420.                    }
  421.                    else ltemp++;

  422.                  break;               //串口发送08
  423.                 case 0x41:
  424.                   if(hmodel==1)
  425.                   {
  426.                     htemp--;
  427.                    }
  428.                    else ltemp--;

  429.                   break;  //串口发送09       
  430.                 default :break;
  431.         }

  432.          EX0 = 1;
  433. }

  434. /********各种子程序*****************************/
  435. void fanhui()
  436. {
  437.   hmodel=0;
  438.   lmodel=0;
  439.   flag=0;
  440.   beep=1;
  441. }
  442. void displayall()
  443. {       
  444.            flag=1;                                  
  445. }
  446. void displayall1()
  447. {       
  448.        flag=2;                       
  449. }
  450. void huicha()
  451. {
  452.   flag=3;
  453. }

  454. /***************ds18b20*****************************/
  455. void dsreset(void)       //send reset and initialization command
  456. {
  457.   uint i;
  458.   DS=0;
  459.   i=103;
  460.   while(i>0)i--;
  461.   DS=1;
  462.   i=4;
  463.   while(i>0)i--;
  464. }

  465. bit tmpreadbit(void)       //read a bit
  466. {
  467.    uint i;
  468.    bit dat;
  469.    DS=0;i++;          //i++ for delay
  470.    DS=1;i++;i++;
  471.    dat=DS;
  472.    i=8;while(i>0)i--;
  473.    return (dat);
  474. }

  475. uchar tmpread(void)   //read a byte date
  476. {
  477.   uchar i,j,dat;
  478.   dat=0;
  479.   for(i=1;i<=8;i++)
  480.   {
  481.     j=tmpreadbit();
  482.     dat=(j<<7)|(dat>>1);   //读出的数据最低位在最前面,这样刚好一个字节在DAT里
  483.   }
  484.   return(dat);
  485. }

  486. void tmpwritebyte(uchar dat)   //write a byte to ds18b20
  487. {
  488.   uint i;
  489.   uchar j;
  490.   bit testb;
  491.   for(j=1;j<=8;j++)
  492.   {
  493.     testb=dat&0x01;
  494.     dat=dat>>1;
  495.     if(testb)     //write 1
  496.     {
  497.       DS=0;
  498.       i++;i++;
  499.       DS=1;
  500.       i=8;while(i>0)i--;
  501.     }
  502.     else
  503.     {
  504.       DS=0;       //write 0
  505.       i=8;while(i>0)i--;
  506.       DS=1;
  507.       i++;i++;
  508.     }

  509.   }
  510. }

  511. uint tmp()               //get the temperature
  512. {
  513.   float tt;
  514.   uchar a,b;
  515.   dsreset();
  516.   delay(1);
  517.   tmpwritebyte(0xcc);
  518.   tmpwritebyte(0xbe);
  519.   a=tmpread();
  520.   b=tmpread();
  521.   wendu=b;
  522.   wendu<<=8;             //two byte  compose a int variable
  523.   wendu=wendu|a;
  524.   tt=wendu*0.0625;
  525.   wendu=tt*10+0.5;
  526.   return wendu;
  527. }


  528. /***************ds18b20*****************************/
  529. void dsreset1(void)       //send reset and initialization command
  530. {
  531.   uint i;
  532.   DS1=0;
  533.   i=103;
  534.   while(i>0)i--;
  535.   DS1=1;
  536.   i=4;
  537.   while(i>0)i--;
  538. }

  539. bit tmpreadbit1(void)       //read a bit
  540. {
  541.    uint i;
  542.    bit dat;
  543.    DS1=0;i++;          //i++ for delay
  544.    DS1=1;i++;i++;
  545.    dat=DS1;
  546.    i=8;while(i>0)i--;
  547.    return (dat);
  548. }

  549. uchar tmpread1(void)   //read a byte date
  550. {
  551.   uchar i,j,dat;
  552.   dat=0;
  553.   for(i=1;i<=8;i++)
  554.   {
  555.     j=tmpreadbit1();
  556.     dat=(j<<7)|(dat>>1);   //读出的数据最低位在最前面,这样刚好一个字节在DAT里
  557.   }
  558.   return(dat);
  559. }

  560. void tmpwritebyte1(uchar dat)   //write a byte to ds18b20
  561. {
  562.   uint i;
  563.   uchar j;
  564.   bit testb;
  565.   for(j=1;j<=8;j++)
  566.   {
  567.     testb=dat&0x01;
  568.     dat=dat>>1;
  569.     if(testb)     //write 1
  570.     {
  571.       DS1=0;
  572.       i++;i++;
  573.       DS1=1;
  574.       i=8;while(i>0)i--;
  575.     }
  576.     else
  577.     {
  578.       DS1=0;       //write 0
  579.       i=8;while(i>0)i--;
  580.       DS1=1;
  581.       i++;i++;
  582.     }

  583.   }
  584. }

  585. uint tmp1()               //get the temperature
  586. {
  587.   float tt;
  588.   uchar a,b;
  589.   dsreset1();
  590.   delay(1);
  591.   tmpwritebyte1(0xcc);
  592.   tmpwritebyte1(0xbe);
  593.   a=tmpread1();
  594.   b=tmpread1();
  595.   wendu1=b;
  596.   wendu1<<=8;             //two byte  compose a int variable
  597.   wendu1=wendu1|a;
  598.   tt=wendu1*0.0625;
  599.   wendu1=tt*10+0.5;
  600.   return wendu1;
  601. }

  602. /***************ds1302*****************************/
  603. void write_1302(uchar add,dat)
  604. {
  605.         uchar i,temp;
  606.         temp=add;
  607.         ce=0;
  608.         _nop_();
  609.         sclk=0;
  610.         _nop_();
  611.         ce=1;
  612.         _nop_();
  613.         for(i=0;i<8;i++)
  614.         {
  615.                 sclk=0;
  616.                 _nop_();
  617.                 if((temp&0x01)==0x01)
  618.                         dio=1;
  619.                         else
  620.                         dio=0;
  621.                 temp>>=1;
  622.                 sclk=1;
  623.                 _nop_();
  624.         }
  625.         temp=dat;
  626.         for(i=0;i<8;i++)
  627.         {
  628.                 sclk=0;
  629.                 _nop_();
  630.                 if((temp&0x01)==0x01)
  631.                         dio=1;
  632.                         else
  633.                         dio=0;
  634.                 temp>>=1;
  635.                 sclk=1;
  636.                 _nop_();
  637.         }
  638.         ce=0;
  639.         sclk=0;
  640. }
  641. //读出1302的时间
  642. uchar read_1302(uchar add)
  643. {
  644.         uchar dat,dat1,i,temp;
  645.         temp=add;
  646.         ce=0;
  647.         _nop_();
  648.         sclk=0;
  649.         _nop_();
  650.         ce=1;
  651.         for(i=0;i<8;i++)
  652.         {
  653.                 sclk=0;
  654.                 _nop_();
  655.                 if((temp&0x01)==0x01)
  656.                         dio=1;
  657.                         else
  658.                         dio=0;
  659.                 temp>>=1;
  660.                 sclk=1;
  661.                 _nop_();
  662.         }
  663.         for(i=0;i<8;i++)
  664.         {
  665.                 sclk=0;
  666.                 _nop_();
  667.                 if(dio)
  668.                     dat|=0x80;
  669.                 if(i<7)
  670.                         dat>>=1;
  671.                 sclk=1;
  672.         }
  673.         dat1=dat/16;
  674.         dat=dat%16;
  675.         dat=dat1*10+dat;  
  676.         ce=0;
  677.         sclk=0;
  678.         return dat;
  679. }





  680. /***************延时函数*****************************/
  681. void delay(unsigned char x)    //x*0.14MS
  682. {
  683.         unsigned char i;
  684.         while(x--)
  685.         {
  686.                 for (i = 0; i<13; i++) {}
  687.         }
  688. }


  689. void display(uchar a,uchar b,uchar c,uchar d,uchar e,uchar f,uchar g,uchar h)
  690. {
  691. //   P0=table[a];
  692. //   dula=1;
  693. //   dula=0;
  694. //   
  695. //   P0=0xfe;
  696. //   wela=1;
  697. //   wela=0;
  698. //   delay(1);
  699. //   
  700. //   P0=table1[b];
  701. //   dula=1;
  702. //   dula=0;
  703. //   
  704. //   P0=0xfd;
  705. //   wela=1;
  706. //   wela=0;
  707. //   delay(1);
  708. //
  709. //   P0=table[c];
  710. //   dula=1;
  711. //   dula=0;
  712. //   
  713. //   P0=0xfb;
  714. //   wela=1;
  715. //   wela=0;
  716. //   delay(1);
  717. //   
  718. //   P0=table[d];
  719. //   dula=1;
  720. //   dula=0;
  721. //   
  722. //   P0=0xf7;
  723. //   wela=1;
  724. //   wela=0;
  725. //   delay(1);
  726. //   
  727. //   P0=table[e];
  728. //   dula=1;
  729. //   dula=0;
  730. //   
  731. //   P0=0xef;
  732. //   wela=1;
  733. //   wela=0;
  734. //   delay(1);
  735. //   
  736. //   P0=table[f];
  737. //   dula=1;
  738. //   dula=0;
  739. //   
  740. //   P0=0xdf;
  741. //   wela=1;
  742. //   wela=0;
  743. //   delay(1);
  744. //
  745. //   P0=table1[g];
  746. //   dula=1;
  747. //   dula=0;
  748. //
  749. //   P0=0xbf;
  750. //   wela=1;
  751. //   wela=0;
  752. //   delay(1);
  753. //
  754. //   P0=table[h];
  755. //   dula=1;
  756. //   dula=0;
  757. //
  758. //   P0=0x7f;
  759. //   wela=1;
  760. //   wela=0;
  761. //   delay(1);

  762.         
  763.     P0=table[a];
  764.     dula=1;
  765.     dula=0;

  766.     P0=0xfe;
  767.     wela=1;
  768.     wela=0;
  769.     delay(3);

  770.     P0=table1[b];
  771.     dula=1;
  772.     dula=0;

  773.     P0=0xfd;
  774.     wela=1;
  775.     wela=0;
  776.     delay(3);

  777.     P0=table[c];
  778.     dula=1;
  779.     dula=0;

  780.     P0=0xfb;
  781.     wela=1;
  782.     wela=0;
  783.     delay(3);

  784.     P0=table[d];
  785.     dula=1;
  786.     dula=0;

  787.     P0=0xf7;
  788.     wela=1;
  789.     wela=0;
  790.     delay(5);

  791.     P0=table[e];
  792.     dula=1;
  793.     dula=0;

  794.     P0=0xef;
  795.     wela=1;
  796.     wela=0;
  797.     delay(3);

  798.     P0=table[f];
  799.     dula=1;
  800.     dula=0;

  801.     P0=0xdf;
  802.     wela=1;
  803.     wela=0;
  804.     delay(3);

  805.     P0=table1[g];
  806.     dula=1;
  807.     dula=0;

  808.     P0=0xbf;
  809.     wela=1;
  810.     wela=0;
  811.     delay(3);

  812.     P0=table[h];
  813.     dula=1;
  814.     dula=0;

  815.     P0=0x7f;
  816.     wela=1;

  817.     wela=0;
  818.     delay(3);

  819.         //
  820.     P0=0x00;
  821.     dula=1;
  822.     dula=0;

  823.     P0=0x7f;
  824.     wela=1;

  825.     wela=0;
  826.     delay(3);
  827. }

  828. void display1(uchar a,uchar b)
  829. {
  830.    P0=table[a];
  831.    dula=1;
  832.    dula=0;
  833.    
  834.    P0=0xfe;
  835.    wela=1;
  836.    wela=0;
  837.    delay(1);
  838.    
  839.    P0=table1[b];
  840.    dula=1;
  841.    dula=0;
  842.    
  843.    P0=0xfd;
  844.    wela=1;
  845.    wela=0;
  846.    delay(1);

  847.    P0=0xff;
  848.    wela=1;
  849.    wela=0;
  850.    delay(1);
  851. }

  852. void delay1(int ms)
  853. {
  854.         unsigned char y;
  855.         while(ms--)
  856.         {
  857.                 for(y = 0; y<250; y++)
  858.                 {
  859.                         _nop_();
  860.                         _nop_();
  861.                         _nop_();
  862.                         _nop_();
  863.                 }
  864.         }
  865. }


  866. void time0() interrupt 1
  867. {   unsigned i=255;
  868.         TH0=(65536-50000)/256; //对TH0 TL0赋值
  869.         TL0=(65536-50000)%256; //重装计数初值
  870.         p++;
  871.         if(p==20)                  //10s存一次
  872.         {
  873.            p=0;
  874.            init_24c02();
  875.            write_add(pin,h1*10+h2);
  876.            while(i--);i=255;
  877.            write_add(pin+1,m1*10+m2);
  878.                 while(i--);i=255;
  879.            write_add(pin+2,wendu/256);
  880.            while(i--);i=255;
  881.            write_add(pin+3,wendu%256);
  882.            while(i--);i=255;
  883.            pin+=4;
  884.            pinjian=pin;         
  885.            if(pin==255)
  886.             {
  887.                   pin=0;
  888.                   }


  889.         }        
  890.        
  891. }

  892. //************************************************************
  893. void delay1ms()
  894. {
  895. unsigned int i;
  896. for(i=8024;i>0;i--);  //延时124*8+10=1002us
  897. }

  898. void delayds(uint z)
  899. {
  900.         uint x,y;
  901.         for(x=z;x>0;x--)
  902.                 for(y=120;y>0;y--);
  903. }
复制代码

所有资料51hei提供下载:
新红外.zip (71.95 KB, 下载次数: 12)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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