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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于51單片機的車輛電子秤程序與Proteus仿真圖 六路電子秤取平均值

[復制鏈接]
跳轉到指定樓層
樓主
有六路電子秤取平均值,可現實實時時間,檢測車輛是否停止在合適位置,輪胎下壓力傳感器可獲取車輛質量。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h> //包含NOP空指令函數_nop_
  3. #include <stdio.h>
  4. #include "LCD1602.h"
  5. #include "ds1302.h"

  6. #define uchar unsigned char
  7. #define uint  unsigned int
  8. #define MC 1388
  9. #define BC -5
  10. #define KC 2
  11. //------------------------------ADC0832的引腳------------------------------
  12. sbit ADCS =P2^3;  //ADC0832 chip seclect
  13. sbit ADDI =P2^5;  //ADC0832 k in
  14. sbit ADDO =P2^5;  //ADC0832 k out
  15. sbit ADCLK =P2^4;


  16. sbit RED =P3^6;
  17. sbit LOUD =P2^6;
  18. sbit Motor=P3^7;

  19. //-----------------------------定義ADC0808使用的IO口-----------------------
  20. sbit ST= P3^3;                //啟動信號
  21. sbit EOC=P3^4;                //轉換結束信號
  22. sbit OE= P3^5;                //輸出使能
  23. sbit CLK=P2^7;                //時鐘信號
  24. //-----------------------------定義74LS165使用的IO口-----------------------
  25. sbit SO=P1^0;                //輸出端
  26. sbit SH= P1^1;                //移位控制(低電平有效)
  27. sbit SCK=P1^2;                //時鐘信號
  28. sbit ACS=P1^3;               
  29. sbit BCS= P1^4;               
  30. sbit CCS=P1^5;               
  31. sbit ALE=P1^6;        
  32. void delaynms(uint x);
  33. void adc0808(unsigned char channel);
  34. void Delay_ms(unsigned int n);
  35. unsigned int Adc0832(unsigned char channel);
  36. void Display_weight(void);
  37. void Display_IRrd(void);
  38. uchar one_weight(uchar count);
  39. float avr_weight(void);
  40. void Tishi(void);
  41. //void display_D(uint x);
  42. unsigned char HC165(void);
  43. uint ad_0809,a4=0;
  44. float weight1;
  45. unsigned int weight2;
  46. //uchar table[]="D:     ";
  47. uchar table1[]="W:   . t D:     ";
  48. char DisplayData[18]="22  -     :  :   ";

  49. void datapros()         
  50. {
  51.   Ds1302ReadTime();      //反饋時間TIME

  52.   DisplayData[2] = TIME[4]/16+0x30;
  53.   DisplayData[3] = (int)(TIME[4]&0x0f)+0x30;                        //月

  54.   DisplayData[5] = TIME[3]/16+0x30;
  55.   DisplayData[6] = (int)(TIME[3]&0x0f)+0x30;     //日
  56.         
  57.         DisplayData[8] = TIME[2]/16+0x30;                                                        //時
  58.         DisplayData[9] = (int)(TIME[2]&0x0f)+0x30;        
  59.         

  60.         DisplayData[11] = TIME[1]/16+0x30;                                                //分
  61.         DisplayData[12] = (int)(TIME[1]&0x0f)+0x30;        

  62.         DisplayData[14] = TIME[0]/16+0x30;                                                //秒
  63.         DisplayData[15] = (int)(TIME[0]&0x0f)+0x30;
  64. }



  65. void main()
  66. {
  67.         int i;
  68.   Init_LCD1602();
  69. //        RED=0;
  70.         TMOD=0x02;                                //T0工作模式2
  71.         TH0=0x14;               
  72.         TL0=0x14;
  73.         ET0=1;
  74.         EA=1;//允許中斷
  75.         TR0=1;
  76.         SCK = 1;
  77.         SH = 0;//讀
  78.         SH = 1;//暫停讀
  79. while(1)
  80. {
  81.   //-------------時間顯示-------------------
  82.         datapros();                                                 //數據處理函數        
  83.         LCD1602_write_com(0x80);
  84.         for(i=0;i<18;i++)
  85.         {
  86.                 LCD1602_write_data(DisplayData[i]);
  87.         }
  88.         //-------------距離和重量-----------------
  89.         
  90.         LCD1602_write_com(0x80+0x40);//屏幕顯示命令
  91.         Display_IRrd();
  92.         Display_weight();//稱重
  93.         Tishi();//報警
  94. }
  95. }

  96. void Timer0_INT() interrupt 1
  97. {
  98.         CLK=~CLK;
  99. }

  100. //-------------------------------給ad8080延時函數------------------------------
  101. void delaynms(uint x)        
  102. {
  103. while(x-->0)
  104.         {
  105.           unsigned char k;
  106.           for(k=10;k>0;k--);
  107.         }
  108. }
  109. //------------------------------顯示距離函數----------------------------

  110. void adc0808(unsigned char channel)
  111. {
  112.                
  113.                 if(channel==0)        {ACS=0;BCS= 0;CCS=0;}//0/0
  114.     else if(channel==1)        {ACS=1;BCS= 0;CCS=0;}//4/1
  115.                 else if(channel==2)        {ACS=0;BCS= 1;CCS=0;}//2/2
  116.     else if(channel==3)        {ACS=1;BCS= 1;CCS=0;}//6/3
  117.                 else if(channel==4)        {ACS=0;BCS= 0;CCS=1;}//1/4
  118.     else if(channel==5)        {ACS=1;BCS= 0;CCS=1;}//5/5
  119.                 OE=0;
  120.                 ALE=1;
  121.                 ST=1;
  122.                 ALE=0;
  123.                 ST=0;
  124.                 while(!EOC);
  125.                 OE=1;
  126.                
  127.         //        display_D(HC165());                //顯示轉換的數據
  128. }

  129. //-----------------------------讀拓展芯片?---------------------------
  130. unsigned char HC165(void)
  131. {
  132.   unsigned char i;
  133.     unsigned char Temp, Temp1;
  134.     SCK = 1;
  135.     SH = 0;        //HC165???
  136.     SH = 1;        //??HC165???
  137.     Temp1 = 0;
  138.     if(SO == 1)
  139.                 {
  140.                         Temp1 |= 0x01;
  141.                 }
  142.                 for(i = 0;i < 7;i++)
  143.     {   
  144.         SCK = 0;  
  145.         SCK = 1;  
  146.         Temp1 <<= 1;
  147.         if(SO == 1)
  148.         {
  149.             Temp1 |= 0x01;
  150.         }
  151.     }
  152.         SCK = 0;  
  153.                  Temp = Temp1;
  154.   return(Temp);;
  155.         }
  156. //----------------MS延時函數(12M晶振下測試)--------------------------------

  157. void Delay_ms(unsigned int n)
  158. {
  159.         unsigned int  i,j;
  160.         for(i=0;i<n;i++)
  161.                 for(j=0;j<123;j++);
  162. }

  163. //-------------------顯示物體重量-------------------------------

  164. void Display_weight(void)
  165. {
  166.                 unsigned int i;
  167.                 weight1 = avr_weight();
  168.                 weight2=(int)(weight1*10);//         放大10倍,便于后面的計算
  169.                
  170.                 table1[2]=(weight2/1000)+0x30;
  171.                 table1[3]=(weight2%1000)/100+0x30;
  172.                 table1[4]=((weight2%1000)%100)/10+0x30;
  173.                 table1[6]=((weight2%1000)%100)%10+0x30;
  174.         for(i=0;i<16;i++)
  175.         {
  176.                 LCD1602_write_data(table1[i]);
  177.         }
  178.         
  179. }
  180. //-------------------計算單重量-----------------------------
  181. uchar one_weight(uchar count)
  182. {        
  183.          float  press;
  184.          unsigned char weight;
  185.         adc0808(count);
  186.         weight = HC165();
  187.          if(14<weight<243)        //有效值的范圍                  當壓力值介于15kpa到115kpa之間時,遵循線性變換            
  188.                  {        
  189.                 int        vary=weight;
  190.                 press=((10.0/23.0)*vary)+9.3;//公式測試時補償值為9.3
  191.                 }
  192.         return press;
  193.         
  194. }
  195. //-------------------計算平均重量-----------------------------
  196. float avr_weight(void)
  197. {
  198.         float  w1,w2,w3,w4,w5,w6,w_avr;
  199.         w1=one_weight(0);
  200.         Delay_ms(100);
  201.         w2=one_weight(1);
  202.         Delay_ms(100);
  203.         w3=one_weight(2);
  204.         Delay_ms(100);
  205.         w4=one_weight(3);
  206.         Delay_ms(100);
  207.         w5=one_weight(4);
  208.         Delay_ms(100);
  209.         w6=one_weight(5);
  210.         Delay_ms(100);
  211.         w_avr = (w1+w2+w3+w4+w5+w6)/6.0;
  212.         return w_avr;
  213.         
  214. }
  215. //-------------------顯示紅外距離-------------------------------
  216. void Display_IRrd(void)
  217. {
  218.   unsigned char d=0;
  219.         d= Adc0832(0);
  220.         d = ( (MC*1.0) / ((d+BC)*1.0) ) - (KC*1.0);
  221.         table1[11]=d/100+0x30;                //百位
  222.         table1[12]=(d%100)/10+0x30;        //十位
  223.         table1[13]=d%10+0x30;                        //個位
  224. }
  225. //--------------------采集并返回--------------------------------
  226. unsigned int Adc0832(unsigned char channel)     //AD轉換,返回結果
  227. {
  228.     unsigned char i=0;
  229.     unsigned char j;
  230.     unsigned int dat=0;
  231.     unsigned char ndat=0;

  232.     if(channel==0)channel=2;
  233.     if(channel==1)channel=3;
  234.         
  235.     ADDI=1;
  236.     _nop_();
  237.     _nop_();
  238.     ADCS=0;//拉低CS端
  239.     _nop_();
  240.     _nop_();
  241.     ADCLK=1;//拉高CLK端
  242.     _nop_();
  243.     _nop_();
  244.     ADCLK=0;//拉低CLK端,形成下降沿1
  245.     _nop_();
  246.     _nop_();
  247.     ADCLK=1;//拉高CLK端
  248.     ADDI=channel&0x1;
  249.     _nop_();
  250.     _nop_();
  251.     ADCLK=0;//拉低CLK端,形成下降沿2
  252.     _nop_();
  253.     _nop_();
  254.     ADCLK=1;//拉高CLK端
  255.     ADDI=(channel>>1)&0x1;
  256.     _nop_();
  257.     _nop_();
  258.     ADCLK=0;//拉低CLK端,形成下降沿3
  259.     ADDI=1;//控制命令結束
  260.     _nop_();
  261.     _nop_();
  262.     dat=0;
  263.     for(i=0;i<8;i++)
  264.     {
  265.         dat|=ADDO;//收數據
  266.         ADCLK=1;
  267.         _nop_();
  268.         _nop_();
  269.         ADCLK=0;//形成一次時鐘脈沖
  270.         _nop_();
  271.         _nop_();
  272.         dat<<=1;
  273.         if(i==7)dat|=ADDO;
  274.     }  
  275.     for(i=0;i<8;i++)
  276.     {
  277.         j=0;
  278.         j=j|ADDO;//收數據
  279.         ADCLK=1;
  280.         _nop_();
  281.         _nop_();
  282.         ADCLK=0;//形成一次時鐘脈沖
  283.         _nop_();
  284.         _nop_();
  285.         j=j<<7;
  286. ……………………

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

Keil代碼與Proteus8.13仿真下載:
電子秤V2.0.zip (447.2 KB, 下載次數: 42)

評分

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

查看全部評分

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久99精品国产自在现线小黄鸭 | 久久久久精 | 精品亚洲视频在线 | 国色天香综合网 | 成人久久久 | 久久亚洲一区二区三区四区 | 一级免费毛片 | 亚洲精品久久久 | 久久国产日韩欧美 | 成人在线视频一区二区三区 | 91精品久久久久久久久 | 欧美日韩高清一区二区三区 | 久久久蜜桃 | 成人在线观看亚洲 | 日本理论片好看理论片 | 国产精品视频一区二区三区不卡 | 欧美成人h版在线观看 | 日韩欧美在 | 久久国产电影 | 中文字幕在线观看一区二区 | 国产精品国产a级 | aaa级片| 一区不卡在线观看 | 中国美女av | 精品av天堂毛片久久久借种 | 一级黄色片美国 | 婷婷久久五月天 | 99国产精品久久久 | 午夜在线精品 | 人人爽人人爽人人片av | 色综合久久久 | 日本天堂一区 | 黄色一级视频免费 | 可以免费观看的av片 | 欧美一区二区三区在线视频 | 国产一区二区日韩 | 成人av免费| 中文字幕av在线一二三区 | 国产欧美日韩二区 | a黄在线观看 | 精品一区av |