- 1、本文档共8页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
51单片机与PC的摩尔斯码通信实验报告 实验概述:通过AT89S52
51单片机与PC的摩尔斯码通信实验报告
实验概述:通过AT89S52单片机键盘持续时间长、短分别对应摩尔斯码(见附录1)的长信号“——”(哒)、短信号“*”(滴),并将收集的“——”和“*”根据摩尔斯码译成对应的字母或数字,再经串口将字母或数字发送到PC机,经上位机软件显示。
原理图:
工作过程:
信号的采集:
当信号经单片机的I/O口采集,即产生一个下降脉冲,在脉冲的下降沿时开始计时,等到上升沿时停止计时,记录低电平持续的时间t1,同理,也记录高电平持续时间t2。
信号的处理:
t1的处理:当10a mst110a ms时,为“——”,系统记录为0;
当t110b ms时,为“*”,系统记录为1。
t2的处理:当10a mst210c ms时,系统认为是“——”与“*”间的间隔;
当10 mst210d ms时,系统认为是字母(或数字)的间隔;
当t210d ms时,系统认为是单词间隔。
注:t1、t210a ms是为了去抖
a b c d可根据实际键盘个人习惯等改变。
信号翻译:在出现字母(或数字)的间隔时,程序按顺序将所采的di da赋给一个五位十进制数,先采的放在十进制数的万位,后采的按顺序付给千位、百位、十位、个位,不够的补2,例如:A为“* --”,经系统转换后为01,再补足五位为01222。
数据的发送:
所转换数据由单片机经RS232电平转换送入PC机串口
当出现字母(或数字)间隔时,单片机便向串口发送数据;
当出现单词间隔时,单片机便向串口发送一个空格。
数据的接收:
由PC机的上位机软件接收串口数据,并将其显示。
源程序:
/**********单片机与PC机间摩尔斯码通信**************************/
#include reg51.h
/***********************约定************************************/
//fosc=11.0592M
#define a 1
/*di最低资格抖动最高资格*/
#define b 20
/*di最高资格da最低资格*/
#define c 50
/*dida间隔的最高资格字符间隔的最低资格*/
#define d 100
/*字符间隔的最高资格字符串间隔的最低资格*/
//电平抖动小于 a*10 ms
//低电平持续介于a*10~b*10 ms间为di(*)
//低电平持续超过b*10 ms为da(--)
//高电平持续小于c*10 ms为dida间隔
//高电平持续介于c*10~d*10 ms为字符间
//高电平持续大于d*10 ms字符串间
/**************************************************************/
/************参数声明*******************/
unsigned char Low_num = 0; /*记录低电平数目*/
unsigned char High_num = 0; /*记录高电平数目*/
unsigned char Design=1; /*P1^0电平标志,若低电平则为0,高为1*/
unsigned char Dida_num=0; /*di da 的个数*/
unsigned int idata Zifu[] = {2,2,2,2,2,2}; /*记录单个字符*/
unsigned char Space_flag=1; /*字符间隔标志*/
unsigned int Send=0; /*存放要发送的字符*/
sbit P1_0 = P1^0; /*键盘接口*/
unsigned int test;
/*******************************发送子程********************/
void send_out(unsigned int Send)
{
if(Send== )
Space_flag=1; /*字符间隔标志置位*/
SBUF = Send;
while (TI == 0);
TI = 0;
文档评论(0)