




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、51單片機與PC的摩爾斯碼通信實驗報告實驗概述:通過AT89S52單片機鍵盤持續時間長、 短分別對應摩爾斯碼 (見附錄1)的長信 號“一一”(噠)、短信號“*”(滴),并將收集的“一一”和“ * ”根據摩爾斯碼 譯成對應的字母或數字,再經串口將字母或數字發送到PC機,經上位機軟件顯示。原理圖:工作過程:一、信號的采集:當信號經單片機的I/O 口采集,即產生一個下降脈沖,在脈沖的下降沿時開始計時, 等到上升沿時停止計時,記錄低電平持續的時間t1,同理,也記錄高電平持續時間t2。二、信號的處理:t1的處理:當10a ms<t1<10a ms時,為“”,系統記錄為0;當t1>10b
2、 ms時,為“ * ”,系統記錄為1。t2的處理:當10a ms<t2<10c ms時,系統認為是“”與“ *”間的間隔;當10 ms<t2<10d ms時,系統認為是字母(或數字)的間隔; 當t2>10d ms時,系統認為是單詞間隔。注:t1、t2>10a ms是為了去抖a b cd可根據實際鍵盤個人習慣等改變。信號翻譯:在出現字母(或數字)的間隔時,程序按順序將所采的di da賦給一個五位十進制數,先采的放在十進制數的萬位,后采的按順序付給千位、 百位、十位、個位,不夠的補2,例如:A為“ * - ”,經系統轉換后為01,再補足五位為 01222。三、數
3、據的發送:所轉換數據由單片機經 RS232電平轉換送入PC機串口當出現字母(或數字)間隔時,單片機便向串口發送數據;當出現單詞間隔時,單片機便向串口發送一個空格。四、數據的接收:由 PC 機的上位機軟件接收串口數據,并將其顯示。 源程序:/*單片機與 PC 機間摩爾斯碼通信*/#include <reg51.h>*約定 */fosc=11.0592M #define a 1/*di 最低資格 & 抖動最高資格 */#define b 20/*di 最高資格 &da 最低資格 */ #define c 50 /*dida 間隔的最高資格 & 字符間隔的最低資格
4、 */ #define d 100 /* 字符間隔的最高資格 &字符串間隔的最低資格 */ /電平抖動小于 a*10 ms/低電平持續介于/低電平持續超過/高電平持續小于 /高電平持續介于a*10b*10 ms 間為 di(*) b*10 ms 為 da(-) c*10 ms 為 dida 間隔 c*10d*10 ms 為字符間/高電平持續大于d*10 ms 字符串間*參數聲明*unsigned char Low_num = 0; unsigned char High_num = 0;unsigned char Design=1;unsigned char Dida_num=0;uns
5、igned int idata Zifu = 2,2,2,2,2,2;unsigned char Space_flag=1; unsigned int Send=0;sbit P1_0 = P1A0;/* 記錄低電平數目 */* 記錄高電平數目 */*P1A0電平標志,若低電平則為0,高為1*/*di da 的個數 */* 記錄單個字符 */* 字符間隔標志 */*存放要發送的字符 */*鍵盤接口 */unsigned int test;*發送子程 *void send_out(unsigned int Send)if(Send=' ')Space_flag=1;/* 字符間隔
6、標志置位 */SBUF = Send; while (TI = 0); TI = 0;*/* 將所采集的信號轉換為字符 void change(void)unsigned int Au=0;test=(10000*Zifu0+1000*Zifu1+100*Zifu2+10*Zifu3+1*Zifu4+0*Zifu5);if(Zifu0!=2|Zifu1!=2|Zifu2!=2|Zifu3!=2|Zifu4!=2|Zifu5!=2)Au= test;switch(test)case1222: Send'A'break;/*A*/case10002: Send ='B
7、9;break;/*B*/case10102: Send ='C'break;/*C*/case10022: Send ='D'break;/*D*/case2222: Send'E'break;/*E*/case102: Send= 'F'break;/*F*/case11022: Send ='G'break;/*G*/case2: Send= 'H'break;/*H*/case222: Send= 'I'break;/*I*/case1112: Send'J'
8、break;/*J*/case10122: Send ='K'break;/*K*/case1002: Send'L'break;/*L*/case11222: Send ='M'break;/*M*/case10222: Send ='N'break;/*N*/case11122: Send ='O'break;/*O*/case1102: Send'P'break;/*P*/case11012: Send ='Q'break;/*Q*/case1022: Send'R
9、39;break;/*R*/case22: Send= 'S'break;/*S*/case12222: Send ='T'break;/*T*/case122: Send= 'U'break;/*U*/case12: Send= 'V'break;/*V*/case1122: Send'W'break;/*W*/case10012: Send ='X'break;/*X*/case10112: Send ='Y'break;/*Y*/case11002: Send ='Z&
10、#39;break;/*Z*/case11111: Send ='0'break;/*0*/case1111: Send= '1'break;/*1*/case111: Send= '2'break;/*2*/case11: Send= '3'break;/*3*/case1: Send= '4'break;/*4*/case0: Send= '5'break;/*5*/case10000: Send ='6'break;/*6*/case11000: Send ='7
11、9;break;/*7*/case11100: Send ='8'break;/*8*/case11110: Send ='9'break;/*9*/default : Send ='?' J send_out(Send); Dida_num=0; Send = 0;/* 調用發送子程 */ /* 清數組記數 */* 清 Send*/*低電平處理函數*Dida_num+;/*void high(void)unsigned char i;高電平處理函數*if(Low_num > a && Low_num <= b&
12、;&Dida_num<=5)/* 若電平持續不到 10b ms*/* 為 di*/ZifuDida_num = 0;/* 記錄為 0*/Dida_num+;if(Low_num > b&&Dida_num<=5)/* 若低電平持續超過 10bms*/* 為 da*/ZifuDida_num = 1;/* 記錄為 1*/void low(void)if(High_num =c)/* 若高電平持續大于 10c*/* 字符處理子程 */change();for(i=0;i<=5;i+)Zifui = 2;/* 字符數組重置 */if(High_num
13、>d&&Space_flag=0)志位為 0*/send_out(' ');High_num = 0;/*timer0中斷服務程序 */* 若高電平持續超過 10d ms 并且字符間隔標/* 發送空格 */* 高電平計數清零 */void timer0(void) interrupt 1 using 1TH0 = 0xDC;TL0 = 0x00;if(Design = 0)if(High_num>0&&High_num<=a)Design = 1; elseLow_num+; if(Low_num>=200) Low_nu
14、m=200; if(Low_num=1)High_num=0;if(Design = 1)if(Low_num>0&&Low_num<=a)Design = 0;elseHigh_num+; if(High_num>=200) High_num=200; if(High_num=1)low();Low_num=0;high();/* 定時 10ms*/* 低電平標志 */* 軟件去抖 */* 低電平計數加 1*/* 防止 Low_num 溢出 */* 高電平計數清零 */* 高電平標志 */* 軟件去抖 */* 高電平計數加 1*/* 防止 High_num
15、溢出 */* 若第一次高電平 */* 調用低電平處理函數 */* 低電平計數清零 */* 調用高電平處理函數 */TR0=1;/* void main(void) TMOD = 0x21;TH0 = 0xDC;TL0 = 0x00;EA = 1;ET0 = 1;TR0 = 1;主函數*/*定時器 0方式 1|定時器 1方式 2*/* 定時 10ms*/*CPU 開中斷 */*T/C0 開中斷 */* 啟動 T/C0*/TH1 = 0xFD;TL1 =0xFD;SCON= 0xD8;PCON= 0x00;TR1 =1;/* 設置波特率為 9600*/* 設置串行口工作方式 */while(1)i
16、f(P1_0 = 0)Space_flag=0;/* 清字符間隔位 */Design = 0; /* 低電平標志 */elseDesign = 1; /* 高電平標志 */ 說明 :本程序在 Windows XP SP2 系統上,偉福 6000 仿真軟件, KEILC 編譯器, POD-H8X5X 仿真頭下測試通過調試說明: 1、注意按鍵按下與抬起持續的時間,若所發送數據沒有在摩爾斯碼內,講認為 是錯碼,發送問號“?”2、按鍵不同所用的 a b c d 可能不同,測試鍵盤的速度的源碼見附錄2,在串口調試助手中顯示 H 表示高電平, L 表示低電平,而且每個H、 L 代表 10ms附錄 1:摩爾
17、斯碼 簡介:電報最早是由美國的摩爾斯在 1844 年發明的,故也被叫做摩爾斯電碼。它由兩種基本信號和不同的間隔時間組成:短促的點信號 "*",讀”的” (Di);保持一 定時間的長信號"-",讀"答"(Da).間隔時間:滴,1t;答,3t;滴答間,1t;字母間,3t;字間,5t (自定義某一單位時間t).A: *B:C:D:E: *F: * *G:H: * * * *I: * *J: *K:L: *M:N:O:P: *Q:R: *S: * * *T:U: * *V: * * *W: *X:Y:Z:0110001010100 0 00101100000 0001111010100 11 10 11101101101 010 000 1 001 0001 011 1001 1011 11000: 1: * 2:3:4:5:1111101111001110001100001000006: - * * * * 10000 7: - - * * * 110008: * * 111009: * 11110注: * 表示短信號, - 表示長信號 所以 SOS 就是三短三長三短 附錄 2:/* 按鍵速度測試程序 */ # include<reg51.h># define ucha
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 合作協議書的基本內容和介紹
- 觀看電影哪吒之魔童降世的觀后感作文(9篇)
- 小草的特點的作文600字13篇
- 個性化辦公用品供應與服務協議
- 2025年茶藝師鑒定考試試卷難點分析與解答
- 雨夜的情感流露抒情作文4篇
- 2025年護士執業資格考試題庫:護理科研方法與實踐操作技能真題解析試題
- 2025年安全生產標準化建設案例分析考試試題解析
- 2025年高處作業特種作業操作證考試試卷(高空作業安全操作案例分析)
- 地理信息系統GIS技術應用與案例分析題庫
- 黑龍江司法警官職業學院2025年招生政治考察表
- (正式版)CB∕T 4549-2024 船舶行業企業加油-駁油作業安全管理規定
- 得寶松封閉治療
- 三廢環保管理培訓
- 23秋國家開放大學《液壓氣動技術》形考任務1-3參考答案
- 21ZJ111 變形縫建筑構造
- 燃機發電機轉子一點接地保護全部校驗作業指導書
- 2019-2020學年廣東省廉江市實驗學校北師大版五年級下冊期末復習數學試卷1
- 天龍自動打怪腳本
- 高中英語課堂導入探究結題報告ppt課件
- 三人搬運法操作考核評分標準
評論
0/150
提交評論