⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 51

📁 51单片机大量源码
💻
📖 第 1 页 / 共 2 页
字号:
 154   1         delay(10);             //延时10ms,给硬件一点反应时间
 155   1         WriteAddress(0x01);   // 从第1行第3列开始显示
 156   1         k = 0;               //指向字符数组的第1个元素
 157   1              while(string[k] != '\0')
 158   1                      {                                       
 159   2                              WriteData(string[k]);
 160   2                              k++;             //指向下字符数组一个元素                               
 161   2                      }        
 162   1         i=0;
 163   1      
 164   1         flag=0;
 165   1              Tx=0;       //首先拉低脉冲输入引脚
 166   1              TMOD=0x10;    //定时器0,定时器1,16位工作方式
 167   1      //      TR0=1;       //启动定时器0
 168   1         IT0=0;        //由高电平变低电平,触发外部中断
 169   1              //ET0=1;        //打开定时器0中断
 170   1              EX0=0;        //关闭外部中断
 171   1              EA=1;         //打开总中断0     
 172   1        
 173   1              
 174   1      while(1)         //程序循环
 175   1              {
 176   2               WriteAddress(0x41);    // 从第2行第6列开始显示
 177   2                      WriteData('J');  //将万位数字的字符常量写入LCD
 178   2                               WriteData('U');  //将万位数字的字符常量写入LCD
 179   2                                WriteData('L');  //将万位数字的字符常量写入LCD
C51 COMPILER V8.18   超蒧波显示                                                            01/07/2010 23:31:15 PAGE 4   

 180   2                                 WriteData('I');  //将万位数字的字符常量写入LCD
 181   2                                  WriteData(':');  //将万位数字的字符常量写入LCD
 182   2                        WriteData(digit[bai]);  //将万位数字的字符常量写入LCD
 183   2                        WriteData(digit[shi]);  //将千位数字的字符常量写入LCD
 184   2                        WriteData('.');  //将万位数字的字符常量写入LCD
 185   2                        WriteData(digit[ge]);  //将百位数字的字符常量写入LCD
 186   2                        WriteData(' ');  //将百位数字的字符常量写入LCD
 187   2                        WriteData('C');  //将万位数字的字符常量写入LCD
 188   2                        WriteData('M');  //将万位数字的字符常量写入LCD
 189   2        EA=0;
 190   2                   Tx=1;
 191   2              delay_20us();
 192   2              Tx=0;         //产生一个20us的脉冲,在Tx引脚  
 193   2              while(Rx==0); //等待Rx回波引脚变高电平
 194   2                   succeed_flag=0; //清测量成功标志
 195   2                   EX0=1;          //打开外部中断
 196   2                        TH1=0;          //定时器1清零
 197   2              TL1=0;          //定时器1清零
 198   2                   TF1=0;          //
 199   2              TR1=1;          //启动定时器1
 200   2         EA=1;
 201   2      
 202   2            while(TH1 < 30);//等待测量的结果,周期65.535毫秒(可用中断实现)  
 203   2                        TR1=0;          //关闭定时器1
 204   2              EX0=0;          //关闭外部中断
 205   2      
 206   2          if(succeed_flag==1)
 207   2                   {  
 208   3                         distance_data=outcomeH;                //测量结果的高8位
 209   3                 distance_data<<=8;                   //放入16位的高8位
 210   3                           distance_data=distance_data|outcomeL;//与低8位合并成为16位结果数据
 211   3                  distance_data*=12;                  //因为定时器默认为12分频
 212   3                 distance_data/=58;                   //微秒的单位除以58等于厘米
 213   3               }                                      //为什么除以58等于厘米,  Y米=(X秒*344)/2
 214   2                                                                     // X秒=( 2*Y米)/344 ==》X秒=0.0058*Y米 ==》厘米=微秒/58 
 215   2          if(succeed_flag==0)
 216   2                         {
 217   3                  distance_data=0;                    //没有回波则清零
 218   3      
 219   3                 }
 220   2      
 221   2                 distance[i]=distance_data; //将测量结果的数据放入缓冲区
 222   2                  i++;
 223   2                       if(i==3)
 224   2                           {
 225   3                             distance_data=(distance[0]+distance[1]+distance[2]+distance[3])/4;
 226   3                    
 227   3                  pai_xu();
 228   3                   distance_data=distance[1];
 229   3      
 230   3            
 231   3                 a=distance_data;
 232   3             if(b==a) CONT_1=0;
 233   3             if(b!=a) CONT_1++;
 234   3             if(CONT_1>=3)
 235   3                         { CONT_1=0;
 236   4                                b=a;
 237   4                                conversion(b);
 238   4                              }       
 239   3                               i=0;
 240   3                              }            
 241   2               }
C51 COMPILER V8.18   超蒧波显示                                                            01/07/2010 23:31:15 PAGE 5   

 242   1      }
 243          //***************************************************************
 244          //外部中断0,用做判断回波电平
 245          INTO_()  interrupt 0   // 外部中断是0号
 246           {    
 247   1           outcomeH =TH1;    //取出定时器的值
 248   1           outcomeL =TL1;    //取出定时器的值
 249   1           succeed_flag=1;   //至成功测量的标志
 250   1           EX0=0;            //关闭外部中断
 251   1        }
 252          //****************************************************************
 253          //定时器0中断,用做显示
 254          timer0() interrupt 1  // 定时器0中断是1号
 255             {
 256   1              // TH0=0xfd; //写入定时器0初始值
 257   1              // TL0=0x77;            
 258   1              
 259   1         }
 260          
 261          //显示数据转换程序
 262          void conversion(uint temp_data)  
 263           {  
 264   1          uchar ge_data,shi_data,bai_data ;
 265   1          bai_data=temp_data/100 ;
 266   1          temp_data=temp_data%100;   //取余运算
 267   1          shi_data=temp_data/10 ;
 268   1          temp_data=temp_data%10;   //取余运算
 269   1          ge_data=temp_data;
 270   1      
 271   1          //bai_data=SEG7[bai_data];
 272   1          //shi_data=SEG7[shi_data]&0x7f;
 273   1          //ge_data =SEG7[ge_data];
 274   1      
 275   1          EA=0;
 276   1          bai = bai_data;
 277   1          shi = shi_data;
 278   1          ge  = ge_data ; 
 279   1               EA=1;
 280   1       }
 281          //******************************************************************
 282          
 283          
 284          void delay_20us()
 285           {  uchar bt ;
 286   1          for(bt=0;bt<60;bt++);
 287   1       }
 288             void pai_xu()
 289            {  uint t;
 290   1        if (distance[0]>distance[1])
 291   1          {t=distance[0];distance[0]=distance[1];distance[1]=t;} 
 292   1        if(distance[0]>distance[2])
 293   1          {t=distance[2];distance[2]=distance[0];distance[0]=t;} 
 294   1        if(distance[1]>distance[2])
 295   1          {t=distance[1];distance[1]=distance[2];distance[2]=t;}  
 296   1          }
 297          
 298          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    666    ----
   CONSTANT SIZE    =     25    ----
C51 COMPILER V8.18   超蒧波显示                                                            01/07/2010 23:31:15 PAGE 6   

   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     16       7
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      1       1
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -