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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1732|回復(fù): 0
收起左側(cè)

基于電位器式傳感器位移測量儀的設(shè)計(jì)-STC89C52單片機(jī)

[復(fù)制鏈接]
ID:821249 發(fā)表于 2022-8-26 20:47 | 顯示全部樓層 |閱讀模式
基于STC89C52電位器式傳感器位移測量儀的設(shè)計(jì)
本文的位移測量儀的設(shè)計(jì)要求為:采集和處理測量電路的信號,顯示測量位移,測量范圍是0-50mm精度為0.1mm。設(shè)計(jì)能和計(jì)算機(jī)進(jìn)行通信的標(biāo)準(zhǔn)接口,并將測量數(shù)據(jù)發(fā)送到計(jì)算機(jī)。

位移傳感器模塊使用米朗科技KPM12型直線位移傳感器,它是一種非線繞電位器式傳感器,它也是一種線性電位器式傳感器,其原理相當(dāng)簡單,類似于滑動變阻器。
將計(jì)算機(jī)的波特率與單片機(jī)串口通信的波特率設(shè)置相同均為9600,完成了通信的相關(guān)初始化后,通過指令讓系統(tǒng)通過通信模塊完成數(shù)據(jù)的傳輸,最后再計(jì)算機(jī)串口調(diào)試助手可以看到測量結(jié)果。
關(guān)鍵詞: 位移傳感器;51單片機(jī);A/D轉(zhuǎn)換
51hei截圖20220718131413.png
51hei截圖20220718131447.png

單片機(jī)源程序如下:

  1. /*=============================================================*/
  2. #include<reg52.h>        //器件配置文件
  3. #include <intrins.h>
  4. #include "lcd.h"


  5. #define u8 unsigned char  
  6. #define u16 unsigned int
  7. #define uchar unsigned char
  8. #define uint unsigned int
  9.        






  10. unsigned char voltage[] = {'0','0','0','.','0',0};


  11. unsigned int circuit,aa,bb,cc,dd,ac,setv1,setv2;

  12. float u,k;

  13. unsigned int j,ppm,cp;

  14.         uint dat=0,shidu;

  15.        
  16. void ConfigUART(unsigned int baud);              //串行口配置函數(shù)
  17. void ConfigTimer0();                             //定時(shí)器0配置函數(shù)
  18. void SendData(unsigned char ch);                 //字符發(fā)送函數(shù)
  19. void SendString(char *s);                        //字符串發(fā)送函數(shù)
  20. void AlarmJudge(void);                                                                                                                //警報(bào)
  21. void delayms(unsigned int ms);
  22. void UartSend();                                                                 //串口數(shù)據(jù)發(fā)送函數(shù)

  23. //AD管腳

  24. sbit ADCS         =P3^5;
  25. sbit ADCLK  =P3^2;
  26. sbit ADDI         =P3^3;
  27. sbit ADDO         =P3^4;


  28. sbit Buzzer_P  = P2^1;                // 蜂鳴器的管腳

  29. sbit KEY  = P1^3;                // “設(shè)置”按鍵的管腳
  30. sbit KeyDown_P = P1^4;                // 按鍵的管腳

  31. uint set_value = 30;
  32. uint set_value_count = 0;                //警報(bào)設(shè)置菜單
  33. uint key_count=1;


  34.        
  35. /***********************************
  36. 函數(shù)名:   Adc0832
  37. 功能:    啟動AD轉(zhuǎn)換將值儲存于 dat




  38.        
  39. ***********************************/





  40. unsigned int Adc0832(unsigned char channel)
  41. {
  42.                         uchar i=0;
  43.                         uchar j;

  44.                         uchar ndat=0;
  45.                 //        uchar  Vot=0;

  46.                         if(channel==0)channel=2;        //  10
  47.                         if(channel==1)channel=3;        //        11
  48.        
  49.         ADDI=1;
  50.                 _nop_();
  51.                 _nop_();
  52.         ADCS=0;                                //拉低CS端 開始
  53.                 _nop_();
  54.                 _nop_();
  55.         ADCLK=1;                        //拉高CLK端
  56.                 _nop_();
  57.                 _nop_();
  58.         ADCLK=0;                        //拉低CLK端,形成下降沿1  第一個(gè)脈沖的下降沿,此前DIO必須是高電平
  59.                 _nop_();
  60.                 _nop_();
  61.         ADCLK=1;                        //拉高CLK端
  62.        
  63.         ADDI=channel&0x1;                        //
  64.        
  65.                 _nop_();
  66.                 _nop_();
  67.                
  68.         ADCLK=0;                //拉低CLK端,形成下降沿2
  69.        
  70.         _nop_();
  71.         _nop_();
  72.        
  73.         ADCLK=1;//拉高CLK端
  74.        
  75.         ADDI=(channel>>1)&0x1;
  76.        
  77.         _nop_();
  78.         _nop_();
  79.        
  80.         ADCLK=0;//拉低CLK端,形成下降沿3
  81.        
  82.         ADDI=1;//控制命令結(jié)束 輸入端DI失去作用,應(yīng)置1
  83.        
  84.         _nop_();
  85.         _nop_();
  86.        
  87.        
  88.         dat=0;
  89.        
  90.         for(i=0;i<8;i++)
  91.         {
  92.                 dat|=ADDO;//收數(shù)據(jù)        (或)
  93.                 ADCLK=1;
  94.                 _nop_();
  95.                 _nop_();
  96.                 ADCLK=0;//形成一次時(shí)鐘脈沖
  97.                 _nop_();
  98.                 _nop_();
  99.                 dat<<=1;                //左移一位
  100.                 if(i==7)dat|=ADDO;   //將輸出數(shù)據(jù)DO通過或運(yùn)算儲存在dat最低位
  101.         }
  102.        
  103.        
  104.         for(i=0;i<8;i++)                //驗(yàn)證
  105.         {
  106.                 j=0;
  107.                 j=j|ADDO;                //收數(shù)據(jù)
  108.                 ADCLK=1;
  109.                 _nop_();
  110.                 _nop_();
  111.                 ADCLK=0;//形成一次時(shí)鐘脈沖
  112.                 _nop_();
  113.                 _nop_();
  114.                 j=j<<7;                //從 ADD0開始
  115.                 ndat=ndat|j;
  116.                 if(i<7)ndat>>=1;
  117.         }
  118.        
  119.        
  120.         ADCS=1;//拉低CS端
  121.         ADCLK=0;//拉低CLK端
  122.         ADDO=1;//拉高數(shù)據(jù)端,回到初始狀態(tài)
  123.         dat<<=8;
  124.         dat|=ndat;  


  125.         return(dat);            //return ad data
  126. }





  127. void Conut(void)
  128. {

  129.                  circuit=shidu/256;                // 數(shù)字量
  130.        
  131.         u=(float)circuit;
  132.         k=(float)circuit;
  133.                 u=u*0.5977;
  134.                 u=u*10;                                //提取一位小數(shù)
  135.                 k=k*0.5977;
  136.        
  137.         cp=(int)k;                // 警報(bào)值
  138.        
  139.         ppm=(int)u;
  140.         aa=ppm/1000;
  141.          bb=ppm%1000/100;
  142.         cc=ppm%100/10;
  143.          dd=ppm%10;
  144.        
  145.         setv1 = set_value/10;
  146.         setv2 = set_value%10;
  147.        
  148.        
  149.         voltage[0] = (char)('0'+ aa);
  150.         voltage[1] = (char)('0'+ bb);
  151.         voltage[2] = (char)('0'+ cc);
  152.         voltage[4] = (char)('0'+ dd);
  153.        


  154. }




  155. /***********************************
  156. 函數(shù)名:  delayms()
  157. 功能:    延時(shí) ms 毫秒

  158. ***********************************/
  159. void DelayMs(uint time)
  160. {
  161.         uint i,j;
  162.         for(i=0;i<time;i++)
  163.                 for(j=0;j<112;j++);
  164. }

  165. /***********************************
  166. 函數(shù)名:  LcdDisplay()

  167. ***********************************/


  168. void LcdDisplay(void)
  169. {        LCD1602_write_com(0x80+3);

  170.         LCD1602_write_word("KPM12-150mm");
  171.        
  172.         LCD1602_write_com(0x80+0+0x40);
  173.         LCD1602_write_word("  ");
  174.        
  175.   LCD1602_write_com(0x80+2+0x40);
  176.         LCD1602_write_word("X=");
  177.         LCD1602_write_com(0x80+4+0x40);          
  178.         LCD1602_write_data(0x30+aa);
  179.         LCD1602_write_com(0x80+5+0x40);
  180.         LCD1602_write_data(0x30+bb);
  181.   LCD1602_write_com(0x80+6+0x40);          
  182.         LCD1602_write_data(0x30+cc);               
  183.         LCD1602_write_com(0x80+7+0x40);          
  184.         LCD1602_write_word(".");       
  185.        
  186.         LCD1602_write_com(0x80+8+0x40);
  187.         LCD1602_write_data(0x30+dd);       
  188.         LCD1602_write_com(0x80+9+0x40);
  189.         LCD1602_write_word("mm");
  190.        
  191.                 LCD1602_write_com(0x80+12+0x40);
  192.         LCD1602_write_word("!=");
  193.           LCD1602_write_com(0x80+14+0x40);          
  194.         LCD1602_write_data(0x30+setv1);               
  195.          LCD1602_write_com(0x80+15+0x40);          
  196.         LCD1602_write_data(0x30+setv2);               


  197.        
  198.        
  199. }

  200. void LcdDisplay2(void)
  201. {
  202.   LCD1602_write_com(0x80+3+0x40);
  203.         LCD1602_write_word("cccc");

  204.        
  205.         LCD1602_write_com(0x80+3);

  206.         LCD1602_write_word("aaa");

  207.        
  208.        
  209. }

  210. /***********************************
  211. 函數(shù)名:AlarmJudge
  212.                                                                                         警報(bào)

  213. ***********************************/
  214. void AlarmJudge(void)
  215. {                       
  216. if(cp > set_value)
  217.                 {
  218.                
  219.                         Buzzer_P=0;
  220.                         delayms(50);

  221.                         Buzzer_P=1;
  222.                         delayms(50);
  223.                        
  224.                        
  225.                 }
  226.         else
  227.         {
  228.                 Buzzer_P=1;
  229.        
  230.         }
  231. }


  232. /* UART字符發(fā)送函數(shù) */
  233. void SendData(unsigned char ch)
  234. {
  235.     SBUF = ch;                                   //啟動發(fā)送
  236.         while(!TI);                                  //等待結(jié)束
  237.         TI = 0;
  238. }



  239. /* UART字符串發(fā)送函數(shù) */
  240. void SendString(unsigned char *s)
  241. {
  242.     while(*s)                                    //循環(huán)發(fā)送
  243.     {
  244.         SendData(*s++);
  245.     }
  246. }


  247. void UartSend()
  248. {
  249.         SendString("x=");
  250.         SendString(voltage);

  251.         SendString("mm \r\n");
  252. }

  253. /* 串口配置函數(shù),baud-通信波特率 */
  254. void ConfigUART(unsigned int baud)
  255. {
  256.     SCON  = 0x50;                                //配置串口為模式1
  257.     TMOD &= 0x0F;                                //清零T1的控制位
  258.     TMOD |= 0x20;                                //配置T1為模式2
  259.     TH1 = 256 - (11059200/12/32)/baud;           //計(jì)算T1重載值
  260.     TL1 = TH1;                                   //初值等于重載值
  261.     ET1 = 0;                                     //禁止T1中斷
  262.     ES  = 1;                                     //使能串口中斷
  263.     TR1 = 1;                                     //啟動T1
  264.                 EA = 1;                                      //打開總中斷
  265. }


  266. /* UART中斷服務(wù)函數(shù) */
  267. void InterruptUART() interrupt 4
  268. {
  269.     if(RI)                                       //接收到字節(jié)
  270.     {
  271.         RI = 0;                                  //清零接收中斷標(biāo)志位
  272.     }
  273.     if(TI)                                       //字節(jié)發(fā)送完畢
  274.     {
  275.         TI = 0;                                  //清零發(fā)送中斷標(biāo)志位
  276.     }
  277. }

  278. /***********************************
  279. 主函數(shù)
  280. ***********************************/


  281. void main()
  282. {               


  283.         Init_LCD1602();
  284.        
  285.         ConfigUART(9600);                            //配置串行口工作模式及參數(shù)
  286.        
  287.        


  288.        
  289.         while(1)
  290.           {               
  291.                        
  292.                                        
  293.                         shidu=Adc0832(0);                                        //獲取AD值
  294.                         Conut();                                                                        //計(jì)算       
  295.        
  296.                
  297.                          if(KEY==0)                                                                                //按鍵
  298.   {
  299.                
  300.   DelayMs(30);
  301.    if(KEY==0)                                                                                        //去抖
  302.    while(!KEY);
  303.         {        
  304.                 LCD1602_write_com(0x01);                        //清屏指令
  305.    key_count++;                                                                                //菜單計(jì)數(shù)
  306.         }
  307.        
  308.    if(key_count==3)
  309.                         key_count=1;
  310.           LCD1602_write_com(0x01);                        //清屏指令
  311.    
  312.   }

  313.   if(key_count==1)                                                //界面1
  314.   {
  315.                
  316.   LcdDisplay();
  317.                
  318.                
  319.                
  320.                  if(KeyDown_P==0)                                //判斷按鍵2
  321.   {
  322.                
  323.                 DelayMs(30);
  324.    if(KeyDown_P==0)
  325.    while(!KeyDown_P);
  326.          {
  327.    set_value_count++;
  328.          set_value = set_value+10;                //按一次+10mm
  329.                  
  330.                
  331.          }
  332.          
  333.    if(set_value_count==7)
  334.          {
  335.                  set_value = 30;
  336.    set_value_count=0;
  337.          
  338.          }
  339.                

  340.    
  341.   }
  342.        
  343.   }
  344.        
  345.        
  346.   if(key_count==2)                                                        //界面2
  347.   {
  348.                
  349.                 LcdDisplay2();       
  350.                
  351.    }

  352.        
  353.                        
  354.                 UartSend();                              //串口發(fā)送
  355.                        
  356.                 for(j=0;j<30000;j++);                            //延時(shí)讀取
  357.                        
  358.        
  359.        
  360.        
  361.           AlarmJudge();               
  362. }

  363. }         
復(fù)制代碼

Keil代碼與Proteus仿真51hei附件下載:
位移傳感器.zip (85.9 KB, 下載次數(shù): 20)

評分

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

查看全部評分

回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日韩成人精品一区二区三区 | www.嫩草 | 日韩亚洲视频 | 亚洲一区综合 | 日本不卡免费新一二三区 | 国产 欧美 日韩 一区 | 欧美一级在线观看 | 日韩成人免费视频 | 国产精品久久久久久久久久三级 | 久久久精品一区二区三区 | 久久国际精品 | 国产一区二区三区四区在线观看 | 久久区二区| 男女又爽又黄视频 | 精品久久久久久亚洲综合网 | 日韩成人影院 | 中文字幕二区 | 久久免费视频网 | 国产精品久久久久久久久久久新郎 | 欧美亚洲国产日韩 | 午夜在线观看免费 | 欧美成人aaa级毛片在线视频 | 亚洲高清一区二区三区 | 日韩中文字幕区 | 国产精品日韩一区 | 亚洲va欧美va天堂v国产综合 | 日韩电影a | 亚洲精品久久久一区二区三区 | 可以看黄的视频 | 偷拍自拍网站 | 欧美一级精品片在线看 | 欧美视频三区 | 亚洲视频中文字幕 | 亚洲精品久久久久中文字幕欢迎你 | 日韩欧美一区二区三区免费看 | 国产精品国产精品国产专区不卡 | 免费h视频| 涩涩视频网 | 一区二区三区在线 | 欧 | 午夜影院网站 | 成人精品鲁一区一区二区 |