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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5528|回復: 2
收起左側

單片機傳送帶計數器(LED顯示)仿真+程序源碼+設計報告

[復制鏈接]
ID:328014 發表于 2018-7-1 03:58 | 顯示全部樓層 |閱讀模式
0.png

全部資料51hei下載地址:
傳送帶計數器.rar (336.62 KB, 下載次數: 102)


摘要
    本設計采用89C51單片機作為主控制器,用獨立按鍵設置傳送帶產品計數目標值,用繼電器控制電機的啟動,通過超聲波模塊檢測距離變化得到的的計數值通過緩沖器74LS244 送到4位7段LED數碼管,以實現對產品的計數顯示。當計數值達到預置值時,停止計數且電機停止運轉。文中詳細論述了傳送帶產品計數器的設計原理,電路原理圖和程序設計方案。

目錄

題目1
任務設計1
21   設計目的1
22   設計要求1
三.系統硬件設計1
31   傳送帶計數器(LED顯示)電路原理圖1
32   單片機模塊1
33   電源模塊2
34   LED顯示模塊2
35   按鍵模塊3
36   超聲波模塊3
37   電機控制模塊3
四.軟件系統設計 3
41   C51程序4
仿真即調試13
51   仿真圖13
52   PCB圖14
53   3D效果圖14
六.總結15
七.參考文獻15


一.
題目

設計題目:傳送帶計數器(LED顯示)

二.任務設計:

2.1   設計目的

    傳送帶產品計數器廣泛應用于工業生產中對各種產品的成件計數,確保了計數的準確性,減少了人為計數的誤差,提高了生產效率。在工業生產中對產品的成批包裝,管理具有很強的實用性,特別是對批量產品的計數有非常重要的意義。

2.2   設計要求

用AT89C51系列單片機作為控制器;采用4位LED進行計數顯示;采用超聲波傳感器計數;用獨立按鍵控制傳送帶電機的啟停和計數,計數到預定值時,傳送帶停止,按鍵后傳送帶繼續運行。

  • 系統硬件設計

硬件電路是系統設計的主要組成部分,各個部分硬件電路的組成就是整個系統各個功能模塊的組成。

3.1   傳送帶計數器(LED顯示)電路原理圖

硬件原理圖如下圖所示,包括電源模塊,顯示模塊,按鍵模塊,超聲波模塊和電機控制模塊。


3.2   單片機模塊(AT89C51)

AT89C51是一種帶4K字節FLASH存儲器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低電壓、高性能CMOS 8位微處理器,俗稱單片機。AT89C2051是一種帶2K字節閃存可編程可擦除只讀存儲器的單片機。單片機的可擦除只讀存儲器可以反復擦除1000次。該器件采用ATMEL高密度非易失存儲器制造技術制造,與工業標準的MCS-51指令集和輸出管腳相兼容。由于將多功能8位CPU和閃速存儲器組合在單個芯片中,ATMEL的AT89C51是一種高效微控制器,AT89C051是它的一種精簡版本。AT89C51單片機為很多嵌入式控制系統提供了一種靈活性高且價廉的方案。(圖3-1)

                圖3-1     

                                                           圖3-2

3.3   電源模塊                                       

電源部分采用5v直流穩壓電源,晶振電路提供時鐘信號,復位電路使程序計數器清零。

(圖3-2)

3.4    LED顯示模塊
使用4位7段數碼管來顯示數字,通過74LS244來驅動數碼管。



3.5   按鍵模塊
每個按鍵各接一根輸入線,一根輸入線上的按鍵工作狀態不會影響其他輸入線上的輸入狀態。軟件設計采用查詢方式和外部中斷相結合的方法來設計,低電平有效。按鍵直接與89C51的I/O口線相連接,通過讀I/O口的電平狀態,即可識別出按下的按鍵。                                                                     


3.6   超聲波模塊

通過超聲波模塊測距計數,距離小于5且信號燈未亮時代表檢測到貨并計數,大于6且信號燈亮起時代表貨物已經過去了,然后在檢測到5以下就又會計數。(允許誤差和延時)



3.7   電機控制模塊

利用三極管放大電流,繼電器來控制電機以控制傳送帶的啟停。



  • 軟件系統設計

軟件設計就是編寫能使單片機運行并控制外圍電路的程序,然后把程序導入單片機,對單片機進行控制,以完成硬件的功能。利用軟件完成了各個按鍵要實現的功能、控制了繼電器的斷開和閉合以及顯示電路顯示結果,最后把所有的子程序揉合到一塊就控制了整個系統的運行。



  • 仿真即調試

5.1   仿真圖

5.2   PCB圖

                                   布線層打印效果

5.3   3D效果圖

  • 總結

    本設計是關于傳送帶產品計數器的設計。在設計中,以AT89C51單片機作為主控制器,可以通過獨立按鍵進行預置數,方便靈活,并且可以在4位LED上顯示當前計數值,通過按鍵來控制傳送帶電機的啟動,操作靈活,可以精確的對產品進行計數。由于使用了超聲波模塊進行測距,所以控制起來很安全,不會發生意外事故。由于采用的是獨立按鍵進行預置數,所以計數范圍需要手動設置,這是本設計的一個不足之處,不能夠進行大范圍計數(手會累),但是對于小批量的產品計數具有很好的實用性。

雖然,在硬件電路設計中我們遇到了很多問題,但通過我們的努力,最終都一一解決了。最困難的我想應該是PCB板的制作和軟件編程。PCB板的制作是以前我們沒有接觸太多的,這次為了能制作出實物圖,我們就又認真學了PCB的制作,中間有很多不懂的問題,都通過詢問老師同學和反復實踐解決了,最后我們終于制作出了很好的板子。如果說硬件電路是軀體的話,那么軟件就是血液,軟件編程的正確與否,直接導致了硬件電路功能的實現。程序調試過程中,出現了設置過程中數碼管不能閃動、出現誤計數的現象。這些都通過增大延時解決了。

    我們所做的有關傳送帶計數包裝的設計雖然滿足了基本的要求,但還存在著一些不足,比如用獨立按鍵進行預置數,每次按鍵值增加一個數值會耗費大量時間;我們不經過計時再設計,無法保證貨物是否到位,而且如果貨物之間的間隔不規則,也將會無法控制。另外,我們也沒有考慮掉點保護和單片機抗干擾問題。由于能力有限,很多想法就沒有體現在設計中。



單片機源程序如下:
  1. #include<reg52.h>                //頭文件
  2. #include   <intrins.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char

  5. sbit seg_1=P3^4;//定義數碼管的位選
  6. sbit seg_2=P3^5;
  7. sbit seg_3=P3^6;
  8. sbit seg_4=P3^7;

  9. sbit TX=P2^5;        //超聲波傳感器的接口
  10. sbit RX=P2^6;

  11. sbit LED=P2^7; //指示燈接口
  12. sbit motor=P1^5; //傳送帶電機接口

  13. sbit K1=P1^0; //按鍵接口
  14. sbit K2=P1^1;
  15. sbit K3=P1^2;
  16. sbit K4=P1^3;
  17. sbit K5=P1^4;


  18. uchar code SEG_Table[]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //CC共陰
  19. char dis_data_buf[4]= {0,0,0,0};
  20. uchar counter_buf[4]= {0,0,0,0};
  21. long int set_num=0;
  22. unsigned long int counter_num=0;
  23. uchar start_flag=0;          //開始標志
  24. uchar set_flag=0;//設定計數值得標志                 
  25. uchar key_num=0;  //按鍵值

  26. unsigned int  time=0;  //聲波時間
  27. unsigned int   S=0;          //距離

  28. void Delay_1ms(uint i)//1ms延時
  29. {
  30.   uchar x,j;
  31.   for(j=0; j<i; j++)
  32.     for(x=0; x<=148; x++);
  33. }

  34. //*********************************
  35. //按鍵掃描程序
  36. //mode:0,不支持連續按;1,支持連續按;
  37. //*********************************
  38. uchar KEY_Scan(uchar mode)
  39. {
  40.   static uchar key_up=1;//按鍵按松開標志
  41.   if(mode)key_up=1;  //支持連按
  42.   if(key_up&&(K1==0||K2==0||K3==0||K4==0||K5==0))
  43.   {
  44.     //Delay_1ms(10);//去抖動
  45.     key_up=0;
  46.     if(K1==0)return 1;
  47.     else if(K2==0)return 2;
  48.     else if(K3==0)return 3;
  49.     else if(K4==0)return 4;
  50.     else if(K5==0)return 5;
  51.    
  52.   } else if(K1==1&&K2==1&&K3==1&&K4==1&&K5==1)key_up=1;
  53.   return 0;// 無按鍵按下
  54. }
  55. void diplay(uchar *dis_p)
  56. {
  57.   static uchar temp_num=0;
  58.   static uint flash_time=0;
  59.   P0=SEG_Table[*(dis_p+temp_num)]; //查數組得到數碼管段嗎
  60.   switch(temp_num)
  61.   {
  62.   case 0:
  63.     if(set_flag) //如果是設定狀態下就閃爍
  64.     {
  65.       if(flash_time<50)
  66.       {
  67.         seg_1=0;
  68.         seg_2=1;
  69.         seg_3=1;
  70.         seg_4=1;
  71.       }
  72.       else if(flash_time<100)
  73.       {
  74.         seg_1=1;
  75.         seg_2=1;
  76.         seg_3=1;
  77.         seg_4=1;
  78.       }
  79.       else
  80.       {
  81.         flash_time=0;
  82.       }
  83.     }
  84.     else  //正常顯示千位
  85.     {
  86.       seg_1=0;
  87.       seg_2=1;
  88.       seg_3=1;
  89.       seg_4=1;
  90.     }
  91.     break;
  92.   case 1: //顯示百位
  93.     if(set_flag)
  94.     {
  95.       if(        flash_time<50)
  96.       {
  97.         seg_1=1;
  98.         seg_2=0;
  99.         seg_3=1;
  100.         seg_4=1;
  101.       }
  102.       else if(flash_time<100)
  103.       {
  104.         seg_1=1;
  105.         seg_2=1;
  106.         seg_3=1;
  107.         seg_4=1;
  108.       }
  109.       else
  110.       {
  111.         flash_time=0;
  112.       }
  113.     }
  114.     else
  115.     {
  116.       seg_1=1;
  117.       seg_2=0;
  118.       seg_3=1;
  119.       seg_4=1;
  120.     }
  121.     break;
  122.   case 2://顯示十位
  123.     if(set_flag)
  124.     {
  125.       if(        flash_time<50)
  126.       {
  127.         seg_1=1;
  128.         seg_2=1;
  129.         seg_3=0;
  130.         seg_4=1;
  131.       }
  132.       else if(flash_time<100)
  133.       {
  134.         seg_1=1;
  135.         seg_2=1;
  136.         seg_3=1;
  137.         seg_4=1;
  138.       }
  139.       else
  140.       {
  141.         flash_time=0;
  142.       }
  143.     }
  144.     else
  145.     {
  146.       seg_1=1;
  147.       seg_2=1;
  148.       seg_3=0;
  149.       seg_4=1;
  150.     }
  151.     break;
  152.   case 3://顯示個位
  153.     if(set_flag)
  154.     {
  155.       if(        flash_time<50)
  156.       {
  157.         seg_1=1;
  158.         seg_2=1;
  159.         seg_3=1;
  160.         seg_4=0;
  161.       }
  162.       else if(flash_time<100)
  163.       {
  164.         seg_1=1;
  165.         seg_2=1;
  166.         seg_3=1;
  167.         seg_4=1;
  168.       }
  169.       else
  170.       {
  171.         flash_time=0;
  172.       }
  173.     }
  174.     else
  175.     {
  176.       seg_1=1;
  177.       seg_2=1;
  178.       seg_3=1;
  179.       seg_4=0;
  180.     }
  181.     break;
  182.   }
  183.   Delay_1ms(5);
  184.   
  185.   temp_num++; //循環掃描
  186.   if(temp_num>3) temp_num=0;
  187.   
  188.   flash_time++;           //閃爍的標志
  189.   if(set_flag==0)flash_time=0;

  190.   seg_1=1;          //關閉所有數碼管準備下次顯示
  191.   seg_2=1;
  192.   seg_3=1;
  193.   seg_4=1;
  194. }
  195. void delayms(unsigned int ms)        //延時函數
  196. {
  197.   unsigned char i=100,j;
  198.   for(;ms;ms--)
  199.   {
  200.     while(--i)
  201.     {
  202.       j=10;
  203.       while(--j);
  204.     }
  205.   }
  206. }
  207. void Conut(void)  //計算距離的函數
  208. {
  209.   static uchar  temp1=0,temp2=0,temp3=0;
  210.   time=(TH0<<8)+TL0;
  211.   TH0=0;
  212.   TL0=0;
  213.   S=time/58;     //算出來是CM
  214.   delayms(10);

  215.         if(start_flag)//開始鍵按下的時候才開始計數
  216.         {
  217.             if(S<5)// 距離小于5cm就認為有物體了,要計數
  218.          {
  219.                           
  220.                  temp1++;
  221.                 temp3=0;
  222.                 if(temp1>1)
  223.                 {
  224.                         temp1 =0;
  225.                         if(temp2==0)
  226.                         {
  227.                                 LED=1;//關閉指示燈
  228.                                 temp2=1;
  229.                                 counter_num++;
  230.                                 if(counter_num>9999)counter_num=0; //把計數值分解到數碼管上顯示
  231.                                 counter_buf[0]=counter_num%10000/1000;
  232.                                 counter_buf[1]=counter_num%1000/100;
  233.                                 counter_buf[2]=counter_num%100/10;
  234.                                 counter_buf[3]=counter_num%10;
  235.                         }       
  236.                 }  
  237.          }
  238.          else if(S>6)  //如果距離大于6cm就認為貨已經過去了,清除變來過準備下一次計數
  239.          {
  240.                  
  241.                  temp1=0;
  242.                 temp3++;
  243.                 if(temp3>1)
  244.                 {
  245.                         LED=0;//打開指示燈
  246.                         temp3=0;
  247.                         temp2=0;
  248.                        
  249.                 }
  250.          }
  251.    }                                                                                                             
  252. }

  253. //************************************
  254. //定時器初始化
  255. //初始化為10MS定時器       
  256. //************************************
  257. void Time0_init()
  258. {
  259.   TMOD |= 0x01;                         //使用模式1,16位定時器
  260.   TH0   = 0;        //定時器裝入初始值10ms
  261.   TL0   = 0;
  262.   EA    = 1;  //總中斷
  263.   ET0   = 1;//定時器0初始化
  264.   TR0   = 0;
  265.   
  266. }
  267. //************************************
  268. //定時器初始化
  269. //初始化為60MS定時器       
  270. //************************************
  271. void Time1_init()
  272. {
  273.   TMOD |= 0x10;                         //使用模式1,16位定時器
  274.   TH1   = (65536-6000)/256;        //定時器裝入初始值60ms
  275.   TL1   = (65536-6000)%256;
  276.   EA    = 1;  //總中斷
  277.   ET1   = 1;//定時器1初始化
  278.   TR1   = 1;
  279. }
  280. //

  281. void  StartModule()                          //T1中斷用來掃描數碼管和計800MS啟動模塊
  282. {
  283.   TX=1;                                         //800MS  啟動一次模塊
  284.   _nop_();
  285.   _nop_();
  286.   _nop_();
  287.   _nop_();
  288.   _nop_();
  289.   _nop_();
  290.   _nop_();
  291.   _nop_();
  292.   _nop_();
  293.   _nop_();
  294.   _nop_();
  295.   _nop_();
  296.   _nop_();
  297.   _nop_();
  298.   _nop_();
  299.   _nop_();
  300.   _nop_();
  301.   _nop_();
  302.   _nop_();
  303.   _nop_();
  304.   _nop_();
  305.   TX=0;
  306. }
  307. /********************************************************************
  308. * 名稱 : Main()
  309. * 功能 : 主函數
  310. * 輸入 : 無
  311. * 輸出 : 無
  312. ***********************************************************************/
  313. void Main(void)
  314. {
  315.   uint try=0;
  316.   uchar timeout_flag=0;
  317.   Time0_init();         //初始化定時器
  318.   Time1_init();
  319.   
  320.   while(1)
  321.   {
  322.    
  323.     StartModule();
  324.     while(!RX)                //當RX為零時等待
  325.         {
  326.            try++;
  327.            if(try>6000)         //等待時間不能太長,防止程序死機
  328.            {
  329.              try=0;
  330.             timeout_flag=1;//置位超時標志
  331.                    break;
  332.                 }
  333.         }
  334.         TH0=0;
  335.           TL0=0;
  336.     TR0=1;                            //開啟計數
  337.         if(timeout_flag==0)
  338.         {
  339.             while(RX)                        //當RX為1計數并等待
  340.                 {
  341.                   try++;
  342.                    if(try>6000)          //等待時間不能太長,防止程序死機
  343.                    {
  344.                             try=0;
  345.                                    timeout_flag=1;        //置位超時標志
  346.                                    break;
  347.                         }
  348.                 }
  349.         }
  350.     TR0=0;                                //關閉計數
  351.         if(timeout_flag)//如果超時了
  352.         {
  353.                 TH0=0;
  354.                   TL0=0;
  355.                   timeout_flag=0;
  356.         }
  357.         else//正常數據
  358.         {
  359.             Conut();                        //計算
  360.         }
  361.     delayms(12);                //延時一段時間       
  362.    
  363.   }
  364. }


  365. void time1(void)interrupt 3
  366. {
  367.        
  368.         key_num=KEY_Scan(0); //獲取矩陣按鍵的數值
  369.     switch(key_num)
  370.     {
  371.     case 1:        //開始按鍵
  372.       start_flag=1;
  373.           set_flag=0;
  374.       break;
  375.     case 2:        //停止按鍵
  376.       start_flag=0;
  377.       break;
  378.     case 3://設定計數按鍵
  379.                 if(start_flag==0)
  380.               set_flag=1;
  381.       break;
  382. ……………………

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

回復

使用道具 舉報

ID:367110 發表于 2018-7-8 14:09 | 顯示全部樓層
沒有potues仿真啊
回復

使用道具 舉報

ID:453974 發表于 2019-1-2 22:36 | 顯示全部樓層
仿真不能實現
還我黑幣
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美日韩精品久久久免费观看 | 欧美国产激情二区三区 | 中文字幕日韩欧美一区二区三区 | 成人美女免费网站视频 | 国产一区二区三区免费视频 | 日韩在线欧美 | 精品久久99 | 欧美午夜一区 | 一区二区视频在线 | 国产在线观看一区 | 久久久国产一区 | 久久精品一区二区 | 成年人免费在线视频 | 欧美一级免费 | 国产一在线观看 | 99综合 | 国产乱码久久久久久 | 99热视| 久久国产精品免费一区二区三区 | 国产精品九九九 | 操网站 | 久久99精品久久久久久 | 99久久婷婷国产综合精品电影 | 欧美三级三级三级爽爽爽 | av午夜激情 | 91精品国产综合久久婷婷香蕉 | 成人在线国产 | 亚洲精品九九 | 国产午夜精品一区二区三区 | 一区二区三区四区在线 | 韩国av影院 | 精品一区久久 | 日本在线中文 | 欧美精品二区 | 韩国主播午夜大尺度福利 | 99国内精品久久久久久久 | 国产一区二区在线观看视频 | 免费成人高清在线视频 | 亚洲欧美日韩精品久久亚洲区 | 精品久久久久久久人人人人传媒 | 中文字幕日韩一区 |