日韩在线不卡免费视频一区,日韩欧美精品一区二区三区经典,日产精品码2码三码四码区,人妻无码一区二区三区免费,日本feerbbwdh少妇丰满

  • 回復(fù)
  • 收藏
  • 點(diǎn)贊
  • 分享
  • 發(fā)新帖

【我的畢設(shè)作品】基于編碼器的快遞車門行程監(jiān)測(cè)系統(tǒng)設(shè)計(jì)

隨著快遞運(yùn)輸越來越普遍,由于小規(guī)模企業(yè)無力改進(jìn)和大規(guī)模企業(yè)難以統(tǒng)一調(diào)度,無法對(duì)快遞安全和完整送到顧客手中進(jìn)行監(jiān)控,對(duì)快遞小哥誤操作等行為也缺乏有效監(jiān)控措施這就導(dǎo)致了快遞安全送達(dá)的幾率變低,特別是現(xiàn)在快遞越來越向著小、精的方向發(fā)展,導(dǎo)致很多快遞公司損失嚴(yán)重,顧客也難以信任快遞公司。本設(shè)計(jì)根據(jù)快遞運(yùn)輸?shù)那闆r,利用用單片機(jī)與編碼器相結(jié)合,完成對(duì)車車門開關(guān)行程位置的實(shí)時(shí)監(jiān)測(cè),實(shí)現(xiàn)提升貨物安全的目的。

QQ圖片20190818235406
全部回復(fù)(27)
正序查看
倒序查看
2019-08-19 11:26

期待更新


0
回復(fù)
GJGJ
LV.1
3
2019-08-19 12:41

旋轉(zhuǎn)編碼器是一種用來測(cè)量旋轉(zhuǎn)角度和旋轉(zhuǎn)角速度的旋轉(zhuǎn)式傳感器,它通過將角位移轉(zhuǎn)化為數(shù)字脈沖信號(hào)發(fā)送給單片機(jī)等接收端來記錄角位移或者角速度。光電式旋轉(zhuǎn)編碼器中角位移的轉(zhuǎn)換采用了光電掃描原理它可以分為三個(gè)部分,第一部分由交替的透光窗口和不透光窗口組成,就像齒輪一樣的結(jié)構(gòu),使它成為角位移的記錄依據(jù)。第二部分為發(fā)射光源,第三部分為接收光源,發(fā)射光源經(jīng)過第一部分的遮光和透光,使光照交替出現(xiàn),記錄由電子電路實(shí)現(xiàn),經(jīng)過計(jì)算處理即可得到所測(cè)量的角度,

如圖2.1所示旋轉(zhuǎn)編碼器輸出為兩相方波,它們波形相同,頻率相同,只有相位不同,通常A腳和B腳輸出。隨意選擇一個(gè)腳記錄其震蕩次數(shù)即可計(jì)算其旋轉(zhuǎn)角度,與此同時(shí),我們還可以通過比較兩個(gè)方波的提前與滯后的相位關(guān)系來判斷旋轉(zhuǎn)方向,不僅如此,旋轉(zhuǎn)編碼器在每轉(zhuǎn)一圈之后會(huì)輸出一個(gè)高電平,輸出這個(gè)高電平的通道給出編碼器的絕對(duì)零位,也就是每轉(zhuǎn)一圈這個(gè)通道會(huì)輸出一個(gè)高電平,以此記錄圈數(shù)。此信號(hào)是一個(gè)方波時(shí)間大約在A輸出一個(gè)高電平的中間位置如圖2.2所示。

旋轉(zhuǎn)編碼器精度取決于機(jī)械和電氣兩種因素,其中機(jī)械因素有:分光柵欄的精度、旋鈕的靈敏度、光源和接收元件的角度等,其中電氣因素主要包括:電子電路設(shè)計(jì)的誤差、電路傳輸?shù)臅r(shí)效、以及處理軟件的誤差等。可以用下列公式來計(jì)算電氣角度與機(jī)械角度的關(guān)系其中n0表示電氣角度,n1表示機(jī)械角度,a表示脈沖數(shù),t表示轉(zhuǎn)數(shù)。

0
回復(fù)
GJGJ
LV.1
4
2019-08-19 12:42

5腳的旋轉(zhuǎn)編碼開關(guān)具有左轉(zhuǎn),右轉(zhuǎn),按下三個(gè)功能,根據(jù)任務(wù)要求我們只需要使用左轉(zhuǎn)右轉(zhuǎn)功能而且只180度。2腳接地,1,3腳接上拉電阻。4腳,5腳是按下功能的兩個(gè)腳,可以根據(jù)需求自己接線。

在連接中,通常有A和B兩個(gè)集電極輸出接口,為確保線路銜接性,需要在3.3V上的電壓上進(jìn)行操作,通常串聯(lián)10kΩ使用。旋轉(zhuǎn)編碼器模塊接線圖如圖2.3所示。在硬件接口連接成功之后,以防萬一,須做好測(cè)試工作檢查。

0
回復(fù)
GJGJ
LV.1
5
2019-08-19 12:44

由于蜂鳴器產(chǎn)生報(bào)警信號(hào)驅(qū)動(dòng)的工作電流一般比較大,以致于單片機(jī)的I/O口是無法直接驅(qū)動(dòng)的,所以要利用放大電路來驅(qū)動(dòng),一般使用三極管來放大電流就可以了。

蜂鳴器分為有源蜂鳴器和無源蜂鳴器,這里的源并不是電源的意思,而是振蕩源,如果是有源蜂鳴器只要通的電流足夠驅(qū)動(dòng)蜂鳴器,蜂鳴器就可以正常工作,而無源蜂鳴器則需要一個(gè)振蕩波去驅(qū)動(dòng)它。

蜂鳴器的工作電路:蜂鳴器的工作電流一般比較大,以致于單片機(jī)的I/O口是無法直接驅(qū)動(dòng)的,所以要放大電路來驅(qū)動(dòng),放大電路一般由三極管組成,也就是基極聯(lián)通單片機(jī),控制蜂鳴器是否工作,集電極連接電源供電,發(fā)射極連接蜂鳴器,使其正常工作。

值得注意的是,理論上來說所有I/O口都可以驅(qū)動(dòng)該電路,但當(dāng)使用P0口作為驅(qū)動(dòng)電路時(shí)需要外加1k歐姆的上拉電阻,其他口并不需要。接線圖如圖所示。

0
回復(fù)
GJGJ
LV.1
6
2019-08-19 12:52
@GJGJ
由于蜂鳴器產(chǎn)生報(bào)警信號(hào)驅(qū)動(dòng)的工作電流一般比較大,以致于單片機(jī)的I/O口是無法直接驅(qū)動(dòng)的,所以要利用放大電路來驅(qū)動(dòng),一般使用三極管來放大電流就可以了。蜂鳴器分為有源蜂鳴器和無源蜂鳴器,這里的源并不是電源的意思,而是振蕩源,如果是有源蜂鳴器只要通的電流足夠驅(qū)動(dòng)蜂鳴器,蜂鳴器就可以正常工作,而無源蜂鳴器則需要一個(gè)振蕩波去驅(qū)動(dòng)它。蜂鳴器的工作電路:蜂鳴器的工作電流一般比較大,以致于單片機(jī)的I/O口是無法直接驅(qū)動(dòng)的,所以要放大電路來驅(qū)動(dòng),放大電路一般由三極管組成,也就是基極聯(lián)通單片機(jī),控制蜂鳴器是否工作,集電極連接電源供電,發(fā)射極連接蜂鳴器,使其正常工作。值得注意的是,理論上來說所有I/O口都可以驅(qū)動(dòng)該電路,但當(dāng)使用P0口作為驅(qū)動(dòng)電路時(shí)需要外加1k歐姆的上拉電阻,其他口并不需要。接線圖如圖所示。[圖片]
為了將行程數(shù)據(jù)采集并記錄下來此次利用AT24C02作為儲(chǔ)存芯片,

0
回復(fù)
GJGJ
LV.1
7
2019-08-19 12:56
@GJGJ
為了將行程數(shù)據(jù)采集并記錄下來此次利用AT24C02作為儲(chǔ)存芯片,[圖片]

1602液晶模塊內(nèi)部存儲(chǔ)了字符圖形、英文字母、數(shù)據(jù)符號(hào),而且已經(jīng)編號(hào),存儲(chǔ)方式與ISCII碼值相同,其工作原理如圖。

0
回復(fù)
GJGJ
LV.1
8
2019-08-19 12:59
@電源網(wǎng)-璐璐
期待更新[圖片]

光電門主要包括一個(gè)發(fā)光元件和一個(gè)接收元件,發(fā)光元件和接收元件組成槽型光耦,當(dāng)凹槽內(nèi)有物體時(shí),發(fā)光元件發(fā)出的光被物體擋住,接收元件無法接收到光照,向D0口輸出一個(gè)高電平;當(dāng)凹槽內(nèi)沒有遮擋物體時(shí),發(fā)光元件發(fā)出的光直接照射到接收元件上,D0口輸出一個(gè)低電平。除此之外,光電門模塊還提供了電源指示燈和開關(guān)指示燈可以看出光電門是否正常工作,其內(nèi)部電路圖如圖2.7所示。

(2)連接方法

光電門模塊連接方法如圖2.8所示

2.7光電門模塊連接方法

0
回復(fù)
GJGJ
LV.1
9
2019-08-19 13:02
@GJGJ
1602液晶模塊內(nèi)部存儲(chǔ)了字符圖形、英文字母、數(shù)據(jù)符號(hào),而且已經(jīng)編號(hào),存儲(chǔ)方式與ISCII碼值相同,其工作原理如圖。[圖片]

(2)LCD1602引腳及其接線方法如圖所示

0
回復(fù)
GJGJ
LV.1
10
2019-08-19 13:02
@GJGJ
(2)LCD1602引腳及其接線方法如圖所示[圖片]

蜂鳴器接線方法如圖

0
回復(fù)
GJGJ
LV.1
11
2019-08-19 13:03
@GJGJ
蜂鳴器接線方法如圖[圖片]

旋轉(zhuǎn)編碼器模塊接線方法如圖

0
回復(fù)
GJGJ
LV.1
12
2019-08-19 13:03
@GJGJ
旋轉(zhuǎn)編碼器模塊接線方法如圖[圖片]

存儲(chǔ)芯片模塊接線方法如圖

0
回復(fù)
GJGJ
LV.1
13
2019-08-19 13:07
@GJGJ
存儲(chǔ)芯片模塊接線方法如圖[圖片]
等會(huì)我把源代碼以及分析補(bǔ)上
0
回復(fù)
薄浩楠
LV.5
14
2019-08-19 13:19
@GJGJ
存儲(chǔ)芯片模塊接線方法如圖[圖片]
幫頂,
0
回復(fù)
薄浩楠
LV.5
15
2019-08-19 13:21
@GJGJ
存儲(chǔ)芯片模塊接線方法如圖[圖片]
可以講講編碼器的原理么
0
回復(fù)
GJGJ
LV.1
16
2019-08-19 23:35
@薄浩楠
可以講講編碼器的原理么

首先我們的設(shè)計(jì)利用了光電門的開關(guān)特性,當(dāng)快遞車啟動(dòng)時(shí),利用光電門檢測(cè)發(fā)動(dòng)機(jī)渦輪遮光給單片機(jī)輸出的信號(hào)發(fā)生變化,之后單片機(jī)開始計(jì)時(shí),并每隔一定很短的時(shí)間進(jìn)行檢測(cè),當(dāng)快遞車停止時(shí),光電門輸出的信號(hào)不再變化,計(jì)時(shí)器停止計(jì)時(shí),我們即可由此記錄快遞車行駛的時(shí)間。

再次我們的設(shè)計(jì)利用旋轉(zhuǎn)編碼器能將角位移轉(zhuǎn)化為電信號(hào)的特性,當(dāng)快遞車開門或關(guān)門時(shí),每轉(zhuǎn)動(dòng)一定的角度旋轉(zhuǎn)編碼器就會(huì)給單片機(jī)一個(gè)低電平,單片機(jī)會(huì)根據(jù)旋轉(zhuǎn)編碼器AB相輸出的先后判斷轉(zhuǎn)動(dòng)方向,記錄這個(gè)低電平并且累計(jì)這個(gè)低電平出現(xiàn)的次數(shù),開門加關(guān)門減,如果這個(gè)累計(jì)數(shù)為0則說明快遞車門沒有動(dòng)作,如果不為0則說明快遞車門沒有關(guān)好。

實(shí)現(xiàn)步驟

(1)行車啟動(dòng)檢測(cè)

使用光電門開關(guān)檢測(cè)發(fā)動(dòng)機(jī)渦輪,光電門檢測(cè)模塊與I/O口連接,該I/O口設(shè)置為下降沿檢測(cè),啟動(dòng)計(jì)時(shí)器通過軟件實(shí)現(xiàn)LCD屏顯示行車時(shí)間,若下降沿消失則停止計(jì)時(shí)。

(2)開關(guān)門檢測(cè)

門蝸桿渦輪轉(zhuǎn)動(dòng)帶動(dòng)旋轉(zhuǎn)編碼器編碼盤轉(zhuǎn)動(dòng),將旋轉(zhuǎn)角位移轉(zhuǎn)化為一串?dāng)?shù)字脈沖信號(hào)。旋轉(zhuǎn)編碼器AB角分別接入單片機(jī)的I/O口,將這兩個(gè)I/O口設(shè)置為低電平檢測(cè),通過兩口脈沖變化先后順序判斷旋轉(zhuǎn)的方向。通過統(tǒng)計(jì)脈沖的個(gè)數(shù)計(jì)算開門角度,通過變量記錄正反旋轉(zhuǎn)脈沖數(shù),正轉(zhuǎn)加,反轉(zhuǎn)減。若該變量為0則為關(guān)門,不為0則為開門。

0
回復(fù)
GJGJ
LV.1
17
2019-08-19 23:36
@GJGJ
首先我們的設(shè)計(jì)利用了光電門的開關(guān)特性,當(dāng)快遞車啟動(dòng)時(shí),利用光電門檢測(cè)發(fā)動(dòng)機(jī)渦輪遮光給單片機(jī)輸出的信號(hào)發(fā)生變化,之后單片機(jī)開始計(jì)時(shí),并每隔一定很短的時(shí)間進(jìn)行檢測(cè),當(dāng)快遞車停止時(shí),光電門輸出的信號(hào)不再變化,計(jì)時(shí)器停止計(jì)時(shí),我們即可由此記錄快遞車行駛的時(shí)間。再次我們的設(shè)計(jì)利用旋轉(zhuǎn)編碼器能將角位移轉(zhuǎn)化為電信號(hào)的特性,當(dāng)快遞車開門或關(guān)門時(shí),每轉(zhuǎn)動(dòng)一定的角度旋轉(zhuǎn)編碼器就會(huì)給單片機(jī)一個(gè)低電平,單片機(jī)會(huì)根據(jù)旋轉(zhuǎn)編碼器AB相輸出的先后判斷轉(zhuǎn)動(dòng)方向,記錄這個(gè)低電平并且累計(jì)這個(gè)低電平出現(xiàn)的次數(shù),開門加關(guān)門減,如果這個(gè)累計(jì)數(shù)為0則說明快遞車門沒有動(dòng)作,如果不為0則說明快遞車門沒有關(guān)好。實(shí)現(xiàn)步驟(1)行車啟動(dòng)檢測(cè)使用光電門開關(guān)檢測(cè)發(fā)動(dòng)機(jī)渦輪,光電門檢測(cè)模塊與I/O口連接,該I/O口設(shè)置為下降沿檢測(cè),啟動(dòng)計(jì)時(shí)器通過軟件實(shí)現(xiàn)LCD屏顯示行車時(shí)間,若下降沿消失則停止計(jì)時(shí)。(2)開關(guān)門檢測(cè)門蝸桿渦輪轉(zhuǎn)動(dòng)帶動(dòng)旋轉(zhuǎn)編碼器編碼盤轉(zhuǎn)動(dòng),將旋轉(zhuǎn)角位移轉(zhuǎn)化為一串?dāng)?shù)字脈沖信號(hào)。旋轉(zhuǎn)編碼器AB角分別接入單片機(jī)的I/O口,將這兩個(gè)I/O口設(shè)置為低電平檢測(cè),通過兩口脈沖變化先后順序判斷旋轉(zhuǎn)的方向。通過統(tǒng)計(jì)脈沖的個(gè)數(shù)計(jì)算開門角度,通過變量記錄正反旋轉(zhuǎn)脈沖數(shù),正轉(zhuǎn)加,反轉(zhuǎn)減。若該變量為0則為關(guān)門,不為0則為開門。

這是主程序流程圖

0
回復(fù)
GJGJ
LV.1
18
2019-08-19 23:38
@GJGJ
這是主程序流程圖[圖片]

這是具體要求實(shí)現(xiàn)的軟件邏輯

0
回復(fù)
GJGJ
LV.1
19
2019-08-19 23:41
@GJGJ
這是具體要求實(shí)現(xiàn)的軟件邏輯[圖片]

以下是我在做畢設(shè)寫代碼時(shí)候的一些心得體會(huì)

(1)旋轉(zhuǎn)編碼器檢測(cè)

旋轉(zhuǎn)編碼器的AB相分別接入單片機(jī)的P1.1和P1.2,并在軟件中申請(qǐng)變量PINB和PINA進(jìn)行檢測(cè)。首先把接收的引腳置高電平,并申請(qǐng)一個(gè)變量EncOld記錄編碼器初始的狀態(tài)(00,01,10,11),用一個(gè)變量EncNew記錄編碼器現(xiàn)在的狀態(tài),對(duì)兩個(gè)狀態(tài)進(jìn)行比較,如果兩個(gè)數(shù)據(jù)相同則返回0,如果兩個(gè)數(shù)據(jù)不同則通過判斷改變的順序判斷方向,00-10-1111-01-00表示右轉(zhuǎn),返回R,00-01-1111-10-00表示左轉(zhuǎn),返回L。另外由于旋轉(zhuǎn)編碼器具有開關(guān)特性,所以使用時(shí)需要延時(shí)消除抖動(dòng)的影響。

(2)計(jì)時(shí)實(shí)現(xiàn)

在主程序中申請(qǐng)定時(shí)器中斷,根據(jù)計(jì)算定時(shí)器中斷初始化為TH0=0xdc,

TL0=0x00定時(shí)器每10ms中斷一次,也就是0.01秒,我們申請(qǐng)一個(gè)全局變量ms_10記錄定時(shí)器中斷次數(shù),一個(gè)6位數(shù)組存儲(chǔ)秒十位個(gè)位,分十位個(gè)位,時(shí)十位個(gè)位。當(dāng)中斷執(zhí)行100次時(shí),也就是ms_10=100時(shí)清零ms_10,把秒個(gè)位自加1。當(dāng)秒個(gè)位自加到10時(shí),把秒十位自加1并清零秒個(gè)位。當(dāng)秒十位自加到6時(shí),把秒十位清零并把分個(gè)位自加1,同理記錄分十位,時(shí)個(gè)位十位。當(dāng)每次定時(shí)器執(zhí)行完一次重復(fù)執(zhí)行主程序打開定時(shí)器,則可以實(shí)現(xiàn)計(jì)時(shí)。值得注意的是,計(jì)時(shí)器中斷的功能軟件中不能由太多延時(shí)時(shí)間,或者通過一步步調(diào)試通過調(diào)試軟件的時(shí)間對(duì)延時(shí)初值進(jìn)行調(diào)整,否則會(huì)出現(xiàn)計(jì)時(shí)不準(zhǔn)的情況發(fā)生。

(3)顯示實(shí)現(xiàn)

使用LCD屏需要三個(gè)子程序通過RS和RW的引腳拉高和拉低實(shí)現(xiàn)對(duì)液晶屏判斷是否正在工作、寫一個(gè)字節(jié)和寫一個(gè)命令。再通過初始化LCD屏程序把計(jì)時(shí)器和誤操作次數(shù)顯示到LCD屏中,具體操作如下:使用寫命令子程序設(shè)置16*2顯示開顯示,關(guān)顯示光標(biāo),使用寫一個(gè)字節(jié)程序執(zhí)行清屏操作和顯示TIME和DEGREE作為標(biāo)題。再申請(qǐng)一個(gè)play函數(shù),顯示行車時(shí)間和誤操作次數(shù),只需要使用寫一個(gè)字節(jié)把時(shí)間數(shù)組中的數(shù)據(jù)寫在屏幕上。

4)掉電保護(hù)

掉電保護(hù)通過把數(shù)據(jù)寫入24C02的方法實(shí)現(xiàn),24C02需要使用I2C通信,所以我們需要使用程序模擬I2C總線通信的方法,根據(jù)I2C總線通信方法需要申請(qǐng)SCL和SDA通過改變它們的數(shù)值實(shí)現(xiàn)對(duì)24C02的寫入和讀取。另外掉電保護(hù)寫入需要時(shí)間所以要加入延時(shí)保證寫入程序的順利執(zhí)行。

5)串口通信

使用串口通信時(shí),需要在串口助手中選擇與串口通信軟件中申請(qǐng)的相同波特率,并且申請(qǐng)計(jì)時(shí)器作為波特率發(fā)生器,初始化時(shí)打開計(jì)時(shí)器即可使用串口通信。根據(jù)計(jì)算,串口初始化波特率9600時(shí),初值為0xfdfd,工作方式為自動(dòng)重裝。

在接收到計(jì)算機(jī)發(fā)送的數(shù)據(jù)時(shí)進(jìn)入串口中斷服務(wù)程序,接收之后存入一個(gè)臨時(shí)變量中,并對(duì)這個(gè)數(shù)進(jìn)行判斷,如果為0,把存儲(chǔ)芯片中數(shù)據(jù)以一定的順序放入輸出數(shù)組,并發(fā)送給計(jì)算機(jī);如果接收到的數(shù)據(jù)為1時(shí),把存儲(chǔ)芯片的數(shù)據(jù)清零,即可實(shí)現(xiàn)清零功能。

6)主程序

每次上電時(shí),首先初始化24C02芯片,讀取芯片中的信息放入誤操作次數(shù)和時(shí)間數(shù)組的全局變量中,然后執(zhí)行顯示初始化和時(shí)間顯示,并啟動(dòng)定時(shí)器。

如果光電門檢測(cè)有脈沖,進(jìn)入行車循環(huán)檢測(cè),啟動(dòng)中斷和使用時(shí)間顯示,判斷開關(guān)角度變量是否為0,為0時(shí)車門已經(jīng)關(guān)緊,否則車門沒有關(guān)緊,如果車門沒有關(guān)緊則記錄紅燈亮、警報(bào)器響直到行車停止,也就是光電門不再有脈沖一段時(shí)間。誤操作次數(shù)加一,并寫入到掉電保護(hù)芯片中。而且每循環(huán)一次都把時(shí)間數(shù)組寫入到掉電保護(hù)芯片中,在每次上電的時(shí)候讀取并寫入其中。

進(jìn)入停車循環(huán),執(zhí)行掃描旋轉(zhuǎn)編碼器并記錄旋轉(zhuǎn)編碼器的開關(guān)角度,左轉(zhuǎn)變量自減1,右轉(zhuǎn)自加1,如果車門關(guān)緊紅燈滅、綠燈亮,如果車門每關(guān)緊紅燈亮,綠燈滅,并記錄車門是否關(guān)緊的變量x,當(dāng)行車循環(huán)檢測(cè)時(shí)進(jìn)行判斷,以提醒司機(jī)行車狀態(tài)。

0
回復(fù)
GJGJ
LV.1
20
2019-08-19 23:45
@GJGJ
以下是我在做畢設(shè)寫代碼時(shí)候的一些心得體會(huì)(1)旋轉(zhuǎn)編碼器檢測(cè)旋轉(zhuǎn)編碼器的AB相分別接入單片機(jī)的P1.1和P1.2,并在軟件中申請(qǐng)變量PINB和PINA進(jìn)行檢測(cè)。首先把接收的引腳置高電平,并申請(qǐng)一個(gè)變量EncOld記錄編碼器初始的狀態(tài)(00,01,10,11),用一個(gè)變量EncNew記錄編碼器現(xiàn)在的狀態(tài),對(duì)兩個(gè)狀態(tài)進(jìn)行比較,如果兩個(gè)數(shù)據(jù)相同則返回0,如果兩個(gè)數(shù)據(jù)不同則通過判斷改變的順序判斷方向,00-10-11或11-01-00表示右轉(zhuǎn),返回R,00-01-11或11-10-00表示左轉(zhuǎn),返回L。另外由于旋轉(zhuǎn)編碼器具有開關(guān)特性,所以使用時(shí)需要延時(shí)消除抖動(dòng)的影響。(2)計(jì)時(shí)實(shí)現(xiàn)在主程序中申請(qǐng)定時(shí)器中斷,根據(jù)計(jì)算定時(shí)器中斷初始化為TH0=0xdc,TL0=0x00定時(shí)器每10ms中斷一次,也就是0.01秒,我們申請(qǐng)一個(gè)全局變量ms_10記錄定時(shí)器中斷次數(shù),一個(gè)6位數(shù)組存儲(chǔ)秒十位個(gè)位,分十位個(gè)位,時(shí)十位個(gè)位。當(dāng)中斷執(zhí)行100次時(shí),也就是ms_10=100時(shí)清零ms_10,把秒個(gè)位自加1。當(dāng)秒個(gè)位自加到10時(shí),把秒十位自加1并清零秒個(gè)位。當(dāng)秒十位自加到6時(shí),把秒十位清零并把分個(gè)位自加1,同理記錄分十位,時(shí)個(gè)位十位。當(dāng)每次定時(shí)器執(zhí)行完一次重復(fù)執(zhí)行主程序打開定時(shí)器,則可以實(shí)現(xiàn)計(jì)時(shí)。值得注意的是,計(jì)時(shí)器中斷的功能軟件中不能由太多延時(shí)時(shí)間,或者通過一步步調(diào)試通過調(diào)試軟件的時(shí)間對(duì)延時(shí)初值進(jìn)行調(diào)整,否則會(huì)出現(xiàn)計(jì)時(shí)不準(zhǔn)的情況發(fā)生。(3)顯示實(shí)現(xiàn)使用LCD屏需要三個(gè)子程序通過RS和RW的引腳拉高和拉低實(shí)現(xiàn)對(duì)液晶屏判斷是否正在工作、寫一個(gè)字節(jié)和寫一個(gè)命令。再通過初始化LCD屏程序把計(jì)時(shí)器和誤操作次數(shù)顯示到LCD屏中,具體操作如下:使用寫命令子程序設(shè)置16*2顯示開顯示,關(guān)顯示光標(biāo),使用寫一個(gè)字節(jié)程序執(zhí)行清屏操作和顯示TIME和DEGREE作為標(biāo)題。再申請(qǐng)一個(gè)play函數(shù),顯示行車時(shí)間和誤操作次數(shù),只需要使用寫一個(gè)字節(jié)把時(shí)間數(shù)組中的數(shù)據(jù)寫在屏幕上。(4)掉電保護(hù)掉電保護(hù)通過把數(shù)據(jù)寫入24C02的方法實(shí)現(xiàn),24C02需要使用I2C通信,所以我們需要使用程序模擬I2C總線通信的方法,根據(jù)I2C總線通信方法需要申請(qǐng)SCL和SDA通過改變它們的數(shù)值實(shí)現(xiàn)對(duì)24C02的寫入和讀取。另外掉電保護(hù)寫入需要時(shí)間所以要加入延時(shí)保證寫入程序的順利執(zhí)行。(5)串口通信使用串口通信時(shí),需要在串口助手中選擇與串口通信軟件中申請(qǐng)的相同波特率,并且申請(qǐng)計(jì)時(shí)器作為波特率發(fā)生器,初始化時(shí)打開計(jì)時(shí)器即可使用串口通信。根據(jù)計(jì)算,串口初始化波特率9600時(shí),初值為0xfdfd,工作方式為自動(dòng)重裝。在接收到計(jì)算機(jī)發(fā)送的數(shù)據(jù)時(shí)進(jìn)入串口中斷服務(wù)程序,接收之后存入一個(gè)臨時(shí)變量中,并對(duì)這個(gè)數(shù)進(jìn)行判斷,如果為0,把存儲(chǔ)芯片中數(shù)據(jù)以一定的順序放入輸出數(shù)組,并發(fā)送給計(jì)算機(jī);如果接收到的數(shù)據(jù)為1時(shí),把存儲(chǔ)芯片的數(shù)據(jù)清零,即可實(shí)現(xiàn)清零功能。(6)主程序每次上電時(shí),首先初始化24C02芯片,讀取芯片中的信息放入誤操作次數(shù)和時(shí)間數(shù)組的全局變量中,然后執(zhí)行顯示初始化和時(shí)間顯示,并啟動(dòng)定時(shí)器。如果光電門檢測(cè)有脈沖,進(jìn)入行車循環(huán)檢測(cè),啟動(dòng)中斷和使用時(shí)間顯示,判斷開關(guān)角度變量是否為0,為0時(shí)車門已經(jīng)關(guān)緊,否則車門沒有關(guān)緊,如果車門沒有關(guān)緊則記錄紅燈亮、警報(bào)器響直到行車停止,也就是光電門不再有脈沖一段時(shí)間。誤操作次數(shù)加一,并寫入到掉電保護(hù)芯片中。而且每循環(huán)一次都把時(shí)間數(shù)組寫入到掉電保護(hù)芯片中,在每次上電的時(shí)候讀取并寫入其中。進(jìn)入停車循環(huán),執(zhí)行掃描旋轉(zhuǎn)編碼器并記錄旋轉(zhuǎn)編碼器的開關(guān)角度,左轉(zhuǎn)變量自減1,右轉(zhuǎn)自加1,如果車門關(guān)緊紅燈滅、綠燈亮,如果車門每關(guān)緊紅燈亮,綠燈滅,并記錄車門是否關(guān)緊的變量x,當(dāng)行車循環(huán)檢測(cè)時(shí)進(jìn)行判斷,以提醒司機(jī)行車狀態(tài)。
源代碼如下:
#include 
#include 
typedef unsigned char uchar;
typedef unsigned int uint;


uchar data table[10]={60,2,3,4,5,6,7,8,9,0}; //發(fā)送數(shù)組
uint ms_10;
uint i,j,k;
char a,b;
unsigned char enc,x=0,y=0;

sbit PINA=P3^2;
sbit PINB=P3^3;
sbit LED_R=P1^3;
sbit LED_G=P1^4;
sbit Cm_ok=P1^5;

sbit sda=P2^0;							   //IO口定義
sbit scl=P2^1;
sbit BEEP = P2^3;                           //蜂鳴器
sbit dula=P2^6;
sbit wela=P2^7;

sbit sw_12=P3^7;
sbit RS = P3^5;
sbit RW = P3^6;
sbit EN = P3^4;         



/***********************************************
串行口初始化波特率9600,定時(shí)器1,工作方式2 *************************************************/
void serial_init(void)
{
	TMOD=0x20;//計(jì)時(shí)器1作為比特率發(fā)生器,方式2
	TH1=0xfd;
	TL1=0xfd; //裝入初值
	TR1=1;//計(jì)時(shí)中斷允許
	SM0=0;
	SM1=1;//串行口工作于方式2
	ES=1;//串行口中斷允許
	REN=1;//接收允許
	EA=1;// 總中斷允許
}
/********************* **************************
串行口傳送數(shù)據(jù)
傳送顯示數(shù)組各字符給計(jì)算機(jī)
*************************************************/
void send(uchar *dis)
{
	while(*dis!=0)
	{
		SBUF=*dis;
		dis++;
		while(!TI);
		TI=0; //軟件請(qǐng)發(fā)送中斷
	}
}
/************************************************************************************************
    函數(shù)名稱:Encoder
    函數(shù)功能:編碼器旋轉(zhuǎn)的掃描及處理
    入口參數(shù):無
    出口參數(shù):char型    0-無旋轉(zhuǎn)   'R'-正轉(zhuǎn)(向右轉(zhuǎn))   'L'-反轉(zhuǎn)(向左轉(zhuǎn))
************************************************************************************************/
unsigned char Encoder(void)
{
    static bit Enc0=0,Enc1=0;
    static unsigned char EncOld,EncX=0;
    unsigned char EncNow;
    bit EncType=0; //設(shè)置編碼器類型: 0為一定位一脈沖,1為兩定位一脈沖

    PINA=1;        //PINA置高電平
    PINB=1;        //PINB置高電平
    if(Enc0==0)EncOld=(PINA?0x02:0x00)+(PINB?0x01:0x00),Enc0=1;  //記住初次調(diào)用時(shí)編碼器的狀態(tài)
    EncNow=(PINA?0x02:0x00)+(PINB?0x01:0x00);        //根據(jù)兩個(gè)IO當(dāng)前狀態(tài)組合成16進(jìn)制的0x00|0x01|0x02|0x03
    if(EncNow==EncOld)return(0);                                //如果新數(shù)據(jù)和原來的數(shù)據(jù)一樣(沒有轉(zhuǎn)動(dòng))就直接返回0

    if(EncOld==0x00&&EncNow==0x02||EncOld==0x03&&EncNow==0x01)EncX=EncNow;         //00-10|11-01
    if(EncOld==0x00&&EncX==0x02&&EncNow==0x03||EncOld==0x03&&EncX==0x01&&EncNow==0x00)//00-10-11|11-01-00右轉(zhuǎn)
    {
        EncOld=EncNow,EncX=0;
        if(EncType==1)return('R');   //兩定位一脈沖
        else       						//一定位一脈沖
        {
            if(Enc1==0)Enc1=1;
            else
            {
                //Delayms(60);       //延時(shí)降低旋轉(zhuǎn)靈敏度(不能用在定時(shí)器中)
                Enc1=0;
                return('R');
            }
        }
    }

    if(EncOld==0x00&&EncNow==0x01||EncOld==0x03&&EncNow==0x02)EncX=EncNow;         //00-01|11-10
    if(EncOld==0x00&&EncX==0x01&&EncNow==0x03||EncOld==0x03&&EncX==0x02&&EncNow==0x00)//00-01-11|11-10-00左轉(zhuǎn)
    {
        EncOld=EncNow,EncX=0;
        if(EncType==1)return('L');   //兩定位一脈沖
        else           //一定位一脈沖
        {
            if(Enc1==0)Enc1=1;
            else
            {
                //Delayms(60);       //延時(shí)降低旋轉(zhuǎn)靈敏度(不能用在定時(shí)器中)
                Enc1=0;
                return('L');
            }
        }
    }
    return(0);           //不旋轉(zhuǎn)返回0
}

uchar display[6]={0};
uint num=0;

//延時(shí)
void delay(unsigned char i)
{
  for(j=i;j>0;j--)
    for(k=125;k>0;k--);
}
/*********************************************************
 蜂鳴器響一聲                                           
**********************************************************/
void beep()
{
    unsigned char y;
    for (y=0;y<180;y++)
    {
      BEEP=!BEEP;                //BEEP取反
	  delay(70);
    } 
    BEEP=1;                      //關(guān)閉蜂鳴器
}
/////////24C02讀寫驅(qū)動(dòng)程序////////////////////
void delay1(unsigned int m)
{	unsigned int n;
  	for(n=0;n
0
回復(fù)
GJGJ
LV.1
21
2019-08-21 23:19
@GJGJ
源代碼如下:#include#includetypedefunsignedcharuchar;typedefunsignedintuint;uchardatatable[10]={60,2,3,4,5,6,7,8,9,0};//發(fā)送數(shù)組uintms_10;uinti,j,k;chara,b;unsignedcharenc,x=0,y=0;sbitPINA=P3^2;sbitPINB=P3^3;sbitLED_R=P1^3;sbitLED_G=P1^4;sbitCm_ok=P1^5;sbitsda=P2^0;//IO口定義sbitscl=P2^1;sbitBEEP=P2^3;//蜂鳴器sbitdula=P2^6;sbitwela=P2^7;sbitsw_12=P3^7;sbitRS=P3^5;sbitRW=P3^6;sbitEN=P3^4;/***********************************************串行口初始化波特率9600,定時(shí)器1,工作方式2*************************************************/voidserial_init(void){TMOD=0x20;//計(jì)時(shí)器1作為比特率發(fā)生器,方式2TH1=0xfd;TL1=0xfd;//裝入初值TR1=1;//計(jì)時(shí)中斷允許SM0=0;SM1=1;//串行口工作于方式2ES=1;//串行口中斷允許REN=1;//接收允許EA=1;//總中斷允許}/***********************************************串行口傳送數(shù)據(jù)傳送顯示數(shù)組各字符給計(jì)算機(jī)*************************************************/voidsend(uchar*dis){while(*dis!=0){SBUF=*dis;dis++;while(!TI);TI=0;//軟件請(qǐng)發(fā)送中斷}}/************************************************************************************************函數(shù)名稱:Encoder函數(shù)功能:編碼器旋轉(zhuǎn)的掃描及處理入口參數(shù):無出口參數(shù):char型0-無旋轉(zhuǎn)'R'-正轉(zhuǎn)(向右轉(zhuǎn))'L'-反轉(zhuǎn)(向左轉(zhuǎn))************************************************************************************************/unsignedcharEncoder(void){staticbitEnc0=0,Enc1=0;staticunsignedcharEncOld,EncX=0;unsignedcharEncNow;bitEncType=0;//設(shè)置編碼器類型:0為一定位一脈沖,1為兩定位一脈沖PINA=1;//PINA置高電平PINB=1;//PINB置高電平if(Enc0==0)EncOld=(PINA?0x02:0x00)+(PINB?0x01:0x00),Enc0=1;//記住初次調(diào)用時(shí)編碼器的狀態(tài)EncNow=(PINA?0x02:0x00)+(PINB?0x01:0x00);//根據(jù)兩個(gè)IO當(dāng)前狀態(tài)組合成16進(jìn)制的0x00|0x01|0x02|0x03if(EncNow==EncOld)return(0);//如果新數(shù)據(jù)和原來的數(shù)據(jù)一樣(沒有轉(zhuǎn)動(dòng))就直接返回0if(EncOld==0x00&&EncNow==0x02||EncOld==0x03&&EncNow==0x01)EncX=EncNow;//00-10|11-01if(EncOld==0x00&&EncX==0x02&&EncNow==0x03||EncOld==0x03&&EncX==0x01&&EncNow==0x00)//00-10-11|11-01-00右轉(zhuǎn){EncOld=EncNow,EncX=0;if(EncType==1)return('R');//兩定位一脈沖else//一定位一脈沖{if(Enc1==0)Enc1=1;else{//Delayms(60);//延時(shí)降低旋轉(zhuǎn)靈敏度(不能用在定時(shí)器中)Enc1=0;return('R');}}}if(EncOld==0x00&&EncNow==0x01||EncOld==0x03&&EncNow==0x02)EncX=EncNow;//00-01|11-10if(EncOld==0x00&&EncX==0x01&&EncNow==0x03||EncOld==0x03&&EncX==0x02&&EncNow==0x00)//00-01-11|11-10-00左轉(zhuǎn){EncOld=EncNow,EncX=0;if(EncType==1)return('L');//兩定位一脈沖else//一定位一脈沖{if(Enc1==0)Enc1=1;else{//Delayms(60);//延時(shí)降低旋轉(zhuǎn)靈敏度(不能用在定時(shí)器中)Enc1=0;return('L');}}}return(0);//不旋轉(zhuǎn)返回0}uchardisplay[6]={0};uintnum=0;//延時(shí)voiddelay(unsignedchari){for(j=i;j>0;j--)for(k=125;k>0;k--);}/*********************************************************蜂鳴器響一聲**********************************************************/voidbeep(){unsignedchary;for(y=0;y
這是當(dāng)時(shí)在做畢設(shè)時(shí)候拍的幾張照片
0
回復(fù)
GJGJ
LV.1
22
2019-08-21 23:20
@GJGJ
[圖片][圖片]這是當(dāng)時(shí)在做畢設(shè)時(shí)候拍的幾張照片

這是演示時(shí)侯的圖片

0
回復(fù)
yujunice
LV.5
23
2019-08-22 13:56
旋轉(zhuǎn)編碼器精度取決于機(jī)械和電氣因素有哪些啊?
0
回復(fù)
薄浩楠
LV.5
24
2019-08-22 22:58
@yujunice
旋轉(zhuǎn)編碼器精度取決于機(jī)械和電氣因素有哪些???
主控芯片使用的什么型號(hào)的呀
0
回復(fù)
GJGJ
LV.1
25
2019-08-22 23:22
@yujunice
旋轉(zhuǎn)編碼器精度取決于機(jī)械和電氣因素有哪些???
一般用帶光電門的數(shù)字編碼器較好,模擬編碼器用起來誤差太大
0
回復(fù)
GJGJ
LV.1
26
2019-08-27 00:00
@GJGJ
一般用帶光電門的數(shù)字編碼器較好,模擬編碼器用起來誤差太大

當(dāng)時(shí)利用串口助手模擬上位機(jī)的

0
回復(fù)
GJGJ
LV.1
27
2019-08-27 00:03
@電源網(wǎng)-璐璐
期待更新[圖片]

在快遞業(yè)的不斷發(fā)展過程中,快遞業(yè)務(wù)逐步包括文件資料、紙質(zhì)合同、公務(wù)信函、研究資料等為主的函件快遞和實(shí)驗(yàn)樣品、高科技產(chǎn)品、高精度儀器和易碎奢侈品等為主的貨物快遞,這兩種貨物越來越多,越來越普及的情況下,大多數(shù)的快遞公司由于其能力有限,資金不足、創(chuàng)新能力弱,難以承擔(dān)運(yùn)輸風(fēng)險(xiǎn),以及安全方面不能讓顧客放心失去競(jìng)爭(zhēng)力。國(guó)際知名的快遞公司依靠其強(qiáng)大的資金支持和群眾優(yōu)勢(shì),不斷提高競(jìng)爭(zhēng)力,在某一區(qū)域甚至全球逐漸形成優(yōu)勢(shì),并開辟了多種新的服務(wù)方式和手段??梢姲踩珕栴}已經(jīng)越來越進(jìn)入快遞行業(yè)的核心競(jìng)爭(zhēng)力標(biāo)準(zhǔn),在這一背景下各種快遞業(yè)務(wù)安全措施,通過各種方法防止意外發(fā)生已勢(shì)在必行。

本設(shè)計(jì)基于單片機(jī)STC12C5A60S2實(shí)現(xiàn)對(duì)快遞車行車時(shí)對(duì)車門開關(guān)的提醒,把車門開關(guān)和行車時(shí)間作為數(shù)字量存儲(chǔ)在24C02芯片中,并通過LCD1602屏實(shí)現(xiàn)對(duì)行車途中車門監(jiān)測(cè)和實(shí)現(xiàn)顯示行車時(shí)間并通過串口實(shí)現(xiàn)與計(jì)算機(jī)的通信實(shí)現(xiàn)對(duì)車行程時(shí)間和誤操作次數(shù)的記錄。

本設(shè)計(jì)使用的旋轉(zhuǎn)編碼器需要更高的分辨率,如果精度較低會(huì)導(dǎo)致車門關(guān)緊卻誤報(bào)警,或者車門未關(guān)緊不能正確顯示。在路況不佳的道路行車時(shí),旋轉(zhuǎn)編碼器的使用需要加裝一個(gè)保護(hù)殼,或者有緩沖的物品防止被撞壞。而且編碼器會(huì)受到大型機(jī)器的干擾,所以需要盡可能遠(yuǎn)離發(fā)動(dòng)機(jī)等機(jī)械。如果運(yùn)輸?shù)缆酚酗L(fēng)沙、水汽等惡劣條件,需要加一個(gè)防塵罩

本設(shè)計(jì)的光電門不僅可以作為統(tǒng)計(jì)行車時(shí)間的標(biāo)志,還可以通過記錄輸出脈沖數(shù),結(jié)合發(fā)動(dòng)機(jī)和車輪齒輪比、車輪直徑計(jì)算行車的路程和速度。

0
回復(fù)
GJGJ
LV.1
28
2019-08-30 17:09
@GJGJ
[圖片]當(dāng)時(shí)利用串口助手模擬上位機(jī)的

本設(shè)計(jì)基于單片機(jī)STC12C5A60S2實(shí)現(xiàn)對(duì)快遞車行車時(shí)對(duì)車門開關(guān)的提醒,把車門開關(guān)和行車時(shí)間作為數(shù)字量存儲(chǔ)在24C02芯片中,并通過LCD1602屏實(shí)現(xiàn)對(duì)行車途中車門監(jiān)測(cè)和實(shí)現(xiàn)顯示行車時(shí)間并通過串口實(shí)現(xiàn)與計(jì)算機(jī)的通信實(shí)現(xiàn)對(duì)車行程時(shí)間和誤操作次數(shù)的記錄。

本設(shè)計(jì)使用的旋轉(zhuǎn)編碼器需要更高的分辨率,如果精度較低會(huì)導(dǎo)致車門關(guān)緊卻誤報(bào)警,或者車門未關(guān)緊不能正確顯示。在路況不佳的道路行車時(shí),旋轉(zhuǎn)編碼器的使用需要加裝一個(gè)保護(hù)殼,或者有緩沖的物品防止被撞壞。而且編碼器會(huì)受到大型機(jī)器的干擾,所以需要盡可能遠(yuǎn)離發(fā)動(dòng)機(jī)等機(jī)械。如果運(yùn)輸?shù)缆酚酗L(fēng)沙、水汽等惡劣條件,需要加一個(gè)防塵罩[20]。

本設(shè)計(jì)的光電門不僅可以作為統(tǒng)計(jì)行車時(shí)間的標(biāo)志,還可以通過記錄輸出脈沖數(shù),結(jié)合發(fā)動(dòng)機(jī)和車輪齒輪比、車輪直徑計(jì)算行車的路程和速度。

0
回復(fù)
發(fā)