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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 3818|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

基于單片機(jī)的車輛超載監(jiān)測(cè)系統(tǒng)(電子地秤)仿真與源碼

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
車輛超載檢測(cè)仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)



電子地秤單片機(jī)源程序如下:


  1. //線性區(qū)間標(biāo)度變換公式:    y=(115-15)/(243-13)*X+15kpa   


  2. #include <AT89X52.h>
  3. #include <intrins.h>
  4. #include <stdio.h>


  5. #define R24C04ADD 0xA1
  6. #define W24C04ADD 0xA0

  7. //ADC0832的引腳
  8. sbit ADCS =P2^2;  //ADC0832 chip seclect
  9. sbit ADDI =P2^4;  //ADC0832 k in
  10. sbit ADDO =P2^4;  //ADC0832 k out
  11. sbit ADCLK =P2^3;  //ADC0832 clock signal


  12. sbit SDA = P2 ^ 1;                                //數(shù)據(jù)線
  13. sbit SCL = P2 ^ 0;                                //時(shí)鐘線
  14. bit bAck;                                          //應(yīng)答標(biāo)志 當(dāng)bbAck=1是為正確的應(yīng)答

  15. unsigned char dispbitcode[8]={0xf7,0xfb,0xfd,0xfe,0xef,0xdf,0xbf,0x7f};  //位掃描
  16. unsigned char dispcode[11]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff};  //共陽(yáng)數(shù)碼管字段碼
  17. unsigned char dispbuf[4];
  18. unsigned int temp;
  19. unsigned char getdata; //獲取ADC轉(zhuǎn)換回來(lái)的值


  20. void delay_1ms(void)  //12mhz delay 1.01ms
  21. {
  22.    unsigned char x,y;   
  23.    x=3;
  24.    while(x--)
  25.   {
  26.        y=40;
  27.        while(y--);
  28.     }
  29. }
  30. void display(void)  //數(shù)碼管顯示函數(shù)
  31. {
  32.   char k;
  33.   for(k=0;k<4;k++)
  34.   {

  35.   P1 = dispbitcode[k];
  36.   P0 = dispcode[dispbuf[k]];
  37.   if(k==1)          //加上數(shù)碼管的dp小數(shù)點(diǎn)
  38.           P0&=0x7f;
  39.   delay_1ms();         
  40.   }
  41. }

  42. /************
  43. 讀ADC0832函數(shù)
  44. ************/

  45. //采集并返回
  46. unsigned int Adc0832(unsigned char channel)     //AD轉(zhuǎn)換,返回結(jié)果
  47. {
  48.     unsigned char i=0;
  49.     unsigned char j;
  50.     unsigned int dat=0;
  51.     unsigned char ndat=0;

  52.     if(channel==0)channel=2;
  53.     if(channel==1)channel=3;
  54.     ADDI=1;
  55.     _nop_();
  56.     _nop_();
  57.     ADCS=0;//拉低CS端
  58.     _nop_();
  59.     _nop_();
  60.     ADCLK=1;//拉高CLK端
  61.     _nop_();
  62.     _nop_();
  63.     ADCLK=0;//拉低CLK端,形成下降沿1
  64.     _nop_();
  65.     _nop_();
  66.     ADCLK=1;//拉高CLK端
  67.     ADDI=channel&0x1;
  68.     _nop_();
  69.     _nop_();
  70.     ADCLK=0;//拉低CLK端,形成下降沿2
  71.     _nop_();
  72.     _nop_();
  73.     ADCLK=1;//拉高CLK端
  74.     ADDI=(channel>>1)&0x1;
  75.     _nop_();
  76.     _nop_();
  77.     ADCLK=0;//拉低CLK端,形成下降沿3
  78.     ADDI=1;//控制命令結(jié)束
  79.     _nop_();
  80.     _nop_();
  81.     dat=0;
  82.     for(i=0;i<8;i++)
  83.     {
  84.         dat|=ADDO;//收數(shù)據(jù)
  85.         ADCLK=1;
  86.         _nop_();
  87.         _nop_();
  88.         ADCLK=0;//形成一次時(shí)鐘脈沖
  89.         _nop_();
  90.         _nop_();
  91.         dat<<=1;
  92.         if(i==7)dat|=ADDO;
  93.     }  
  94.     for(i=0;i<8;i++)
  95.     {
  96.         j=0;
  97.         j=j|ADDO;//收數(shù)據(jù)
  98.         ADCLK=1;
  99.         _nop_();
  100.         _nop_();
  101.         ADCLK=0;//形成一次時(shí)鐘脈沖
  102.         _nop_();
  103.         _nop_();
  104.         j=j<<7;
  105.         ndat=ndat|j;
  106.         if(i<7)ndat>>=1;
  107.     }
  108.     ADCS=1;//拉低CS端
  109.     ADCLK=0;//拉低CLK端
  110.     ADDO=1;//拉高數(shù)據(jù)端,回到初始狀態(tài)
  111.     dat<<=8;
  112.     dat|=ndat;
  113.     return(dat);            //return ad k
  114. }

  115. //啟動(dòng)I2C總線,即發(fā)送起始條件
  116. void StartI2C()
  117. {
  118.         SDA = 1;                              //發(fā)送起始條件數(shù)據(jù)信號(hào)
  119.         _nop_();
  120.         SCL = 1;
  121.         _nop_();                                    //起始建立時(shí)間大于4.7us
  122.         _nop_();
  123.         _nop_();
  124.         _nop_();
  125.         _nop_();
  126.         SDA = 0;                              //發(fā)送起始信號(hào)
  127.         _nop_();
  128.         _nop_();
  129.         _nop_();
  130.         _nop_();
  131.         _nop_();
  132.         SCL = 0;                                //時(shí)鐘操作
  133.         _nop_();
  134.         _nop_();
  135. }
  136. //結(jié)束I2C總線,即發(fā)送I2C結(jié)束條件
  137. void StopI2C()
  138. {
  139.         SDA = 0;                                //發(fā)送結(jié)束條件的數(shù)據(jù)信號(hào)
  140.         _nop_();                                      //發(fā)送結(jié)束條件的時(shí)鐘信號(hào)
  141.         SCL = 1;                                //結(jié)束條件建立時(shí)間大于4us
  142.         _nop_();
  143.         _nop_();
  144.         _nop_();
  145.         _nop_();
  146.         _nop_();
  147.         SDA = 1;                                //發(fā)送I2C總線結(jié)束命令
  148.         _nop_();
  149.         _nop_();
  150.         _nop_();
  151.         _nop_();
  152.         _nop_();        
  153. }
  154. //發(fā)送一個(gè)字節(jié)的數(shù)據(jù)
  155. void        SendByte(unsigned char c)
  156. {
  157.         unsigned char BitCnt;
  158.         for(BitCnt = 0;BitCnt < 8;BitCnt++)                                  //一個(gè)字節(jié)
  159.                 {
  160.                         if((c << BitCnt)& 0x80) SDA = 1;                   //判斷發(fā)送位
  161.                         else        SDA = 0;
  162.                         _nop_();
  163.                         SCL = 1;                              //時(shí)鐘線為高,通知從機(jī)開(kāi)始接收數(shù)據(jù)
  164.                         _nop_();
  165.                         _nop_();
  166.                         _nop_();
  167.                         _nop_();
  168.                         _nop_();
  169.                         SCL = 0;
  170.                 }
  171.         _nop_();
  172.         _nop_();
  173.         SDA = 1;                                                //釋放數(shù)據(jù)線,準(zhǔn)備接受應(yīng)答位
  174.         _nop_();
  175.         _nop_();
  176.         SCL = 1;
  177.         _nop_();
  178.         _nop_();
  179.         _nop_();
  180.         if(SDA == 1) bAck =0;
  181.         else bAck = 1;                                                //判斷是否收到應(yīng)答信號(hào)
  182.         SCL = 0;
  183.         _nop_();
  184.         _nop_();
  185. }
  186. //接收一個(gè)字節(jié)的數(shù)據(jù)
  187. unsigned char RevByte()
  188. {
  189.         unsigned char retc;
  190.         unsigned char BitCnt;
  191.         retc = 0;
  192.         SDA = 1;
  193.         for(BitCnt=0;BitCnt<8;BitCnt++)
  194.         {
  195.                 _nop_();
  196.                 SCL = 0;                                            //置時(shí)鐘線為低,準(zhǔn)備接收
  197.                 _nop_();
  198.                 _nop_();
  199.                 _nop_();
  200.                 _nop_();
  201.                 _nop_();
  202.                 SCL = 1;                                            //置時(shí)鐘線為高使得數(shù)據(jù)有效
  203.                 _nop_();
  204.                 _nop_();
  205.                 retc = retc << 1;                                    //左移補(bǔ)零
  206.                 if (SDA == 1)
  207.                 retc = retc + 1;                                     //當(dāng)數(shù)據(jù)為1則收到的數(shù)據(jù)+1
  208.                 _nop_();
  209.                 _nop_();
  210.         }
  211.         SCL = 0;
  212.         _nop_();
  213.         _nop_();
  214.         return(retc);                                   //返回收到的數(shù)據(jù)
  215. }

  216. //WChipAdd:寫器件地址;RChipAdd:讀器件地址;InterAdd:內(nèi)部地址;如寫正確則返回?cái)?shù)據(jù),
  217. //否則返回對(duì)應(yīng)錯(cuò)誤步驟序號(hào)
  218. //向指定器件的內(nèi)部指定地址發(fā)送一個(gè)指定字節(jié)
  219. unsigned char WIICByte(unsigned char WChipAdd,unsigned char InterAdd,unsigned char WIICData)
  220. {
  221.         StartI2C();                                                                                      //啟動(dòng)總線
  222.         SendByte(WChipAdd);                                                        //發(fā)送器件地址以及命令
  223.         if (bAck==1)                                                                                          //收到應(yīng)答
  224.         {
  225.                 SendByte(InterAdd);                                                                //發(fā)送內(nèi)部子地址
  226.                 if (bAck ==1)
  227.                 {
  228.                         SendByte(WIICData);                                                        //發(fā)送數(shù)據(jù)
  229.                         if(bAck == 1)
  230.                         {
  231.                                 StopI2C();                    //停止總線
  232.                                 return(0xff);
  233.                         }
  234.                         else
  235.                         {
  236.                                 return(0x03);
  237.                         }                        
  238.                 }
  239.                 else
  240.                 {
  241.                         return(0x02);
  242.                 }
  243.         }
  244.         return(0x01);
  245. }
  246. //讀取指定器件的內(nèi)部指定地址一個(gè)字節(jié)數(shù)據(jù)
  247. unsigned char RIICByte(unsigned char WChipAdd,unsigned char RChipAdd,unsigned char InterDataAdd)
  248. {
  249.         unsigned char TempData;        
  250.         TempData = 0;
  251.         StartI2C();                                                                        //啟動(dòng)
  252.         SendByte(WChipAdd);                                                    //發(fā)送器件地址以及讀命令
  253.         if (bAck==1)                                                                            //收到應(yīng)答
  254.         {
  255.                 SendByte(InterDataAdd);                                        //發(fā)送內(nèi)部子地址
  256.                 if (bAck ==1)
  257.                 {
  258.                         StartI2C();
  259.                         SendByte(RChipAdd);        
  260.                         if(bAck == 1)
  261.                         {
  262.                                 TempData = RevByte();       //接收數(shù)據(jù)
  263.                                 StopI2C();                  //停止I2C總線
  264.                                 return(TempData);           //返回?cái)?shù)據(jù)
  265.                         }
  266.                         else
  267.                         {
  268.                                 return(0x03);
  269.                         }        
  270.                 }
  271.                 else
  272.                 {
  273.                         return(0x02);
  274.                 }
  275.         }
  276.         else
  277.         {
  278.                 return(0x01);
  279.         }
  280. }


  281. void main(void)
  282. {
  283.   unsigned int OverCounter = 0;
  284.   unsigned char ptemp;
  285.   bit OverFlg = 0;
  286.   unsigned int temp,ppress = 0;
  287.   float  press;        
  288.   while(1)
  289.   {         
  290.                      
  291.           getdata=Adc0832(0);
  292.           if(14<getdata<243)                                       //當(dāng)壓力值介于15kpa到115kpa之間時(shí),遵循線性變換
  293.                  {                           
  294.                   int vary=getdata;                                                //y=(115-15)/(243-13)*X+15kpa                        
  295.                         press=((10.0/23.0)*vary)+9.3;                        //測(cè)試時(shí)補(bǔ)償值為9.3                                                                                                         
  296.                         temp=(int)(press*10);                  //放大10倍,便于后面的計(jì)算
  297.       if(temp != ppress)
  298.       {
  299.         ppress = temp;
  300.         OverFlg = 1;
  301.       }                                                                                            
  302.                         dispbuf[3]=temp/1000;                                     //取壓力值百位
  303.                         dispbuf[2]=(temp%1000)/100;                            //取壓力值十位
  304.                         dispbuf[1]=((temp%1000)%100)/10;                    //取壓力值個(gè)位
  305.                         dispbuf[0]=((temp%1000)%100)%10;                        //取壓力值十分位
  306.                         display();
  307.       if (temp > 100)
  308.       {
  309.           if(OverFlg == 1)    //如果是新的一輛車通過(guò)
  310.           {
  311.             OverCounter++;
  312.             WIICByte(W24C04ADD,0x01,(OverCounter/0xff));    //低位
  313. ……………………

  314. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

Keil代碼與Proteus8.8仿真下載:
車輛超重監(jiān)測(cè)系統(tǒng).7z (59.69 KB, 下載次數(shù): 84)


評(píng)分

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

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:362692 發(fā)表于 2019-10-28 23:52 來(lái)自手機(jī) | 只看該作者
非常不錯(cuò)的資料
回復(fù)

使用道具 舉報(bào)

板凳
ID:1033274 發(fā)表于 2022-6-8 17:49 | 只看該作者
需要用Proteus8.8打開(kāi)
回復(fù)

使用道具 舉報(bào)

地板
ID:63541 發(fā)表于 2022-6-21 19:02 | 只看該作者
用Proteus8.8可以打開(kāi)謝謝!
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久成人一区 | 免费在线观看毛片 | 在线免费观看黄色网址 | 亚洲成人综合在线 | 国产精品美女久久久久久不卡 | 美女天堂 | 免费黄色片视频 | 国产成人精品一区二区三区在线 | 亚洲一区二区三区 | av在线一区二区三区 | 九色 在线| 中文字幕一区二区三区四区五区 | 欧美美女爱爱 | 免费视频二区 | 久久久亚洲一区 | 在线观看亚洲一区二区 | 99视频免费在线观看 | 久久性色| 三a毛片 | 国产一区二区三区久久久久久久久 | 四虎影院一区二区 | 精品欧美一区二区三区久久久 | 欧美一区二区三区在线 | 欧美性猛交一区二区三区精品 | 国产视频久久 | 亚洲第一网站 | 在线观看中文字幕 | 久久久久久久久久久高潮一区二区 | 91国内产香蕉 | 天天影视网天天综合色在线播放 | 久久33 | 91精品在线看 | 黄色网址在线免费播放 | 日韩视频a| 亚洲精品二区 | 国产亚洲精品久久yy50 | 一本色道精品久久一区二区三区 | 四虎影视| 神马影院一区二区三区 | 国产真实乱全部视频 | 九九热这里只有精品在线观看 |