找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機產(chǎn)品數(shù)量自動計量系統(tǒng)Proteus仿真程序設(shè)計

[復(fù)制鏈接]
ID:573822 發(fā)表于 2020-1-5 14:41 | 顯示全部樓層 |閱讀模式

1. 設(shè)計要求

如右圖所示,以MCS-51系列單片機為核心設(shè)計一個具有獨創(chuàng)功能的計量控制系統(tǒng),控制瓶裝產(chǎn)品包裝生產(chǎn)流水線,每計滿一定瓶數(shù)產(chǎn)品時發(fā)出一個包裝控制信號,通過相關(guān)電路驅(qū)動包裝機完成一次包裝動作。要求:
1. 每箱產(chǎn)品的瓶數(shù)為51瓶,可記錄已封裝箱數(shù);
2. 系統(tǒng)具有人機交互功能,可由用戶控制流水線工作速度,并實時顯示已計量瓶數(shù)和封裝箱數(shù);
3. 流水線使用48V 2000W直流電機進行傳動,設(shè)計MCU與該電機的接口電路,實現(xiàn)流水線傳動的啟停和速度 控制,并仿真其可行性;
4. 設(shè)計用于檢測瓶子的 傳感器應(yīng)用電路,實現(xiàn)對瓶數(shù)的感測;
5. 包裝機數(shù)據(jù)接口為 RS-485接口,設(shè)計MCU與包裝機的接口電路;
6. 包裝機的數(shù)據(jù)通信采用 10位異步串行通信幀標(biāo)準(zhǔn)格式,即1位起始位、8 位數(shù)據(jù)位、1 個停止位,無奇偶校驗和硬件數(shù)據(jù)流控制,通信波特率為 4800 bps,幀格式為:
SYN Byte
Command Byte
Checksum Byte

每幀包含3個字節(jié),第1個字節(jié)為同步頭字節(jié)“0xAA”,第2個字節(jié)為命令字節(jié)(“0x33”啟動包裝,“0x55”停機),第3個字節(jié)為校驗和(前面兩個字節(jié)的無符號代數(shù)和),設(shè)計、 編寫具體的通信程序并仿真;
7. 創(chuàng)新功能:在達(dá)到51瓶是蜂鳴器鳴叫提醒;
8. 設(shè)計、繪制系統(tǒng)電路PCB,手寫簽名在Top Layer的正中位置。

2. 硬件總體設(shè)計

2.1 總體設(shè)計方案

由設(shè)計要求可知,需使用MCS-51系列單片機,構(gòu)建控制系統(tǒng),實現(xiàn)系統(tǒng)的控制。所以采用AT89C52 單片機為核心,以6個彈跳按鈕和光電傳感器作為輸入端,達(dá)到控制直流電機的正轉(zhuǎn)、反轉(zhuǎn)、停止、加速、減速、數(shù)據(jù)清除及瓶子數(shù)量采集功能,并且由LCD1602顯示模塊可以顯示瓶子數(shù)量、箱子數(shù)量以及電機轉(zhuǎn)速。在設(shè)計中,采用 PWM 技術(shù)對電機進行控制,并通過485通訊協(xié)議控制包裝機的啟停。
該直流電機控制系統(tǒng)的設(shè)計,在總體上大致可分為以下8個部分組成:AT89C52單片機最小系統(tǒng),按鍵輸入模塊,瓶數(shù)檢測模塊,1602顯示模塊,電機驅(qū)動模塊,包裝機控制模塊,包裝機控制模塊以及直流電機。系統(tǒng)總體方案圖如圖 1 所示。
圖 1  系統(tǒng)總體方案圖

2.2 工作原理

2.2.1 電機控制原理

根據(jù)勵磁方式不同, 直流電機分為自勵和他勵兩種類型。 不同勵磁方式的直流電機機械特性曲線有所不同。對于直流電機來說,認(rèn)為機械特性方程式為:
(公式1)
式中U N,φN----------額定電樞電壓、額定磁通量;
Ke,Kt ---與電機有關(guān)的常數(shù);
Rad,Ra -----電樞外加電阻、電樞內(nèi)電阻;
n,△n—理想空載轉(zhuǎn)速、轉(zhuǎn)速降。
分析公式1可得,當(dāng)分別改變UN、φN和Rad時,可以得到不同的轉(zhuǎn)速n,從而實現(xiàn)對速度的調(diào)節(jié)。由于φ=T,當(dāng)改變勵磁電流If時,可以改變磁通量φ的大小,從而達(dá)到變磁通調(diào)速的目的。但由于勵磁線圈發(fā)熱和電動機磁飽和的限制,電動機的勵磁電流If和磁通量φ只能在低于其額定值的范圍內(nèi)調(diào)節(jié),故只能弱磁調(diào)速。而對于調(diào)節(jié)電樞外加電阻 Rad時,會使機械特性變軟,導(dǎo)致電機帶負(fù)載能力減弱。
PWM是通過控制固定電壓的直流電源開關(guān)頻率,從而改變負(fù)載兩端的電壓,進而達(dá)AT89C52輸入模塊電源模塊驅(qū)動模塊直流電機達(dá)到控制要求的一種電壓調(diào)整方法。PWM可到控制要求的一種電壓調(diào)整方法。PWM 可以應(yīng)用在許多方面,如電機調(diào)速、溫度控制、壓力控制等。 在 PWM 驅(qū)動控制的調(diào)整系統(tǒng)中,按一個固定的頻率來接通和斷開電源,并根據(jù)需要改變一個周期內(nèi)“接通”和“斷開”時間的長短。通過改變直流電機電樞上電壓的“占空比”來改變平均電壓的大小,從而控制電動機的轉(zhuǎn)速。因此,PWM 又被稱為“開關(guān)驅(qū)動裝置”。在脈沖作用下,當(dāng)電機通電時,速度增加;電機斷電時,速度逐漸減少。只要按一定規(guī)律,改變通、斷電的時間,即可讓電機轉(zhuǎn)速得到控制。當(dāng)我們改變占空比時,可以得到不同的電機平均速度,從而達(dá)到調(diào)速的目的。以應(yīng)用在許多方面,如電機調(diào)速、溫度控制、壓力控制等。在PWM 驅(qū)動控制的調(diào)整系統(tǒng)中,按一個固定的頻率來接通和斷開電源,并根據(jù)需要改變一個周期內(nèi)“接通”和“斷開”時間的長短。通過改變直流電機電樞上電壓的“占空比”來改變平均電壓的大小,從而控制電動機的轉(zhuǎn)速。因此,PWM又被稱為“開關(guān)驅(qū)動裝置”。在脈沖作用下,當(dāng)電機通電時,速度增加;電機斷電時,速度逐漸減少。只要按一定規(guī)律,改變通、斷電的時間,即可讓電機轉(zhuǎn)速得到控制。當(dāng)我們改變占空比時,可以得到不同的電機平均速度,從而達(dá)到調(diào)速的目的。

2.2.2 光電傳感器原理

光電傳感器是通過把光強度的變化轉(zhuǎn)換成電信號的變化來實現(xiàn)控制的。
光電傳感器在一般情況下,有三部分構(gòu)成,它們分為:發(fā)送器、接收器和檢測電路。
發(fā)送器對準(zhǔn)目標(biāo)發(fā)射光束,發(fā)射的光束一般來源于半導(dǎo)體光源,發(fā)光二極管(LED)、激光二極管及紅外發(fā)射二極管。光束不間斷地發(fā)射,或者改變脈沖寬度。接收器有光電二極管、光電三極管、光電池組成。在接收器的前面,裝有光學(xué)元件如透鏡和光圈等。在其后面是檢測電路,它能濾出有效信號和應(yīng)用該信號。
此外,光電開關(guān)的結(jié)構(gòu)元件中還有發(fā)射板和光導(dǎo)纖維。
三角反射板是結(jié)構(gòu)牢固的發(fā)射裝置。它由很小的三角錐體反射材料組成,能夠使光束準(zhǔn)確地從反射板中返回,具有實用意義。它可以在與光軸0到25的范圍改變發(fā)射角,使光束幾乎是從一根發(fā)射線,經(jīng)過反射后,還是從這根反射線返回。

2.3 AT89C52最小系統(tǒng)

2.3.1 AT89C52芯片簡介

              采用AT89C52是MSC-51系列單片機的升級版,由世界著名半導(dǎo)體公司 ATMEL在購買MSC-51設(shè)計結(jié)構(gòu)后,利用自身優(yōu)勢技術(shù)——閃存生產(chǎn)技術(shù)對舊技術(shù)進行改進和擴展,同時使用新的半導(dǎo)體生產(chǎn)工藝,最終得到成型產(chǎn)品。與此同時,世界上其他的著名公司也通過基本的51內(nèi)核,結(jié)合公司自身技術(shù)進行改進生產(chǎn),推廣了一批如51F020等高性能單片機。AT89C52片內(nèi)集成256字節(jié)程序運行空間, 8K字節(jié)Flash存儲空間,支持最大64k外部存儲擴展。根據(jù)不同的運行速度和功耗的要求,時鐘頻率可以設(shè)置在0-33M之間。片內(nèi)資源有4組I/O控制端口、3個定時器、8個中斷、軟件設(shè)置低耗能模式、看門狗和斷電保護。可以在4V到5.5V寬電壓范圍內(nèi)正常工作。不斷發(fā)展的半導(dǎo)體工藝也讓該單片機的功耗不斷降低。同時,該單片機支持計算機并口下載,簡單的數(shù)字芯片就可以制成下載線,僅僅幾塊錢的價格讓該型號單片機暢銷 10 年不衰。根據(jù)不同場合的要求,這款單片機提供了多種封裝,本次設(shè)計根據(jù)最小系統(tǒng)有時需要更換單片機的具體情況,使用雙列直插PID-40 的封裝。

2.3.2 AT89C52最小系統(tǒng)組成

AT89C52最小系統(tǒng)由AT89C52芯片、復(fù)位電路和時鐘電路組成。復(fù)位電路和時鐘電路是維持單片機最小系統(tǒng)運行的基本模塊。時鐘電路采用12M晶振組成。復(fù)位電路通常分為兩種:上電復(fù)位和手動復(fù)位。有時系統(tǒng)在運行過程中出現(xiàn)程序跑飛的情況,在程序開發(fā)過程中,經(jīng)常需要手動復(fù)位,所以本次設(shè)計選用手動復(fù)位。
圖2 AT89C52最小系統(tǒng)圖

2.4輸入模塊

正轉(zhuǎn)、反轉(zhuǎn)、停止、加速、減速、清除數(shù)據(jù)六個按鈕分別與單片機的 P1.0、P1.1、P1.2、P1.3、P1.4、P1.5相連,然后再與地相連,當(dāng)按鈕被按下時51芯片管腳電壓被拉低,檢測管腳電平實現(xiàn)按鈕檢測。正轉(zhuǎn)實現(xiàn)直流電機的正轉(zhuǎn),反轉(zhuǎn)實現(xiàn)直流電機的反轉(zhuǎn),停止實現(xiàn)直流電機的停轉(zhuǎn),加速實現(xiàn)直流電機的加速,減速實現(xiàn)直流電機的減速,清除數(shù)據(jù)實現(xiàn)瓶子數(shù)量和箱子數(shù)量的清除,具體輸入模塊如下:
圖3 按鍵輸入模塊

2.5 LCD1602顯示模塊

2.5.1 LCD1602簡介

點陣圖形式液晶由M×N個顯示單元組成,假設(shè)LCD顯示屏有64行,每行有128列,每8列對應(yīng)1字節(jié)的8位,即每行由16字節(jié),共16×8=128個點組成。顯示屏上64×16個顯示單元與顯示RAM區(qū)的1024字節(jié)相對應(yīng),每一字節(jié)的內(nèi)容與顯示屏上相應(yīng)位置的亮暗對應(yīng)。例如顯示屏第一行的亮暗由RAM區(qū)的000H~00FH的16字節(jié)的內(nèi)容決定,當(dāng)(000H)=FFH時,屏幕左上角顯示一條短亮線,長度為8個點;當(dāng)(3FFH)=FFH時,屏幕右下角顯示一條短亮線;當(dāng)(000H)=FFH,(001H)=00H,(002H)=00H…,(00EH)=00H,(00FH)=00H時,在屏幕的頂部顯示一條由8條亮線和8條暗線組成的虛線。這就是LCD顯示的基本原理。
字符型液晶顯示模塊是一種專門用于顯示字母、數(shù)字和符號等的點陣式LCD,目前常用16×1,16×2,20×2和40×2等的模塊。一般的LCD1602字符型液晶顯示器的內(nèi)部控制器大部分為HD44780,能夠顯示英文字母、阿拉伯?dāng)?shù)字、日文片假名和一般性符號。

2.5.2 LCD1602連接與控制

LCD1602顯示模塊與單片機P2.5、P2.6、P2.7以及P0口連接,通過單片機編寫LCD控制子程序,實現(xiàn)LCD1602的數(shù)據(jù)傳輸和顯示控制。
圖4 轉(zhuǎn)速顯示模塊

2.6 包裝機控制模塊

通過兩片MAX487芯片連接構(gòu)成485通信模塊,通過單片機P3.0和P3.1實現(xiàn)單片機與MAX487芯片的串口通信傳輸數(shù)據(jù),以實現(xiàn)包裝機的啟?刂啤
通過51單片機自帶的串口通訊實現(xiàn)連接,設(shè)置定時器1實現(xiàn)串口通訊的控制,定時器1設(shè)置工作于方式2,開啟定時器的串口通信的相關(guān)寄存器,通過SBUF寄存器發(fā)送數(shù)據(jù)。
定時器1寄存器設(shè)置:            
TMOD=0x21;//定時器1工作于方式2
TL1=0xfa;//波特率設(shè)置為4800
                                                                                    TH1=0xfa;//波特率設(shè)置為4800
                                                                                    SCON=0x50;//串行口設(shè)置為方式1,REN置1時允許接收數(shù)據(jù)
                                                                                    PCON &= 0xef;//PCON寄存器設(shè)置
                                                                                    TR1=1;//開定時器1

圖5 包裝機控制模塊

2.7 蜂鳴器控制模塊

通過三極管控制電路的通斷以實現(xiàn)蜂鳴器的鳴叫控制,實現(xiàn)包裝機開動提醒。通過P1.6的通斷時間控制蜂鳴器的鳴叫?
圖6蜂鳴器控制模塊

2.8電機驅(qū)動模塊

由設(shè)計要求可知,電機為額定電壓為48V的直流電機,PWM的頻率為50HZ,電機控制的最高轉(zhuǎn)速為450rpm,最低轉(zhuǎn)速為50rpm。采用L6203芯片驅(qū)動直流電機,連接單片機的P3.0、P3.1、P3.7口,P3.0、P3.1分別控制電機的正反轉(zhuǎn),P3.7控制L6203芯片的通斷。當(dāng)P3.0=1,P3.1=0時,電機正轉(zhuǎn),當(dāng)P3.0=0,P3.1=1時,電機反轉(zhuǎn)。為了控制直流電機的轉(zhuǎn)速,為1的單片機I/O口采用PWM控制的方法控制電機的電壓,以控制電機的轉(zhuǎn)速。
PWM的實現(xiàn):通過單片機的定時中斷,實現(xiàn)頻率為50HZ,即周期接近0.02s的PWM。為了實現(xiàn)占空比控制,將中斷的時間設(shè)置為.1ms,通過20次的中斷實現(xiàn)以頻率為50HZ。
中斷的初值: ;// 1ms中斷
;
轉(zhuǎn)速計算:轉(zhuǎn)速 = 占空比*500
圖7電機驅(qū)動模塊

2.9瓶子檢測模塊

由于PROTUES沒有光電傳感器的仿真模型,只能使用光耦模擬瓶子經(jīng)過是遮住光電傳感器,通過單片機P1.7口檢測瓶子經(jīng)過時的電平拉高,實現(xiàn)瓶數(shù)計數(shù)。
圖8 瓶子檢測模塊

3. 程序設(shè)計

3.1主程序:


  1. ///*************************************************************************
  2. /// 工業(yè)生產(chǎn)中的產(chǎn)品數(shù)量自動計量系統(tǒng)創(chuàng)新設(shè)計
  3. ///功能:流水線電機控制,產(chǎn)品數(shù)量檢測,LCD1602顯示以及包裝機控制
  4. ///*************************************************************************
  5. #include<reg52.h>  ///包含頭文件
  6. #include<MAIN.h>
  7. #include<lcd1602.h>

  8. //#define uint unsigned int
  9. //#define uchar unsigned char
  10. //#define ulong unsigned long

  11. sbit zheng = P1^0;
  12. sbit fan = P1^1;
  13. sbit ting = P1^2;
  14. sbit jia = P1^3;
  15. sbit jian = P1^4;
  16. sbit clear = P1^5;
  17. sbit bee = P1^6;
  18. sbit pingzi = P1^7;
  19. sbit PWM1 = P2^0;
  20. sbit PWM2 = P2^1;
  21. sbit ena = P2^2;
  22. sbit max = P2^3;


  23. uint bottle=0;
  24. uint box=0;
  25. uint zhuansu[4]={0,0,0,0};
  26. uint PZ[4]={0,0,0,0};
  27. uchar str1[16]="bottle:00 box:00";
  28. uchar str2[16]="speed:0000      ";
  29. uchar time;
  30. uchar count;
  31. ulong zhuan;
  32. flag=1;

  33. ///*************************************************************************
  34. /// MAIN函數(shù)
  35. ///功能:
  36. ///*************************************************************************
  37. void main()
  38. {
  39.               timer_init();
  40.               LCD_Init();
  41.               ena=0;
  42.               bee=0;
  43.               max=1;
  44.               while(1)
  45.               {
  46.                             cleardate();
  47.                             zhengz();
  48.                             fanz();
  49.                             tingz();
  50.                             jias();
  51.                             jians();
  52.                             LCD();
  53.                             pingshu();
  54.                                                       
  55.               }            
  56. }
  57. ///*************************************************************************
  58. /// 延時函數(shù)
  59. ///功能:
  60. ///*************************************************************************
  61. void delay1(uint z)// 延時程序,zms.
  62. {
  63.               uint x,y;
  64.               for(y=z;x>0;x--)
  65.               for(y=110;y>0;y--);
  66. }


  67. ///*************************************************************************
  68. /// 數(shù)據(jù)計算函數(shù)
  69. ///功能:
  70. ///*************************************************************************
  71. void chuli()
  72. {

  73.               zhuan=count*500/20;
  74.               zhuansu[0]=(count*10/1000);    //轉(zhuǎn)換轉(zhuǎn)速的千位
  75.               zhuansu[1]=(zhuan/100%10);    //轉(zhuǎn)換轉(zhuǎn)速的百位
  76.               zhuansu[2]=(zhuan/10%10);    //轉(zhuǎn)換轉(zhuǎn)速的十位
  77.               zhuansu[3]=(zhuan%10);    //轉(zhuǎn)換轉(zhuǎn)速的個位
  78.               PZ[0]= (bottle/10%10);              //瓶數(shù)十位
  79.               PZ[1]= (bottle%10);//瓶數(shù)個位
  80.               PZ[2]= (box/10%10);// 箱數(shù)十位
  81.               PZ[3]= (box%10);  // 箱數(shù)個位

  82. }

  83. ///*************************************************************************
  84. /// 清除數(shù)據(jù)函數(shù)
  85. ///功能:
  86. ///*************************************************************************
  87. void cleardate()
  88. {
  89.               if(clear==0)
  90.               {
  91.                             delay1(2);
  92.                             if(clear==0)
  93.                             {
  94.                                           LCD_Clear();
  95.                                           LCD_Init();
  96.                                           bottle=0;
  97.                                           box=0;
  98.                                           chuli();
  99.                             }
  100.               }
  101. }



  102. ///*************************************************************************
  103. /// LCD顯示函數(shù)
  104. ///功能:
  105. ///*************************************************************************
  106. void LCD()
  107. {            
  108.               LCD_Manifest(1,7,PZ[0]);
  109.               LCD_Manifest(1,8,PZ[1]);
  110.               LCD_Manifest(1,14,PZ[2]);
  111.               LCD_Manifest(1,15,PZ[3]);

  112.               LCD_Manifest(2,6,zhuansu[0]);
  113.               LCD_Manifest(2,7,zhuansu[1]);
  114.               LCD_Manifest(2,8,zhuansu[2]);
  115.               LCD_Manifest(2,9,zhuansu[3]);
  116.                            
  117. }
  118. ///*************************************************************************
  119. /// 蜂鳴器控制函數(shù)
  120. ///功能:
  121. ///*************************************************************************
  122. void beebee()
  123. {
  124.               bee=0;
  125.               delay(100);
  126.               bee=1;
  127.               delay(100);
  128.               bee=0;

  129. }

  130. //*************************************************************************
  131. /// rs485發(fā)送
  132. ///功能:
  133. ///*************************************************************************
  134. void rs485send(uchar date) //rs485發(fā)送
  135. {
  136.               SBUF=date;
  137.               while(!TI);
  138.               TI=0;
  139. }

  140. void rs485open()   //包裝機rs485開啟指令
  141. {
  142.               rs485send((uchar)0xAA);
  143.               delay1(100);
  144.               rs485send((uchar)0x33);
  145.               delay1(100);
  146.               rs485send((uchar)0xDD);
  147.               delay1(100);
  148. }                                            

  149. void rs485stop()   //包裝機rs485停止指令
  150. {
  151.               rs485send((uchar)0xAA);
  152.               delay1(100);
  153.               rs485send((uchar)0x55);
  154.               delay1(100);
  155.               rs485send((uchar)0xFF);
  156.               delay1(100);
  157. }

  158. ///*************************************************************************
  159. ///流水線控制
  160. ///功能:流水線瓶子數(shù)量測量,箱數(shù)測量及包裝機控制
  161. ///*************************************************************************

  162. void pingshu()
  163. {
  164.               if(pingzi==1)
  165.               {
  166.                             delay1(2);
  167.                             if(pingzi==1)
  168.                             {
  169.                                           bottle+=1;
  170.                                           if(bottle>51)
  171.                                           {
  172.                                                         ulong i;
  173.                                                         beebee();
  174.                                                         bottle=1;
  175.                                                         if(box<=99)              {box+=1;}
  176.                                                         else box=0;
  177.                                                         delay1(100);
  178.                                                            rs485open();
  179.                                                         for(i=0;i<1000;i++)
  180.                                                         {delay1(200);}
  181.                                                         rs485stop();            
  182.                                           }
  183.                                           chuli();
  184.                             }
  185.                             while(!pingzi);
  186.               }
  187. }


  188. ///*************************************************************************
  189. ///按鍵輸入模塊
  190. ///功能:實現(xiàn)正轉(zhuǎn),反轉(zhuǎn),啟停,加速,減速、清除數(shù)據(jù)
  191. ///*************************************************************************
  192. void zhengz()
  193. {
  194.               if(zheng==0)
  195.               {
  196.                             delay1(2);
  197.                             if(zheng==0)
  198.                             {
  199.                                           flag=1;
  200.                             }
  201.                             while(!zheng);
  202.               }
  203. }

  204. void fanz()
  205. {
  206.               if(fan==0)
  207.               {
  208.                             delay1(2);
  209.                             if(fan==0)
  210.                             {
  211.                                           flag=0;
  212.                             }
  213.                             while(!fan);
  214.               }
  215. }

  216. void tingz()
  217. {
  218.               if(ting==0)
  219.               {
  220.                             delay1(2);
  221.                             if(ting==0)
  222.                             {
  223.                                           ena=~ena;
  224.                                           if(ena==0)
  225.                                           {
  226.                                                         count=0;            
  227.                                           }
  228.                                           else count=10;
  229.                                           chuli();
  230.                             }
  231.                             while(!ting);
  232.               }
  233. }

  234. void jias()
  235. {
  236.               if(jia==0)
  237.               {
  238.                             delay1(2);
  239.                             if(jia==0)
  240.                             {
  241.                                           if(count<18)
  242.                                           {                              
  243.                                                         count+=2;            
  244.                                           }
  245.                                           else
  246.                                           {
  247.                                                         count=18;
  248.                                           }
  249.                                chuli();
  250.                             }
  251.                             while(!jia);
  252.               }
  253. }

  254. void jians()
  255. {
  256.               if(jian==0)
  257.               {
  258.                             delay1(2);
  259.                             if(jian==0)
  260.                             {                                                      
  261.                                           if(count>2)
  262.                                           {            
  263.                                                         count-=2;            
  264.                                           }
  265.                                           else
  266.                                           {
  267.                                                         count=2;
  268.                                           }
  269.                                chuli();
  270.                                                                       }
  271.                             while(!jian);
  272.               }
  273. }
  274. ///*************************************************************************
  275. /// 定時器0初始化
  276. ///功能:
  277. ///*************************************************************************
  278. void timer_init(void)
  279. {
  280.               TMOD=0x21;//定時器0工作于方式1,定時器1工作于方式2
  281.               TH0=(65536-1000)/256;//1ms中斷
  282.               TL0=(65536-1000)%256;
  283.               TL1=0xfa;//波特率設(shè)置為4800
  284.               TH1=0xfa;//波特率設(shè)置為4800
  285.               SCON=0x50;//串行口方式設(shè)置為方式1,REN置1時允許接收數(shù)據(jù)
  286.               PCON &= 0xef;//PCON寄存器設(shè)置
  287.               TR0=1;
  288.               TR1=1;
  289.               ET0=1;
  290.               EA=1;
  291. }

  292. ///*************************************************************************
  293. ///  定時器0中斷程序
  294. ///功能:
  295. ///*************************************************************************
  296. void timer0_int(void) interrupt 1
  297. {
  298.               TR0=0;//設(shè)置定時器初值期間,關(guān)閉定時器
  299.               TH0=(65536-1000)/256;//1ms中斷
  300.               TL0=(65536-1000)%256;
  301.               TR0=1;
  302.               time++;
  303.               if(flag==1)// 電機正轉(zhuǎn)
  304.               {
  305.                             PWM2=0;
  306.                             if(time<count)
  307.                             {
  308.                                           PWM1=1;
  309.                             }
  310.                             else
  311.                                           PWM1=0;
  312.                             if(time>20)
  313.                             {
  314.                                           time=0;
  315.                             }
  316.               }
  317.               else // 電機反轉(zhuǎn)
  318.               {
  319.                             PWM1=0;
  320.                             if(time<count)
  321.                             {
  322.                                           PWM2=1;
  323.                             }
  324.                             else
  325.                                           PWM2=0;
  326.                             if(time>20)
  327.                             {
  328.                                           time=0;
  329.                             }
  330.               }
  331. }

  332. 3.2 LCD1602子程序:
  333. ///*************************************************************************
  334. /// LCD1602子程序
  335. ///功能:實現(xiàn)LCD1602的控制程序集成
  336. ///*************************************************************************
  337. #include<lcd1602.h>


  338. sbit LCD_RS=P2^6;//數(shù)據(jù)命令選擇端
  339. sbit LCD_WR=P2^5;//數(shù)據(jù)讀寫端
  340. sbit LCD_E=P2^7;//液晶使能端


  341. void delay(uchar z)//延時函數(shù)
  342. {
  343.   unsigned char x,y;
  344.   for(x=z;x>0;x--)
  345.     for(y=110;y>0;y--);
  346. }
  347.                                                                         
  348. void LCD_Write_Cmd(uchar com)//液晶寫命令
  349. {
  350.    LCD_RS=0;//選擇寫命令模式
  351.    LCD_WR=0;
  352.    delay(1);
  353.    LCD_E=1;//使能端給一高脈沖,高脈沖有效
  354.    delay(1);
  355.    LCDdate=com;//將要寫的命令字送到數(shù)據(jù)總線上
  356.    delay(1);            
  357.    LCD_E=0;
  358. }

  359. void LCD_Write_Data(uchar date)//數(shù)據(jù)寫命令
  360. {
  361.    LCD_RS=1;//選擇寫數(shù)據(jù)模式
  362.    LCD_WR=0;
  363.    delay(1);
  364.    LCD_E=1;//使能端給一高脈沖,高脈沖有效
  365.    delay(1);
  366.    LCDdate=date;
  367.    delay(1);
  368.    LCD_E=0;
  369. }

  370. void LCD_Clear(void)  // 清屏函數(shù)
  371. {
  372.               LCD_Write_Cmd(0x01);
  373.               delay(5);            
  374. }

  375. void LCD_Init()//液晶初始化
  376. {
  377.    uchar i;  
  378.    LCD_Write_Cmd(0x38);//設(shè)置16*2顯示,5*7點陣,8位數(shù)據(jù)接口
  379.    delay(5);
  380.    LCD_Write_Cmd(0x08);              //設(shè)置顯示關(guān)閉
  381.    LCD_Clear();//清屏
  382.    LCD_Write_Cmd(0x06);//寫一個字符后地址指針自動加1
  383.    delay(5);     
  384.    LCD_Write_Cmd(0x0c);//設(shè)置開顯示,不顯示光標(biāo)
  385.    LCD_Write_Cmd(0x80);//數(shù)據(jù)指針定位到第一行第一個字處
  386.    for(i=0;i<16;i++)
  387.                  LCD_Write_Data(str1[i]);//液晶顯示第一行寫數(shù)據(jù)
  388.    LCD_Write_Cmd(0x80+0x40);//將數(shù)據(jù)指針定位到第二行第一個
  389.    for(i=0;i<16;i++)
  390.                  LCD_Write_Data(str2[i]);//液晶顯示第二行寫數(shù)據(jù)
  391. }

  392. void LCD_Manifest(uchar row,uchar add,uchar date)
  393. {
  394.               if(row==1)               LCD_Write_Cmd(0x80+add);
  395.               if(row==2)              LCD_Write_Cmd(0xc0+add);
  396.               LCD_Write_Data(0x30+date);
  397. }
復(fù)制代碼

4. 系統(tǒng)仿真

4.1系統(tǒng)仿真圖:

圖9 系統(tǒng)仿真圖

4.2 PCB圖

圖10 PCB圖


4.3 3D視圖

圖11 3D視圖

5. 元器件清單列表


6. 設(shè)計總結(jié)

設(shè)計之中,我遇到了很多現(xiàn)實的問題, PROTUES中的沒有仿真模型,以及AD16軟件中有些元件沒有原理圖和PCB封裝,需要自己按照手冊自己畫出來,所以自己需要想辦法進行模擬仿真,AD16沒有的封裝需要去網(wǎng)上尋找別人的設(shè)計的,實在找不到的只能自己畫PCB。在10天的時間,經(jīng)過查閱資料,發(fā)現(xiàn)擁有驅(qū)動48V3A的直流電機的芯片非常少,很不容易才找到了L6203芯片,但是也沒能達(dá)到合適的要求,經(jīng)過自己搭建H橋,但是三極管的查找花費了許多的時間。所以最終只能實現(xiàn)電機的啟?刂,正反轉(zhuǎn)控制,加減速控制,數(shù)據(jù)清除。在這次的設(shè)計中,發(fā)現(xiàn)一個簡單的系統(tǒng)并不容易實現(xiàn),需花費大量時間在查閱資料上面,并且最好將系統(tǒng)分成小塊來一個一個解決,這樣才能思路清晰,所以要加強自己的基礎(chǔ)知識積累以及學(xué)習(xí)的方式方法。


51hei.png

全部資料51hei下載地址:
工廠自動化.zip (588.75 KB, 下載次數(shù): 43)

評分

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

查看全部評分

回復(fù)

使用道具 舉報

ID:328014 發(fā)表于 2020-1-6 01:58 | 顯示全部樓層
好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報

ID:1107942 發(fā)表于 2024-1-4 12:45 | 顯示全部樓層
51hei團團 發(fā)表于 2020-1-6 01:58
好資料,51黑有你更精彩!!!

這個資料真的是太好了
回復(fù)

使用道具 舉報

ID:1107942 發(fā)表于 2024-1-4 12:46 | 顯示全部樓層
這個資料真的是太好了
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表