51单片机与PC的摩尔斯码通信实验报告 实验概述:通过AT89S52 .doc

51单片机与PC的摩尔斯码通信实验报告 实验概述:通过AT89S52 .doc

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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)

pangzilva + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档