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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8025|回復: 7
收起左側

51單片機MPX4115壓力傳感器+ADC0832仿真課設程序

  [復制鏈接]
ID:396689 發表于 2019-1-11 19:57 | 顯示全部樓層 |閱讀模式
此課設基于ADC0832和壓力傳感器MPX4115,把傳感器的值通過運放電路調整,送入AD轉換,再經單片機編程實現壓力的測量與顯示;涉及PWM控制,串口,按鍵控制PWM占空比等。

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png

單片機源程序如下:
  1. #include<math.h>
  2. #include<absacc.h>
  3. #include<intrins.h>
  4. #include<reg51.h>
  5. #define uchar unsigned char
  6. #define uint unsigned  int
  7. #define ulong unsigned long

  8. #define BUSY  0x80                  //常量定義            
  9. #define DATAPORT P0

  10. sbit Alarm_led_red =P1^6;          //超過壓力表量程最大值紅燈報警
  11. sbit Alarm_led_green=P1^7;         //低于壓力表量程最小值路燈報警

  12. sbit LCM_RS=P2^0;
  13. sbit LCM_RW=P2^1;
  14. sbit LCM_EN=P2^2;
  15.                     
  16. sbit k1=P2^3;  
  17. sbit k2=P2^4;  
  18. sbit k3=P2^5;  
  19. sbit k4=P2^6;  

  20. sbit ADCS =P3^5;  //ADC0832 chip seclect
  21. sbit ADCLK =P3^6;  //ADC0832 clock signal
  22. sbit ADDI =P3^7;  //ADC0832 k in
  23. sbit ADDO =P3^7;  //ADC0832 k out





  24. uchar ad_data;                    //采樣值存儲
  25. unsigned char ad_alarm;           //報警值存儲單元
  26. unsigned char press_bai=0;        //顯示值百位
  27. unsigned char press_shi=0;        //顯示值十位
  28. unsigned char press_ge=0;         //顯示值個位
  29. unsigned char press_dot=0;        //顯示值十分位
  30. uchar code str0[]={"Press:   .   kpa. "};
  31. uchar code str1[]={"ZKB:   00  %   "};
  32. uchar ZKB[2];
  33. uchar HighRH = 0;
  34. uchar HighRL = 0;
  35. uchar LowRH = 0;
  36. uchar LowRL = 0;
  37. unsigned int a;
  38. uchar rate;  
  39. sbit PWMOUT = P1^0;
  40. uchar step, rec_data,flag;
  41. uchar Adc0832(unsigned char channel);  
  42. void delay(uint);                        
  43. void lcd_wait(void);                      //檢測忙子程序
  44. void delay_LCM(uint);                     //延時子程序
  45. void initLCM(void);                       //初始化子程序
  46. void WriteCommandLCM(uchar WCLCM,uchar BusyC);           //寫指令到LCM子程序      
  47. void WriteDataLCM(uchar WDLCM);                          //寫數據到LCM子程序
  48. void DisplayOneChar(uchar X,uchar Y,uchar DData);        //顯示指定坐標的一個字符子函數
  49. void DisplayListChar(uchar X,uchar Y,uchar code *DData); //顯示指定坐標的一串字符子函數
  50. void display(void);                                       //系統顯示子函數
  51. void ConfigPWM(uchar rate);
  52. void alarm(void);
  53. void data_pro(void);
  54. void ConfigPWM(uchar dc);
  55. void key_setPWM(void);
  56. uchar duty_cycle(uchar ad_data);
  57. void display_zkb(void);
  58. void zkb_pro(void);
  59. void chuankou_init();

  60. /**********main funcation************/
  61. void main(void)
  62. {
  63.          
  64.         
  65.     delay(50);              
  66.     initLCM( );      
  67.                 chuankou_init();
  68.     WriteCommandLCM(0x01,1);           //清屏顯示
  69.     DisplayListChar(0,0,str0);
  70.     DisplayListChar(0,1,str1);
  71.                
  72.                 delay(10);
  73.                 PWMOUT=1;
  74.                 EA = 1;
  75.                 ConfigPWM(rate);
  76.                 while(1)
  77.     {
  78.                         ad_data =Adc0832(0);                 //采樣值存儲單元初始化為0
  79.                         alarm();
  80.                         data_pro();
  81.                         zkb_pro();
  82.                         display();
  83.                         display_zkb();
  84.                         a=duty_cycle(ad_data);
  85.                         ConfigPWM(a);
  86.                         key_setPWM();
  87.                         if(a!=rate)
  88.                         {
  89.                         ConfigPWM(rate);
  90.                         }
  91.                         
  92.                                 if(RI==1)//串口
  93.                 {
  94.                         RI=0;
  95.                         rec_data=SBUF;
  96.                         step=rec_data*2;
  97.                         SBUF=rec_data;
  98.                 }
  99.                
  100.                 }
  101. }

  102. void TIME_INIT()
  103. {
  104. TMOD|=0X02;
  105. IT0=1;
  106. IT1=1;
  107. TR1=1;
  108. EX1=1;
  109. EX0=1;
  110. ET0=1;
  111. TR0=1;
  112. EA=1;
  113. }
  114. void chuankou_init()
  115. {
  116. SCON|=0X50;
  117. TMOD|=0X20;
  118. PCON|=0X80;
  119. TH1=0XFA;
  120. TL1=0XFA;
  121. TR1=1;

  122. SM0=0;
  123. SM1=1;
  124. REN=1;

  125. EA=1;
  126. ES=1;
  127. }

  128. /********延時K*1ms,12.000mhz**********/
  129. void delay(uint x)
  130. {
  131.     uchar i;
  132.          while(x--)
  133.          {
  134.                  for(i = 0;i < 120;i++)
  135.                  {;}
  136.          }
  137. }   
  138. /**********寫數據到ICM子函數************/
  139. void WriteCommandLCM(uchar WCLCM,uchar BusyC)
  140. {
  141.     if(BusyC)
  142.                         lcd_wait();          //檢測忙信號
  143.                 DATAPORT=WCLCM;
  144.     LCM_RS=0;               
  145.     LCM_RW=0;  
  146.     LCM_EN=1;   
  147.          _nop_();   
  148.          _nop_();
  149.          _nop_();
  150.     LCM_EN=0;
  151.    
  152. }
  153. /**********????LCM???************/
  154. void WriteDataLCM(uchar WDLCM)
  155. {
  156.     lcd_wait( );  
  157.                 DATAPORT=WDLCM;
  158.     LCM_RS=1;        //選中數據寄存器
  159.     LCM_RW=0;        //寫模式
  160.     LCM_EN=1;
  161.     _nop_();
  162.                  _nop_();
  163.                  _nop_();
  164.     LCM_EN=0;
  165. }
  166. /***********lcm內部等待程序*************/
  167. void lcd_wait(void)
  168. {
  169.     DATAPORT=0xff;       //讀LCD前若單片機輸出低電平,而讀出LCD為高電平,則沖突,Proteus仿真會有顯示邏輯黃色
  170.                 LCM_EN=1;
  171.     LCM_RS=0;   
  172.     LCM_RW=1;   
  173.     _nop_();
  174.     _nop_();
  175.                 _nop_();
  176.     while(DATAPORT&BUSY)  
  177.                 {  
  178.                         LCM_EN=0;
  179.                         _nop_();
  180.                         _nop_();
  181.                         LCM_EN=1;
  182.                         _nop_();
  183.                         _nop_();
  184.     }  
  185.     LCM_EN=0;

  186. }
  187. /**********LCM??????***********/
  188. void initLCM( )
  189. {   
  190.          DATAPORT=0;
  191.          delay(15);
  192.          WriteCommandLCM(0x38,0);            //三次顯示模式,不檢測忙信號
  193.                 delay(5);
  194.     WriteCommandLCM(0x38,0);
  195.     delay(5);
  196.     WriteCommandLCM(0x38,0);
  197.     delay(5);
  198.     WriteCommandLCM(0x38,1);            //8bit數據傳送,兩行顯示,5*7字型,檢測忙信號
  199.     WriteCommandLCM(0x08,1);            //關閉顯示,檢測忙信號
  200.     WriteCommandLCM(0x01,1);            //清屏,檢測忙信號
  201.     WriteCommandLCM(0x06,1);            //顯示光標右移設置
  202.     WriteCommandLCM(0x0c,1);            //顯示屏打開,光標不顯示,不閃爍,檢測忙信號
  203. }
  204. /****??????????????****/
  205. void DisplayOneChar(uchar X,uchar Y,uchar DData)
  206. {
  207.     Y&=1;
  208.     X&=15;
  209.     if(Y)X|=0x40;                    //若Y為1(顯示第二行)地址譯碼+0x40
  210.     X|=0x80;                          //指令碼為地址碼+0x80
  211.     WriteCommandLCM(X,0);
  212.     WriteDataLCM(DData);
  213. }
  214. /*******??????????????*****/

  215. void DisplayListChar(uchar X,uchar Y,uchar code *DData)
  216. {
  217.     uchar ListLength=0;
  218.     Y&=0x01;
  219.     X&=0x0f;
  220.     while(X<16)
  221.     {
  222.         DisplayOneChar(X,Y,DData[ListLength]);
  223.         ListLength++;
  224.         X++;
  225.     }
  226. }
  227. /*****************???????*****************/
  228. void display(void)
  229. {
  230.                 WriteCommandLCM(0x0c,1);               //顯示屏打開,光標不顯示,不閃爍,檢測忙信號
  231.                 DisplayListChar(0,0,str0);
  232.                 DisplayListChar(0,1,str1);

  233.                 DisplayOneChar(7,0,press_bai+0x30);
  234.                 DisplayOneChar(8,0,press_shi+0x30);
  235.                 DisplayOneChar(9,0,press_ge +0x30);
  236.                 DisplayOneChar(10,0,056);
  237.     DisplayOneChar(11,0,press_dot+0x30);  
  238. }
  239. void display_zkb(void)
  240. {
  241.         WriteCommandLCM(0x0c,1);
  242.         DisplayListChar(0,1,str1);
  243.                 DisplayOneChar(7,1,ZKB[0]+0x30);
  244.                 DisplayOneChar(8,1,ZKB[1]+0x30);
  245.         delay(1000);                             //穩定顯示
  246. }
  247. /************?ADC0832??************/
  248. uchar Adc0832(unsigned char channel)         //AD轉換,并返回結果
  249. {
  250.     uchar i=0;
  251.     uchar j;
  252.     uint dat=0;
  253.     uchar ndat=0;
  254.     if(channel==0)channel=2;
  255.     if(channel==1)channel=3;
  256.     ADDI=1;
  257.     _nop_();
  258.     _nop_();
  259.     ADCS=0;                //拉低CS端
  260.     _nop_();
  261.     _nop_();
  262.     ADCLK=1;               //拉高CLK端
  263.     _nop_();
  264.     _nop_();
  265.     ADCLK=0;                //拉低CLK端,形成下降沿1
  266.     _nop_();
  267.     _nop_();
  268.     ADCLK=1;                 //拉高CLK端
  269.     ADDI=channel&0x1;
  270.     _nop_();
  271.     _nop_();
  272.     ADCLK=0;                   //拉低CLK端,形成下降沿2
  273.     _nop_();
  274.     _nop_();
  275.     ADCLK=1;                      //拉高CLK端
  276.     ADDI=(channel>>1)&0x1;
  277.     _nop_();
  278.     _nop_();
  279.     ADCLK=0;                         //拉低CLK端,形成下降沿3
  280.     ADDI=1;                 //控制命令結束
  281.     _nop_();
  282.     _nop_();
  283.     dat=0;
  284.     for(i=0;i<8;i++)
  285.     {
  286.         dat|=ADDO;          //收數據
  287.         ADCLK=1;
  288.         _nop_();
  289.         _nop_();
  290.         ADCLK=0;             //形成一次時鐘脈沖
  291.         _nop_();
  292.         _nop_();
  293.         dat<<=1;
  294.         if(i==7)dat|=ADDO;
  295.     }  
  296.     for(i=0;i<8;i++)
  297.     {
  298.         j=0;
  299.         j=j|ADDO;             //收數據
  300.         ADCLK=1;
  301.         _nop_();
  302.         _nop_();
  303.         ADCLK=0;              //形成一次時鐘脈沖
  304.         _nop_();
  305.         _nop_();
  306.         j=j<<7;
  307.         ndat=ndat|j;
  308.         if(i<7)ndat>>=1;
  309.     }
  310.     ADCS=1;               //拉低CS端
  311.     ADCLK=0;               //拉低CLK端
  312.     ADDO=1;                //拉高數據端,回到初始狀態
  313.     dat<<=8;
  314.     dat|=ndat;
  315.     return(dat);
  316. }
  317. void zkb_pro(void)
  318. {
  319.         unsigned int temp;
  320.         temp=100*ad_data/256;
  321.         if(temp>0 && temp<100)
  322.         {
  323.                 ZKB[0]=temp/10;
  324.                 ZKB[1]=temp%10;
  325.         }
  326. }
  327. void data_pro(void)
  328. {
  329.       unsigned int temp;
  330.       float  press;      
  331.                  if(14<ad_data<243)                 //壓力值介于15KPA,到115kpa之間,呈線性變化
  332.                  {      
  333.                                 int vary=ad_data;      //y=(115-15)/(243-13)*X+15kpa   
  334.                          //press=24+ad_data/2.67;
  335.                          press=((10.0/28.1)*vary)+9.3;        //測試時補償值為9.3
  336.                          temp=(int)(press*10);                 //放大10倍,便于后面計算            
  337.                          press_bai=temp/1000;        
  338.                          press_shi=(temp%1000)/100;   
  339.                          press_ge=((temp%1000)%100)/10;  
  340.                          press_dot=((temp%1000)%100)%10;
  341.                         }     
  342.    
  343. }
  344. /*****************?????*******************/

  345. void alarm(void)
  346. {
  347.   if(ad_data>=243)  
  348.         
  349.         {  
  350.                 Alarm_led_red=0;
  351.     a=10000;
  352.     while(a--);
  353.     {
  354.     }
  355.                 Alarm_led_red=1;
  356.     a=10000;
  357.     while(a--);
  358.     {
  359.     }
  360.         }  
  361.    else
  362.       {   Alarm_led_red=1; }
  363.      

  364.    if(ad_data<=15)
  365.       {  Alarm_led_green=0;
  366.     a=10000;
  367.     while(a--);
  368.     {
  369.     }
  370.           Alarm_led_green=1;
  371.     a=10000;
  372.     while(a--);
  373.     {
  374.     }
  375.     }            
  376.       else
  377.       {   Alarm_led_green=1; }   
  378.          
  379. }
  380. uchar duty_cycle(uchar ad_data)
  381. {
  382.         uchar rate;
  383.         
  384.         rate= 100*ad_data/256;
  385.   return(rate);
  386. }

  387. /*  ??????*/
  388. void key_setPWM()
  389. {
  390. if(k1==0)
  391.   {
  392.      delay(20);
  393.          if(k1==0)
  394.          {
  395.          rate++;
  396.                 if(rate>99)rate=99;
  397.          while(!k2);
  398.          }
  399.   }
  400.          if(k2==0)
  401.   {
  402.      delay(20);
  403.          if(k2==0)
  404.          {
  405.                  rate--;
  406.                  if(rate<1)rate=1;
  407.            while(!k2);}
  408.   }
  409. if(k3==0)
  410.   {
  411.      delay(20);
  412.          if(k3==0)
  413.          {
  414.                  rate+=10;
  415.                  if(rate>99)rate=99;
  416.          while(!k3);}
  417.   }
  418.   if(k4==0)
  419.   {
  420.      delay(20);
  421.          if(k4==0)
  422.          {
  423.                  rate-=10;
  424.                  if(rate<1)rate=1;
  425.          while(!k4);
  426.          }
  427.   }
  428. }

  429. /*??????dc,??20Hz????*/
  430. void ConfigPWM(uchar dc)
  431. {
  432.         unsigned long tmp;          //臨時變量
  433.         uint high, low;
  434.         tmp = 11059200/12/20;        //計算一個周期所需的計數值
  435.         high = (tmp*dc)/100;         //計算高電平所需計數值
  436.         low = tmp - high;             //計算低電平所需計數值
  437.         high = 65536 - high + 12;    //計算高電平的定時器重載值并補償中斷延時
  438.         low = 65536 - low + 12;          //計算低電平的定時器重載值并補償中斷延時
  439.         HighRH = (uchar)(high >>8);      //高電平重載值拆分為高低字節
  440.         HighRL = (uchar)high;
  441. ……………………

  442. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
11502測控課設.zip (30.52 KB, 下載次數: 251)

評分

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

查看全部評分

回復

使用道具 舉報

ID:633433 發表于 2019-10-31 19:29 來自手機 | 顯示全部樓層
這個軟件用的什么那,仿真軟件?
回復

使用道具 舉報

ID:633433 發表于 2019-10-31 19:46 | 顯示全部樓層
能不能把仿真圖發給我,我自己畫,我的軟件打不開這個圖,很急的
回復

使用道具 舉報

ID:661659 發表于 2019-12-16 23:00 | 顯示全部樓層
這個有沒有詳細元件的圖片
回復

使用道具 舉報

ID:693671 發表于 2020-3-7 21:52 | 顯示全部樓層
Proteus8也沒打開原理圖,,
回復

使用道具 舉報

ID:732377 發表于 2020-4-18 22:21 | 顯示全部樓層
誰給我發一下程序啊
回復

使用道具 舉報

ID:954370 發表于 2021-7-21 20:22 | 顯示全部樓層
能把仿真圖發給我嗎,我的軟件打不開這個圖,謝謝了
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲午夜精品一区二区三区他趣 | 国产精品久久久久久久久久妞妞 | 日韩一区二区三区视频 | 午夜播放器在线观看 | 国产成人高清 | 亚洲免费在线观看 | 91久久久久久久久久久 | 超碰av人人 | 精品国产乱码久久久久久丨区2区 | 欧美日韩福利视频 | 国产999精品久久久久久 | 请别相信他免费喜剧电影在线观看 | 欧美成人黄色小说 | 中文字幕免费 | 日本不卡高清视频 | 超碰综合 | www.日韩 | 午夜精品 | 婷婷不卡 | av片免费 | 精品国产乱码久久久久久蜜退臀 | 中文字幕在线播放不卡 | 在线视频91 | 久久中文字幕一区 | 污片在线免费观看 | 免费看国产片在线观看 | 天天看夜夜| 亚洲欧美网站 | 国产一区二区影院 | 激情网站在线观看 | 天天想天天干 | 国产精品久久av | 国产精品久久久久久久久久久免费看 | 一区亚洲 | 狠狠插天天干 | 国产一区二区三区四区 | 日韩精品一区在线观看 | 色888www视频在线观看 | 国产亚洲一区二区三区在线观看 | 国产精品国产三级国产aⅴ中文 | 日本男人天堂 |