久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1985|回復: 0
打印 上一主題 下一主題
收起左側

51單片機遙控強度測量設計

[復制鏈接]
跳轉到指定樓層
樓主
ID:139086 發表于 2016-9-11 14:02 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit E=P2^7;  //1602使能引腳
  5. sbit RW=P2^6;  //1602讀寫引腳
  6. sbit RS=P2^5;  //1602數據/命令選擇引腳
  7. sbit zero=P2^3;   //20厘米調零處(實際上是調20),由于我們采用強度測量,不同使用環境的白噪聲(紅外線)強度不同,所以需要按鍵調零;
  8. sbit storage=P2^2;   //存儲按鍵
  9. sbit lookover=P2^1;   //查閱按鍵
  10. sbit led=P2^0;
  11. uint table[5]={3720,3720,3720,3720,3720};

  12. sbit b1=P1^0;
  13. sbit b2=P1^1;
  14. sbit b3=P1^2;
  15. sbit b4=P1^3;
  16. sbit b5=P1^4;
  17. sbit b6=P1^5;
  18. sbit b7=P1^6;
  19. sbit b8=P1^7;
  20. sbit b9=P3^1;
  21. sbit b10=P3^2;
  22. sbit b11=P3^3;
  23. sbit b12=P3^4; //12位數據端口定義

  24. sbit status=P3^7; //A/D轉換器中的status定義,低電平有效
  25. sbit lben=P3^6;
  26. sbit hben=P3^5;  //對低8位數據和高4位數據的端口定義,低電平有效

  27.   uint D1_8;     //  A/D的低8位
  28.   uint D9_12;    //  A/D的高4位
  29.   uint digital_10; // A/D轉換后的十進制數
  30.   uint digital_100;
  31.   uint digital_1000;
  32.   uchar shi;     // 距離十位
  33.   uchar ge;   //距離個位
  34.   uchar ge1;   //距離十分位
  35.   float temp;  //距離參考值
  36.   float D;   //距離值
  37.   uint DI;     //整數部分
  38.   float DD;    //小數部分
  39.   float modify; //修正值




  40. void delay()
  41. {
  42. uint i,j;
  43. for(i=0; i<=100; i++)
  44. for(j=0; j<=20; j++);
  45. }


  46. void Delay(uint del)
  47. {
  48. uint i,j;
  49. for(i=0; i<del; i++)
  50. for(j=0; j<1827; j++);
  51. }


  52. void enable(uchar del)
  53. {
  54. P0=del;
  55. RS=0;
  56. RW=0;
  57. E=0;
  58. delay();
  59. E=1;
  60. delay();
  61. }



  62. void write(uchar del)
  63. {
  64. P0=del;
  65. RS=1;
  66. RW=0;
  67. E=0;
  68. delay();
  69. E=1;
  70. delay();
  71. }


  72. void L1602_init(void)
  73. {
  74. enable(0x01); //清屏
  75. enable(0x38); //設置16*2顯示,5*7點陣,8位數據接口
  76. enable(0x0c); //顯示開,不顯示光標,光標不閃爍
  77. enable(0x06); //當讀或寫一個字符后地址指針加1,且光標加1
  78. enable(0xd0); //設置數據地址指針80H+05H
  79. }

  80. void L1602_string(uchar hang,uchar lie,uchar *p)
  81. {
  82. uchar a;
  83. if(hang==1)  a=0x80;
  84. if(hang==2)  a=0xc0;
  85. a=a+lie-1;
  86. enable(a);
  87. while(1)
  88. {
  89.   if(*p=='\0')
  90.           break;
  91.   write(*p);
  92.   p++;
  93. }
  94. }


  95. void L1602_char(uchar hang,uchar lie,char sign)
  96. {
  97. uchar a;
  98. if(hang==1) a=0x80; //a為第一行的起始數據地址指針
  99. if(hang==2) a=0xc0; //a為第二行的起始數據地址指針
  100. a=a+lie-1;  //因為是5*7的點陣顯示,所以每對地址指針加1,其實是對地址的加5
  101. enable(a); //設置數據地址指針
  102. write(sign);
  103. }



  104. void Display_num(uchar h,uchar l,uchar num)
  105. {
  106. L1602_char(h,l,(num+'0'));
  107. }

  108. void main()
  109. {
  110.   uchar n=0; //存儲距離的個數,計數
  111.   uchar m=1;//切換顯示計數的定義
  112.   L1602_init();
  113.   modify=0;
  114.   while(1)
  115.   {   
  116.    if(status==0)
  117.    {
  118.     lben=0;
  119.     hben=1;  //讀取A/D低8位的值
  120.     delay(); //延時是為了讓器件達到電壓穩定   
  121.     digital_10=(uint)b1+b2*2+b3*4+b4*8+b5*16+b6*32+b7*64+b8*128; //低8位轉化為10進制 ;  
  122.     hben=0;
  123.     lben=1;  //讀取A/D高4位的值
  124.     delay(); //延時是為了讓器件達到電壓穩定
  125.    
  126.     digital_10+=b9*256+b10*512+b11*1024+b12*2048; //高4位轉化為10進制;   

  127.     digital_10=D1_8+D9_12;  //得到A/D轉換的10進制數;
  128.    if(zero==0)
  129.    {
  130.     Delay(2);
  131.    if(zero==0)
  132.    {
  133.     modify=(141.0-(float)digital_10)/1000.0;
  134.     Delay(10);
  135.    }
  136.    }            
  137.    //調零按鍵功能實現
  138.    if(storage==0)
  139.    {
  140.      Delay(2);
  141.     if(storage==0)
  142.     {
  143.       if(n==5)
  144.      {
  145.          n=0;
  146.      }
  147.       table[n++]=digital_10;
  148.      Delay(10);
  149.     }
  150.    }         
  151.    //存儲距離,最多存儲5個距離,超過5個距離后就覆蓋前面的值

  152.    if(lookover==0)
  153.    {
  154.     Delay(2);
  155.     if(lookover==0)
  156.     {      
  157.         if(m==6)
  158.      {
  159.          m=0;
  160.      }
  161.      m++;
  162.      Delay(10);
  163.     }
  164.    }
  165.    L1602_string(2,5,"P=");
  166.    Display_num(2,7,digital_10/1000);
  167.    Display_num(2,8,digital_1000/100);
  168.    Display_num(2,9,digital_100/10);
  169.    Display_num(2,10,digital_10);
  170.    //顯示上面的十進制數,用來作為距離的參考量
  171.   
  172.   switch(m)
  173.   {
  174.    case 1: if(digital_10>=(100+modify))
  175.               {
  176.         L1602_string(1,1,"Now");
  177.         }
  178.         break;
  179.    case 2: digital_10=table[0];  L1602_string(1,1,"M[1]");break;
  180.    case 3: digital_10=table[1];  L1602_string(1,1,"M[2]");break;
  181.    case 4: digital_10=table[2];  L1602_string(1,1,"M[3]");break;
  182.    case 5: digital_10=table[3];  L1602_string(1,1,"M[4]");break;
  183.    case 6: digital_10=table[4];  L1602_string(1,1,"M[5]");break;
  184.    default: break;
  185.      }
  186.     if(digital_10>=(100+modify))
  187.     {
  188.             led=1;
  189.       temp=digital_10/1000.0+modify;
  190.      
  191.       if(digital_10>=1793 )
  192.       {
  193.          D=0.3142*temp*temp-2.7701*temp+5.9567;
  194.       }
  195.      
  196.       else if(digital_10>=666)
  197.       {
  198.        D=2.5279*temp*temp-9.6821*temp+11.2530;
  199.       }
  200.       else if(digital_10>=474)
  201.       {
  202.        D=16.1678*temp*temp-28.8479*temp+18.0414;
  203.       }
  204.       else if(digital_10>=313)
  205.       {
  206.        D=35.1631*temp*temp-46.1739*temp+21.9936;
  207.       }
  208.       else if(digital_10>=208)
  209.       {
  210.        D=122.7448*temp*temp-101.4691*temp+30.7590;
  211.       }
  212.       else if(digital_10>=141)
  213.       {
  214.        D=368.1020*temp*temp-201.6608*temp+41.0483;
  215.       }
  216.       else if(digital_10>=123)
  217.       {
  218.        D=-111.1111*temp+35.6667;
  219.       }
  220.       else if(digital_10>=105)
  221.       {
  222.        D=2311.1*temp*temp-693.1*temp+72.3;
  223.       }
  224.       DI=(uint)D;    //得到整數;
  225.       DD=D-DI;       //得到分數部分;
  226.       shi=DI/10;
  227.       ge=DI;
  228.       ge1=(uchar)(DD*10);
  229.    
  230.       L1602_string(1,5,"D=");
  231.       Display_num(1,8,shi);
  232.       Display_num(1,9,ge);
  233.       L1602_char(1,10,'.');
  234.       Display_num(1,11,ge1);
  235.       L1602_string(1,12,"cm");
  236.     }
  237.      else
  238.      {
  239.        L1602_string(1,1,"Out of range ");
  240.        led=0;
  241.         }
  242.    }
  243.   }
  244. }
復制代碼


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲视频在线免费观看 | 99精品免费 | 中文字幕91av | 国产黄色大片在线观看 | 三级免费毛片 | 日韩精品一区二区在线 | 天天影视亚洲综合网 | 美女毛片免费看 | 日韩成人性视频 | 国产一区二区黑人欧美xxxx | 精品国产一级 | 999在线精品| 看羞羞视频免费 | 色狠狠桃花综合 | aaa一区 | 鲁视频| 一区亚洲| 久久午夜剧场 | 在线免费观看色 | 日韩在线不卡 | 久久久久久国产 | 亚洲欧美在线观看 | 羞羞的视频在线 | 一区二区三区四区av | 国产内谢| 精品亚洲一区二区三区 | 草草草网站 | 国产一区二区黑人欧美xxxx | 成人免费在线视频 | 精精国产xxxx视频在线 | 国产精品成人久久久久 | 精精精精xxxx免费视频 | 综合欧美亚洲 | 在线日韩在线 | 亚洲一区电影 | 在线国产一区 | 亚洲精品视频网站在线观看 | 99精品亚洲国产精品久久不卡 | 国产精品成人在线播放 | 国产精品久久久久久久久动漫 | 成人精品一区 |