科学网

 找回密码
  注册

tag 标签: 单片机

相关帖子

版块 作者 回复/查看 最后发表

没有相关内容

相关日志

单片机QQ群_51单片机QQ群_C51
热度 1 outcrop 2011-11-21 23:26
51单片机学习交流QQ高级群: 72574973 相关话题:51(MCS51)单片机基础、51单片机汇编语言、C51语言、Proteus对单片机的仿真与电路设计、Keil C51、单片机小应用与开发等。 也欢迎其他系列单片机朋友加入交流学习, 51单片机QQ群 入群验证暗号:51。 因为打算探索下专业知识结构的构建,觉得单片机可能是一个不错的切入点。
个人分类: 机电工程|7092 次阅读|2 个评论
单片机硬件设计的经验总结
lcj2212916 2011-11-20 17:02
http://radarew.5d6d.com/thread-512-1-1.html
2153 次阅读|0 个评论
[转载]单片机C51编程资料
热度 2 outcrop 2011-10-23 21:21
单片机 » 单片机C51编程资料 C51控制矩阵键盘 51单片机4X4矩阵键盘(查表法) - C51源代码 51单片机4x4矩阵键盘实验(计算法) - C51源代码 51单片机矩阵键盘按键键值显示程序 - C51源代码 51单片机矩阵键盘模拟电子琴 - C51源代码 C51控制 1602 液晶 1602 LCD 模块 是常用的液晶显示模块,相关介绍以及使用说明请参考 1602 LCD 。下面是相关的C51源代码: 51单片机1602LCD串行方式显示 - C51源代码 51单片机1602LCD计数显示实验 - C51源代码 51单片机1602LCD简单时钟显示实验 - C51源代码 51单片机1602LCD显示字符A - C51源代码 51单片机1602从右到左移动显示字符实验 - C51源代码 51单片机LCD1602 滚动显示 - C51源代码 51单片机LCD1602 移动显示C - C51源代码 51单片机LCD1602显示Welcome - C51源代码 51单片机LCD随机数字显示 - C51源代码 51单片机LCD循环右移显示Welcome to China - C51源代码 51单片机LCD液晶时钟程序 - C51源代码 C51控制 24C08 E2PROM 51单片机24C08断电记忆功能的00-99计时器 - C51源代码 51单片机24C08多花样流水等实验 - C51源代码 51单片机将按键次数写入AT24C08,再读出并用1602LCD显示 - C51源代码 51单片机将数据0x0f写入AT24C08再读出送P0口显示 - C51源代码 C51控制 DS1302 时钟电路 51单片机1602--DS1302时钟 - C51源代码 51单片机1602LCD-DS1302时钟实验 - C51源代码 51单片机DS1302数码管读取演示 - C51源代码 51单片机DS1302数码管显示时间日期可调 - C51源代码 C51控制 12864液晶 (带字库) 51单片机12864串行驱动演示 - C51源代码 51单片机12864图文显示测试 - C51源代码 51单片机12864中文显示测试 - C51源代码 C51控制 18B20数字温度显示系统 51单片机18B20与1602LCD温度实验 - C51源代码 51单片机18B20测温1602LCD显示 - C51源代码 51单片机18b20测温数码管显示实验 - C51源代码 C51控制红外接收 51单片机红外遥控解码 - C51源代码 51单片机红外接收1602LCD显示 - C51源代码 51单片机红外遥控解码数码管显示实验 - C51源代码 51单片机数码管遥控解码 - C51源代码 51单片机遥控解码通过电脑串口显示 - C51源代码 C51控制串口通讯 51单片机串口测试程序 - C51源代码 51单片机串口向PC及发送字符 - C51源代码 C51控制单片机外部中断实验 51单片机外部中断计数2位数码管显示 - C51源代码 51单片机外部中断计数器 - C51源代码 C51控制8X8点阵 51单片机8X8点阵测试实验 - C51源代码 51单片机8X8点阵滚动显示 - C51源代码 51单片机8X8点阵滚动显示温度 - C51源代码 51单片机8X8点阵上下滚动显示 - C51源代码 C51控制超声波测距 51单片机21-超声波测距实验 - C51源代码 C51控制步进电机 51单片机步进电机加速减速匀速演示 - C51源代码 51单片机步进电机正反转调速1602显示 - C51源代码 51单片机步进电机正反转停止实验 - C51源代码 C51控制直流电机 51单片机直流电机PWM调速实验 - C51源代码 51单片机直流电机正转反转停止实验 - C51源代码 C51控制数字编码开关 51单片机控制数字编码开关 - C51源代码 51单片机控制数字编码开关LED显示 - C51源代码 C51控制 PCF8591 AD转换实验 51单片机PCF8591 AD转换实验 - C51源代码 51单片机PCF8591 DA转换实验 - C51源代码 C51控制PS2接口 51单片机PS2键盘解码实验 - C51源代码 51单片机PS2鼠标控制实验 - C51源代码 C51控制无线遥控接收模块实验 51单片机无线遥控接收模块实验 - C51源代码 C51控制单片机综合实例 51单片机PC与单片机双向通讯智能温控程序 - C51源代码 51单片机-VB遥控播放器红外遥控解码 - C51源代码 51单片机-VB控制继电器实验 - C51源代码 51单片机VB上位机控制LED灯程序 - C51源代码 51单片机VB串口继电器控制实验 - C51源代码 51单片机VB控制4X4控制系统 - C51源代码 51单片机VB上位机控制数码管 - C51源代码 51单片机0-9999每秒加1计数器 - C51源代码 51单片机1602、18B20、DS1302电子时钟源程序 - C51源代码 51单片机1602、18B20电子钟 - C51源代码 51单片机1602、24C08、4X4键盘密码锁 - C51源代码 51单片机12864 18B20温度计(串行方式显示) - C51源代码 51单片机12864、DS1302时钟、18B20温度计 - C51源代码 51单片机PWM控制LED灯渐亮渐灭实验 - C51源代码 51单片机功能完整的1602LCD时钟实验 - C51源代码 51单片机交通灯 - C51源代码
个人分类: 机电工程|4942 次阅读|3 个评论
科研的开端(续一)
热度 10 boxcar 2011-8-28 08:54
昨天贴出了我上个月开始写,昨天才告一段落的博文“科研的开端”【 1 】,反响不错, 24 小时里有近 2500 的点击量。看来,大家对这样的故事还有些兴趣,博友和读者的关注就是我写下去的巨大推动力,所以今天早上起来,决定继续写这段往事。在上一篇博文中,我曾提及那个暑假我和另外两个同学,在班里被称为“老蛇”的王志刚和“班头”的班长徐玉朋两位同学在那段时间里还做了一台智能数字微秒计,今天就说说这台仪器研制过程中发生的故事。 上文我还提到,里佐威老师在力热实验中大胆引入了学生自选的探索性实验,我记得那个系列的实验中有两个实验是“万有引力常数的测量”和“固体中的声速测量”的印象尤其深刻。前一个实验,是我和班长一组,由于前面同学在实验过程中不小心弄坏了卡文迪许扭秤的油阻尼部件,到我们这里只能靠空气阻尼来使扭秤(这时候更像扭摆)缓慢地停止了,所以那天从上午 9 点半到晚上 10 点半,用了 13 个小时,才测量 3 次数据。后一个实验,我们发现用 RC 充放电进行钢棒与钢板的接触时间的办法测量并不精确,而用当时的数字毫秒计在这个测量中只能给出两位数字,很不精准,当时就很希望有一台能进行微秒级时间测量的仪表(这也是后来我们自己组团,自主研发的引子)。 在哪个炎热多雨的暑期,我们这个小组的 3 个人都选择留在学校里做科技创新,不过最初我们三个分属于三个完全不同的课题组。我和樊文俊去做“液芯光纤温度传感器”,徐玉朋和苗同学跟杨玉昆老师做半导体薄膜的热壁外延生长及其 X 射线衍射测试,王志刚同学(老蛇)和另一个老师做一个小的教研课题。老蛇的课题难度不大,而老蛇本人极其聪明,所以没几天就做完了,而这时他还想再做点儿东西,最好是那种看得见摸得着用得上的装置。在一天的黄昏,我们几个仍留在学校的同学聚集在 229 寝室(一个能住 16 个人的大寝室,当时我们住 11 人)地当中的桌子旁聊天,老蛇说出他的想法,聊着聊着,话题聊到了计算机技术上。在高中就有一定计算机编程基础(这在当时很不容易)、当时担当着物理系学生机房“首席管理员”的老蛇很希望用计算机做点儿东西。不过,那时的计算机还很稀罕,机房的管理老师肯定不会容许我们这些小本科生去随便鼓捣那几台 Solar 机(一种 PC 兼容机,主频 8MHz ,内存 640k ,有两个 5 吋 360k 的软驱)硬件部分,而纯软件编程,也没有啥值得做的好项目。这时,见多识广的老蛇提出,可以用单板机(代表型号是用 Z-80CPU 的 TP-801 )做点儿硬件的。拿单板机能做什么?几经讨论之后,我们决定利用它的定时 / 计数器功能做一个微秒级时间测量的仪表。次日,在当时我们做实验的房间角落里找到了一台设备,上面有一部 TP-801 单板机,但在一番钻研之后,老蛇觉得这个单板机要想使用还是有很大的难度的。那几天他又查了些资料后回来说,可以用集成度更高( PIO 、 CTC 、 SIO 等硬件芯片等都和 CPU 一起集成在一个不大的芯片内)的单片机来做这个项目,型号就选择当时很风靡的 Intel MCS-51 系列的 8031 单片机。 用单片机做,难度也不小,虽然芯片不算太贵,但却必须要有一个专门的开发系统。这时我们又在系内展开了搜索,最后打听到当时的核物理教研室的核电子学组就有这种开发系统,当时那里有老师用单片机开发熔融指数仪等设备。当时主管科研的副系主任周介文老师(在核物理专业)很支持我们,他出面与核物理的老师联系,安排我们去那里做实验,而做这个项目的经费资助(干这个活需要用不少元器件,最后还要加工电路板,都是要花钱的)则来自于担任力热实验室主任里佐威老师。说干就干!这个新的由学生自己攒起来的课题组就算成立了,老蛇立刻从图书馆借来单片机的图书资料,钻研其硬件结构和汇编语言编程,我的任务是进行外围硬件电路设计,并协助他用面包板把这些电路“插”出来。于是,暑假当中有那么几天,我分身二用,在理化楼(物理系本部所在,红外与光纤教研室的实验室在其二楼)和白楼( 4 楼是核物理教研室的根据地)之间奔走。聪明的老蛇极有效率,他用了不长的时间就学会了汇编语言编程,在暑假结束之前,我们完成了在面包板上进行的原理性验证,已经能够用这个电路实现 2 微秒分辨率(当时用的 6MHz 晶振, 12 分频)的时间测量了。下面,就是如何装出一台仪器的问题了。 最开始,我们想弄一个类似于当时的开发系统那样的扁平盒子,把四联的面包板连同上面的一堆集成块、数码管和单芯线一股脑塞进去。这种工艺水平的东西,只能算是个实验装置,绝对算不上产品。虽然现在我也偶尔会看到学校展示的本科生科技创新课题的展板上看到类似很粗糙的东西,但即使在当时,希望追求完美的老蛇也是觉得难以接受的,更重要的一点是,面包板插出来的电路可靠性极差,轻微的震动都可能造成接触不良,出现一些刁钻古怪的异常现象。如果采用手工绘制电路板的做法,当时班里电路最强悍的两个人、动手能力最强的班长徐玉朋和我都没把握绘制出线宽很小、且定位要及其精准的双面板(这种尝试多年后我曾做过一次)。这个问题很快得到解决,里佐威老师同意由他的实验室出资去采购装机所用的元器件并制作双面印刷电路板( PCB ),当时的报价是 0.3 元 / 平方厘米,虽然我们只做了一块 PCB ,加上各种费用,也花掉了 150 元(这相当于当时我 3 个半月的伙食费!)。那块电路板是老蛇自学了一个 SmartWork 的 PCB 绘制软件,用了一天一宿一条线、一条线,一个焊盘一个焊盘地手工画出来的,当时已经有了“烫狗”等更高级的软件,但是我们没有合适的计算机来用它,而小巧玲珑的 SmartWork 已经足够了。我们选用的机箱是裴力老师从设备处废旧仪器仓库要来的一台旧仪器的上拆下来的。电路板有了,元器件都齐了,最后的装机工作也就提到了议事日程上来了。 那段时间已经开学,我们只能在下课后跑进实验室去完成自己的制作,好在当时的教室和实验室都在理化楼,奔走的距离已经大大缩短了。此时因为两个项目在齐头并进,两头跑势必耽误两个项目的进度,而且在动手装机方面,当时我也没有什么经验和见识,所以微秒计的课题组必须“扩招”,这次来的“新人”就是此前也没少参与讨论,但因为必须每天值守设备无法分身的班长徐玉朋(“班头”)。“班头”出身矿区的工人家庭,他父亲也是个资深的业余无线电爱好者,自己常动手做些东西的,所以他的见识和动手能力要比出身城市机关小职员 - 小学教师家庭的我强悍得多。在随后的装机工作中,班头充分发挥他在焊接、加工制作方面的优势,废寝忘食努力工作,终于圆满地完成了整机结构设计和安装调试的工作。随着最后一个零件安装完成,一张打印有“智能数字微秒计”字样的打印纸条被用透明胶带粘贴到班头用锉刀修整出一个个开孔的旧的喷砂面板上,我们的这台仪器宣告最后完工。还好,时间掌握的不错,尚在学校评奖答辩之前。 不过,评奖的过程似乎不是很幸运,这台在我眼中堪称完美的研究成果,在学校的评奖中没能得到太高的评价,仅仅获得了校级的二等奖,无缘全国大学生“挑战杯”竞赛的展示和评奖,给我们这段激情燃烧岁月留下了些许的遗憾。究其原因,这台仪器出身有些低微,它只是 3 个本科生自己鼓捣出来的,然后才匆匆找了个导师;虽然这台仪器的实用性很强(此前力热实验室大量装备的都是 0.1 毫秒分辨率的毫秒计,这台仪器的分辨率是 2 微秒!),但原理上的新颖性似乎不算太强,搁到现在已经是单片机开发系统中的标准实验了;而这个作品表现出的完整的体系结构和接近产品级的工艺水平似乎并不是当时评比所看重的。 我个人从这段研制经历中收获颇丰,跟着老蛇,我开阔了单片机方面的视野,初窥单片机技术的门道(可惜在背下来 51 系列和 98 系列单片机的助记符之后,没自己亲身实战一下),跟着班头,我学到了加工制作方面的很多知识。 关于本科阶段参与课外科技创新活动的体会和利弊得失分析,我在后续博文中继续探讨。 (未完待续) 参考: 【1】吕喆:科研的开端 http://blog.sciencenet.cn/home.php?mod=spaceuid=111635do=blogid=480049from=space
个人分类: 科研|7804 次阅读|23 个评论
自由与公平-智能汽车竞赛
zhuoqing 2011-8-2 09:17
自由与公平-智能汽车竞赛
全国大学生智能汽车竞赛是学生准备一辆在现场能够沿着封闭跑道自主运行的车模,比赛速度。 现在问题是如何杜绝一个所学校制作多个技术性能一样的车模,组成不同的队伍参赛,这样有损比赛的公平性。 现在有一个方案解决方案就是同一所学校的参赛队伍必须使用不同的单片机,这样就可以避免相同的车模出现在现场。 这样对于同一所学校的参赛队伍就会产生比赛平台不公平的错觉。 究竟哪一方面需要做出权衡呢? 智能车比赛现场 仅仅区别不同的芯片
个人分类: 我的经验|3608 次阅读|0 个评论
80C51单片机教程
lcj2212916 2011-4-8 18:04
广州周立功 单片机 发展有限公司的80C51培训教程,共184页,对于初学者是比较有用的。 http://radarew.5d6d.com/thread-148-1-1.html
3076 次阅读|0 个评论
将PC窗口菜单程序移植到单片机 问题与解决方案
chrujun 2010-9-29 16:40
让基于单片机的仪器具有漂亮的窗口、对话框和菜单,对任何人来说都是一个挑战。特别是多级窗口、菜单和对话框,没有1年功夫是搞不定的。 经过几个月的功夫,我成功将PC环境下运行的一个支持菜单和对话框的C程序移植到8051单片机上,可以显示汉字,输入数字和选择项。 先看看单片机系统的硬件配置。系统核心为新华龙8051系列单片机,64K FLASH程序存储器,9K XRAM。输出为支持汉字显示的320*240显示屏,输入为自制扫描键盘,有10个数字和几个功能键。 窗口菜单程序来自网上公开资料,基于C语言,只能显示西文字符,用BORLAND C编译后可以在DOS环境下运行。 第一个步工作是编写getkey()和putchar()函数,getkey()通过中断扫描用户的键盘输入,返回ASCII码。putchar()函数可以显示汉字字符和西文字符。另外一个函数是光标定位函数,指定输出的位置。 第二步工作是修改原程序,很多DOS下的函数,需要想办法替换或屏蔽掉,全部改成单片机C语言可以支持的函数。编译的时候出了N多错误,花了2周时间全部搞定了。 第三步工作是设计要显示的菜单和对话框,确定每个单元要显示的位置。然后将定义好的菜单和对话框结构体放到窗口程序要求的位置,再加上一些必要的代码,整个移植工作就准备待命了。 第四步工作是运行和调试程序。结果几次调试,大功告成,菜单和窗口可以显示了,多级菜单和多级窗口,也可以搞定。 出现的一个大问题是从子对话框返回时,父对话框的变量变了。将编译器的优化级别设置的最低级,按照大模式(64K)编译后,问题得到全部解决。
个人分类: 地球物理及仪器|6983 次阅读|2 个评论
巧改putchar函数,实现单片机下多形式输出
chrujun 2010-9-29 16:13
最近看学生编的单片机C程序,发现多个地方出现类似的下面两行: len=sprintf(sdata,@:%c %02u-%02u-%02u %02u:%02u:%02u\r\n, DataBuf , (unsigned int)DataBuf +2000,(unsigned int)DataBuf ,(unsigned int)DataBuf , (unsigned int)DataBuf ,(unsigned int)DataBuf ,(unsigned int)DataBuf ); for(i=0;ilen;i++) UART0_OP(sdata ); 第一行生成一个字符串,第二行将字符串通过单片机串口1输出。UART0_OP函数如下: void UART0_OP (unsigned char opdata){ unsigned char outputdata; outputdata=opdata; ES0=0; EA=0; SBUF0=outputdata; while(TI0==0); TI0=0; ES0=1; EA=1;} 其实,可以把UART0_OP修改成putchar()函数,之后可以用printf等函数直接输出。在单片机编译器的LIB目录下,原有的putchar()函数内容如下: /* * putchar (full version): expands '\n' into CR LF and handles * XON/XOFF (Ctrl+S/Ctrl+Q) protocol */ char putchar (char c) { if (c == '\n') { if (RI) { if (SBUF == XOFF) { do { RI = 0; while (!RI); } while (SBUF != XON); RI = 0; } } while (!TI); TI = 0; SBUF = 0x0d; /* output CR */ } if (RI) { if (SBUF == XOFF) { do { RI = 0; while (!RI); } while (SBUF != XON); RI = 0; } } while (!TI); TI = 0; return (SBUF = c); } #if 0 // comment out versions below /* * putchar (basic version): expands '\n' into CR LF */ char putchar (char c) { if (c == '\n') { while (!TI); TI = 0; SBUF = 0x0d; /* output CR */ } while (!TI); TI = 0; return (SBUF = c); } /* * putchar (mini version): outputs charcter only */ char putchar (char c) { while (!TI); TI = 0; return (SBUF = c); } #endif 这个函数有3个版本,最后一个函数是最简单的,我进行了如下修改: /* * putchar (mini version): outputs charcter only */ char putchar (char c) { ES0=0; EA=0; SBUF0=c; while(TI0==0); TI0=0; ES0=1; EA=1; return c; } 然后把其它两个函数设置成不编译模式。将这个函数加入工程文件后, 前面一段程序可以作如下修改: printf(@:%c %02u-%02u-%02u %02u:%02u:%02u\r\n, DataBuf , (unsigned int)DataBuf +2000,(unsigned int)DataBuf ,(unsigned int)DataBuf , (unsigned int)DataBuf ,(unsigned int)DataBuf ,(unsigned int)DataBuf ); 也就是说,修改和加入putchar()函数后,我们可以用printf, puts等函数实现输出。 事实上,只要修改LIB下的getkey, 和putchar函数,让这两个函数实现单个字符的输入和输出,我们就可以用丰富的标准I/O函数实现字符串的输入和输出,而不用去编写专门的字符串输入和输出函数。 对学生编写的程序进行全面修改后,编译后的代码少了10%以上,对字符的输出也更加方便和灵活了,也去掉了专门的数组sdata.
个人分类: 地球物理及仪器|9430 次阅读|1 个评论
C8051单片机C语言程序设计的几个深层次问题及解决方法
chrujun 2010-9-29 11:17
当在单片机(8051)环境下编写C语言程序设计时,常常会发生一些奇怪的现象。一个变量明明赋值为500,在运行过程中却莫名其妙地变成1000。 在WINDOWS下运行完全正常的算法,移植到单片机上就会出错。 如果无法保证一个变量的值按照程序设计者的要求变化,程序出现各种乱象就不奇怪了。 这种现象出现在C语言程序比较长,子程序比较多,或是子程序的层次比较多的场合。 因此,在单片机环境下用C语言开发比较大的程序,很容易出现各种问题。 这种问题出在编译器优化上。由于单片机资源有限,编译器采取了很多优化手段来减少资源占用。 在KEIL C上,编译器优化的层次有9级。然而,仅仅是二级优化(Data overlaying),就会导致长程序出现问题。 对于比较长的程序,应该只使用一级优化,更先进的优化最好不要用,否则会出现无法预料的问题。 用单片机开发比较长的程序时,应该选择有大容量程序存储空间和数据存储空间的单片机,将编译器优化限制在第一级,其它层次优化尽量避免用。 因为二级优化的数据覆盖手段可以把变量值改变,导致程序运行出错。
个人分类: 地球物理及仪器|7769 次阅读|4 个评论
单片机----【直流电机旋转角度控制(2)】
Kupeprntlkn 2010-8-30 11:34
前面分析了理论基础,下面说下测试方法和我最后的作品,呵呵 1串行通信调试 串行通信包括上位机和下位机通信,由于对通信这块的理解不熟,导致刚开始编写这块程序浪费了很多时间。 对上位机调试我采用的方法是先编写上位机程序,通过把串口的2引脚(TXD)和3引脚(RXD)短接,直接用上位机发送数据,看它能否收到,依次来验证上位机编写是否正确。 对下位机调试在编写下位程序后,通过串口调试助手,给单片机发送数据,观察得到的是否应为单片机里往上发的数据,由此可以初步验证下位机发送部分的正确,然后在逐步调试下位机发送测得数据。在调试中刚开始发现当数据大于255时,串口助手得到的数据就会复位从0开始,通过不断修改程序,最后可以发送从0-65535间的数据。 2 驱动电路调试 本次实验驱动电路做了两个电路,一个是H桥驱动电路,一个是L298驱动电路,这块也是问题最多的一块,下面是具体调试过程、出现问题、解决方法与实验结果。 H桥驱动电路调试,刚开是H桥电路是按前面原理图搭建的,均采用三极管,在完成电路后,上电发现电机顺时针转时左上边三极管发烫,逆时针转时右上边三极管发烫,分析认为是电路驱动电流太大,所以管子发烫,最优换来一种方案,采用MOS管IFR9540和IFR540替换掉原来的三极管8050和8550,H桥驱动竟然不运作,最后不断调试,发现是硬件原因,但电机运行是管子仍然有些发烫,这个问题很长时间没有解决,直到最后把PWM频率降低后才很好的解决了这个问题。 L298驱动电路调试,在调试中发现,当驱动电路前加光耦隔离是,12V和5V电源的地,与单片机的地都是一个很值得思考的问题,在最好不断调试中发现,尽量把光耦后面电路的所有地共地,所有光耦前面的地共地,要分开。在测试中发现很多问题其实是在硬件中,导线的焊错、虚焊,芯片引脚用法的错误,基本都是集中在这些问题上。 3 脉冲获取调试 在把上位机、下位机,驱动电路,脉冲捕获程序都编好后,就可以进行编码器脉冲的捕获,依次来验证所编写的程序是否正确。编码器输出脉冲是360个/转,所以电机没转一圈,所捕获的编码器脉冲个数应为360个。调试采用把程序吓到单片机里,用串口助手开观察,上电运行,让电机转一圈,在观察窗口中得到的计数。发现没次运行到255后就会从0开始,应为下位机发热是高低8位的16进制数,所以最大是255.经过不断调试,最后采用把得到的脉冲数首先对256取余数放到低8位,在用计数值减去低8位的值对256取商放到高8位,这样最到发送值就可以达到256256+256,既可以发送0-65536之间的数,很好的解决了发送大于255数的问题。 4.上位机界面 5.最后成品
个人分类: 单片机|3003 次阅读|0 个评论
单片机----【串口通讯-上位机】
Kupeprntlkn 2010-8-30 11:26
上位机的程序比较好写,刚开始用的VC写的,后来碰到一个问题,想了好几天不道这么弄,问人也没得到具体答案,最后直接换了VB来编上位机程序,采用是它的控件MSCONN,下面说下程序方根内容 1.初始化 MSComm1.CommPort = Combo2.Text MSComm1.Settings = 9600,n,8,1 MSComm1.InputMode = comInputModeBinary MSComm1.InBufferCount = 0 MSComm1.RThreshold = 1 MSComm1.OutBufferCount = 0 很简单吧 2.发送部分 SetS = Text4.Text a(1) = Val(Text4.Text) Mod 256 a(0) = (Val(Text4.Text) - a(1)) / 256 If Combo1.Text = 顺时针 Then Dir1 = True Dir2 = False ElseIf Combo1.Text = 逆时针 Then Dir1 = False Dir2 = True ElseIf Combo1.Text = 停止 Then Dir1 = False Dir2 = False End If a(2) = Dir1 a(3) = Dir2 If MSComm1.PortOpen = True Then MSComm1.Output = a Else MsgBox (串口是关闭的,请先打开串口) End If 我这样写目的是让它发送一个数组,一次性把电机转动方向,角度等都发过去,当下位机接收时也要设成接收数组才可以 3.接收部分 indata = MSComm1.Input i = indata(0) * 256 + indata(1) 这个更简单,二句话的事,表示把高8位和低8位数据同时显示,下位机发送时先发高8位,再发低8位,这样上位机可接收的数据范围是0-65535,很大的了
个人分类: 科研相关|2126 次阅读|0 个评论
单片机----【串口通讯-下位机】
Kupeprntlkn 2010-8-29 14:57
下位机串口通讯主要包括串品初始化,和串口中断两部分 1.采用定时器0作串 //初始化子程序 void UART_init() { TMOD |=0x20; //定时器1,工作方式2 TH1 =0xfa; TL1 =0xfa; //给定时1装初值,设定波特率为9600bps PCON=0x00; //波特率不进行加倍 SM0 =0; SM1 =1; //串口工作方式1 REN =1; //允许接收数据 ES =1; //打开串口中断4 TR1 =1; //启动定时器1 EA =1; //打开总中断 } //向串口发送一个字符 void send_back(unsigned char ch) //数据返回子程序 { SBUF=ch; while(!TI); //串口数据发送完毕 TI=0; //将发送标志位清零 } //串口接收中断函数 void UART() interrupt 4 { if(RI==1) //接收到数据时该位启动置为1 { RI=0; //½将接收标志位清零 if(Rx_Num4) { Rx_Buf = SBUF; Rx_Num ++; if (Rx_Num=4) { Rx_Num = 0; Rx_flag =1; } } } else { TI = 0; } } 调用方法 temp=cnt; countHH=(temp-temp%256)/256; countLL=temp%256; send_back(countHH); send_back(countLL);
个人分类: 单片机|1683 次阅读|0 个评论
单片机----【PID调节(身边人的一个调试方法)】
Kupeprntlkn 2010-8-28 23:10
PID 参数调试 对用直流电机的转速控制,最关键的是 PID 参数的选择,因为直流电机的数学模型不知,所以不可能用基于对象阶跃响应的齐格勒尼柯尔斯调整法则和基于临界增益和临界周期的齐格勒尼柯尔斯调整法则。 在实际的 PID 参数确定中,很多时候是通过尝试的方法确定的,但即使是用尝试的方法,还是要有一定的依据来确定。 自己在 PID 参数确定时,首先,根据自己转速的控制范围 1000r/m 5000r/m, 用示波器测得 1000 r/m , 5000r/m 和中间几个转速时对应的 PWM 占空比( 1000 r/m 30% , 5000r/m 98% ),即可求得 KP ( 0.98-0.30 ) /(5000-1000)=0.00017 ;接着,不断地调试 Kp ,当 Kp=0.00021 时,测得的转速在设置的转速上下震荡且比较小;然后,确定了 Kp 后调试 Ki ,一般可取 Ki=Kp/10, 不断调试 Ki 后取 Ki=0.000024 消除静差;最后, Kd 的调试中,发现 Kd 对转速的影响很小,所以取 Kd=0 。
个人分类: 单片机|2597 次阅读|0 个评论
单片机----【直流电机旋转角度控制(1)】
Kupeprntlkn 2010-8-26 21:59
一个小的实验基本算是做完了,下面分几次共享下我的成果,实验中的一些问题和总结。 电机其实也可以称为马达,虽然结构和驱动方式多达几十种,但是它的控制原理是大同小异的,只要掌握了简单的控制,复杂一点的就好说了。 直流电动机的工作原理如下图所示 直流电机虽然控制简单,但是它的应用还是比较广泛的,例如磁盘驱动器、人造卫星等,都必须达到速度和定位的目标,因为电机的控制无非就是两个目的:速度控制和位置控制。 我实验选用的电机额定电压为12V,电流为0.5A,型号:LS37RE,30r/min。 对于驱动电路, 在这次试验中驱动电路用了两种方案,一用分立元件搭建H桥驱动电路;二用驱动芯片L298作为驱动电路 下面给出它的驱动电路: 电路设计比较简单,主要是程序实现这块不是很好弄,后面会慢慢分析下的。
个人分类: 单片机|3001 次阅读|0 个评论
QQ群让科研不再寂寞、不再无助、不再无聊!
chrujun 2010-7-27 00:08
通过搜索,找到了多个与仪器开发有关的QQ群,部分群已经到达500人,无法加入。 这些QQ群的交流非常红火,短时间内就有数百条发言。见图片的右下角。 QQ群中有大量共享资料,也有多个高手排忧解难! 加入与科研有关的QQ群,科研不再寂寞、不再无助、不再无聊,科研充满了人情、友爱、奉献和幸福!
个人分类: 地球物理及仪器|5530 次阅读|5 个评论
[转载]家庭健康中的单片机技术--2010年5月17日在嵌入式系统联谊会“嵌入式系统的发展趋势”主题讨论会上的主题演讲
热度 1 人为峰 2010-6-15 21:54
(转自 http://www.eeworld.com.cn/qrs/2010/0517/article_2671_1.html ,做了个别文字修改,相应的PPT文件在 http://www.eetrend.com/technology/100024837 ) 特别高兴今天有机会跟大家介绍一下过去一两年在科研上的一些经验体会。相比前面的老师们的介绍,我这个报告就是小儿科,因为我本身(不是谦虚的话)就只是一个单片机的爱好者,只不过是用的单片机用的比较多而已。   家庭健康显然是个大趋势,我们现在的生活理念整个都在改变,健康是第一个,绿色,人希望我们生活的质量是高品质的,并不是活着就行,而是有质量有素质。那么医疗的理念也在发生变化,当然医疗现在成为三座大山之一,大家都感受很沉重,实际上不管是WTO(还是其他的相关部门)一直都在推崇预防医学,中国的传统观念其实最高境界、实际上也是中医的最高观念是治未病,就是没有病的时候,称为未病,就要去除致病源和将疾病消灭在萌芽之前。东方的哲学思想也是天人合一的思想,实际上在前面几位老师的介绍中都或多或少都有这方面的理念,什么物联网之类的,都是要尽早发现疾病。我只不过在我的小小的侧面来介绍我的一些体会。因时间关系我也只介绍一些简单的东西,而且是从历史上挖出来一点点东西,我乐此不疲的去钻,去想,去弄,所以可能有一些不合适的地方,大家也就一笑了之。   作为健康这个理念是无处不在,无时不在,还要无微不至,甚至让你在感受到健康的关爱的时候你还没有知觉,你并不知道你在受到这种关爱。甚至在受到某种提升健康的东西。介绍的第一个东西是就是神奇的过采样技术,过采样其实在几十年前很早就有这个技术了,过采样并不是什么新的东西,从前年开始我把它捡起来,因为我发现还是可以把它发扬光大的,那么我们在家庭健康中的一个监护,主要是说要对人微弱的生理、生化信号进行检测,监护还希望使得这种微处理器不要用的太庞大的,或者说像住院那样,你非要躺着床上才能得到监护,希望这种监护能随时随地移动,那么在监护中最重要的是对微弱的人体信号的检测,这种信号是很微弱,那肯定要用到微处理器,所处理的信号都是模拟信号,那么肯定需要模数转换来进行转换,模数转换要保正它的分辨率肯定要用到放大器,这就是我们一般设计一个监护系统(的步骤),用到放大器在生物电子中进行检测,放大器要求比较精密,比较昂贵、复杂也比较困难,而且动态范围也受到一些限制,加入放大器本身就有噪声,抗干扰性能自然就差了,又耗电又占用体积,那我们能不能拿放大器来开刀呢?我今天实际上就是拿放大器来开刀,我们为什么要放大器?显然我这个问题就有点太小儿科了,让大家见笑了,但是我们都是要这么做的,那我们怎么样不要放大器就能完成这些事情呢?   那我们就提出第一个问题:高分辨率的AD模数转换器来实现不要放大器的信号检测,道理说起来很简单,就像我们经常碰到的心电,心电通常在1 mV,我们通常用的ADC比如说是2.5V输入,为了简单一点,我们假定是1V输入范围,用12位的ADC去转换,通常几乎现在所有的生物采集里面都要加上放大器,把1 mV的信号放大1000倍到1V左右,然后保证模数转换有足够高的分辨率,如果是一个10位的AD的话,那也就是说对于1 mV的心电来说,我们可以分辨它到1V,如果 我们换成20位的AD,那我们就不用放大了也能分辨1V,就是这么简单,那么我把它简单归结为,我们利用模数转换器的分辨率去换取放大器的放大倍数,或者增益,如果没有放大器了,那么我想这个体积就好做小了,也就实现了我们用数字信号处理去替代模拟信号处理的这种信号检测预处理的最高的理想。通常来说20位精度模数转换器的价格会比较昂贵,我们现在常用的比如说12位的AD,很多单片机中都已经嵌进去了,TI的,ADI的,新华龙(silicon labs)等等这些单片机都有12位的ADC,这上面的ADC通常都能做到几百千赫(兹)的采集率,但我们、特别是在家庭用的这些信号采集里,很多像心电也就是几十赫兹的信号用200或者400HZ的采样率,我们通过过采样每提高4倍的采样率,可以得到1位的精度。在我们常用的单片机中,我可以不客气的说(请大家谅解),几乎绝大多数的人在处理这些低频信号的时侯满足奈奎斯特采样定率就行了,比如说过5-10倍(采样率)在工程上就行了,那对于一个400k的采样速度也依然只用它400HZ,其他不用,但在我们现在这种情况下用过采样技术其实是最简单的方法,那我们就可以用400k的采样抽样到400HZ,这就扩了1000倍,1000倍1024就是得到了5位的AD的精度,如果是说只对压力温度进行采样的话,你就会扩几百K的倍数,一个10位或者15位的ADC可以到达20位甚至更高,那这些就意味着什么,在这些信号采集里面放大器就是多余的,不要了。不要了带来的好处是什么,前面所列举的那些成本、动态范围、耗电、体积统统没有了。那好,过采样这么好,不花成本,下抽样也很简单,如果过采样扩1000倍的话,实际上就是把1000个数都加起来这是最简单的下抽样,又是很好的低通。那么现在问题就是这个过采样,在过采样中有个很特殊的问题,就是平时我们认为最难去掉的白噪声,因为白噪声是任何电子器件都存在的,只要有电阻就存在,这是最挠头的。那么在过采样里面它是个宝贝,没有它是实现不了的,没有它还要额外去加,加上一个人为的所谓随机扰动,有些文章也研究到这一点去加,但在ADC里头实际上是加不上的,因为我们通常所用的AD前面都有采样保持器、抗混叠滤波,那我怎么让白噪声直接到模式转换上面呢?还有一个问题就是:对于过采样来说如果我碰到的是一个很干净很稳定的直流信号,没有噪声的,假定我这个噪声只在0.4个LSB这个地方,那这个信号你采10000次加起来还是0,怎么采都不行,对不对,这过采样失效了,的确是失效了,我们加了一个成型信号,成型信号也很简单,比如说一个三角形就是一个成型信号。我们这么来想,如果被采集的信号在0.4个LSB的时候我加了一个LSB这个高度的信号叠加上去,然后采10次就有4次为1,是不是?6次为0,加起来就是4除以10,0.4!我得到了被测量的信号,那这个成型信号如果严格要求在1个LSB的高度那当然很难,精度这些都很难保证,实际上没有那么严格要求。我们的理论研究表明(你)加的信号越大越好,只要加上这个成型信号,加上你的被采样信号,加上其他干扰不超出你的ADC输入范围,(加的)越大越好,大有什么好处呢?大可以消除一些AD的非线性的微分误差,(为什么?)你采样点多了,在你的AD的每一个量化电平上都分布了它的每一个量化的差分误差都平均掉了。那么我们通过这些就可以产生一个用在心电检测上的放大器,如果相比其他的心电放大器来说,这就是很简单的,实际上这里面有些东西还是很多余的。那么就这么一个放大器我还可以实现心电和呼吸的同时采样,当然还可以检测导线脱落,这实际上就是利用了单片机的过采样技术。比如说用AD的841,或者C8051F这个系列的,只要有个十几位的AD,基本上这些常规的生物电,比如说肌电、脑电、心电都可以采集。再比如说脑电我要做个256个通道,如果按常规的做那这个仪器就大的不得了,如果这么做那就很简单,特别是对于监护,我们可以做一个很简单的所谓穿戴式的监护,甚至这些都可以集成到单片机内部,有些单片机像中颖(音译)一种单片机,做血压计的它里面就集成了3个运放还是4个运放(运算发大器),所以完成这些,那么可能对IC厂商来说,如果做一些不管是工业控制还是家庭健康的,把这些简单的几个小运放集成到里面,我们就可以做成很微小的采集系统,那么这些采集对于一个个人的健康信息的监护来说有很多很多的好处。这方面呢,我们可能用的是单片机,但可能很多考虑要在外面,不是说仅仅考虑单片机,这样反倒是对单片机的应用是一种促进,单片机最体现的(功能)一个是单片一个是计算,单片就是体积小都在一个上面,去实现一个所有的信息采集、初步处理都在里面,那么计算过采样这些需要计算,单片机计算能力越高得到的效益越高,这里面有一个用机时去换取性能的过程,至少下抽样要完成加法,扩多少倍你要完成多少次加法。但如果下抽样的滤波器设计的更好一点,提高的精度会更多一些。那么过采样技术为数字信号处理真正替代模拟信号处理,也就是替代放大、滤波这些硬件创造了一个很好的条件。在这方面写了点文章,这两年在过采样方面差不多也都是我们课题组的文章,用这个技术申请了一些专利。 第二个就是介绍怎么不抽血分析血样成本,今天把这个仪器带来了。我们目前实现的血液的主要成分的无创检测,而且精度超出了我们家用的有创的血糖仪之类的。血液成分无创检测到目前为止只有国外的一个公司实现了血红蛋白的检测,我们现在目前来说比较有把握的来说十来种血液成分都能检测出来,血糖、血脂、血红蛋白、中性密脂细胞、胆固醇这些东西。那么这跟单片机是什么关系呢?我们用的是一种光谱的方法通过光谱来测量血液成分。光谱在化学成分分析上是很常用的一个技术。它应用的基础就是郎珀-比尔定律。郎珀-比尔定律也就是说当一种物质你供给它一束光,得到一个输出光,输入与输出的比值或者衰减就与被检测的物质的含量有关系,它本身在波段这个频率的吸收系数成正比,是一个物质吸收的基本的定义。对于我们血液里面,第一步就是说怎么得到血液的光谱,不是说得到皮肤的光谱,得到肌肉的光谱,(皮肤上的护肤霜的)光谱不能影响测量,怎么办?我们就提出了动态光谱。动态光谱在精度上采样率上和数据量上都有要求,那我们怎么做呢?我们是这么做的,如果我打一个单色光,透过手指我可以测到脉搏波,医院做的心率的检测就是这个道理。那么脉搏波的最大值就是光强的最大值和最小值有什么物理含义呢?实际上动脉毛细血管收缩到最薄的时候血液最少的时候,这时候射出来的是光强的最大值。当脉搏波最强是时候也就是血液最后的时候这时候得到的是光电脉搏波的最小值。最大值和最小值中间的能量差值被谁吸收掉了呢?被我们所关心的动脉血液增加厚度这一部分所吸收掉了。如果我把每一个波长的这个血液所吸收的值都测出来,那么它所组成的光谱只跟我们所测的血样有关,跟皮肤的厚度颜色,脂肪的厚度都没有关系。这就是我要得到的血液的光谱,得到血液的光谱当然下一步就是分析。但是要得到最大值,我们先简单看看这个精度要求多少,假定血液中有100种成分(实际上远不止这么多),假定这些成分含量都是相当,假定我对每一种成分测量值精度要到1%的分辨(率),那么我这个光的测量最差也要到万分之一的精度,这是对精度的要求。另外一方面,如果我要来测1000个波长的光电脉搏波,我每次都要测到最大值、最小值,假定我只需要在每个脉搏波上面采样1000次,脉搏波的速度大概是每秒一次的样子,这样我的采样速度最低要每秒一兆(Hz),这还不考虑即使脉搏波是个正弦波,采样1000次它的相位误差带来的幅值误差是多少。要保证这个幅值误差小于万分之一,精确计算肯定会提出更高的要求。而且这时候,任何一个干扰在最高值最低值的采样上面都有可能出现,出现了的干扰或误差就100%带进去了,所以对数据采集的单片机的要求就提高了。我们怎么去保证这个呢,第一步从原理上我可以不抽血得到血液的光谱,这在测量方法上是一个突破,同时它从原理上对我们数据采集和分析系统提出了要求,刚才说了精度和速度,那么更进一步的说,刚才如果是采用速度这么高还不能保证精度,那我们第二种方法是什么?现在我们回过头来看这个原理,从前面采样来说是同一组血液成分所构成的同一个厚度用不同的波长快速的测量得到的光电脉搏波的峰峰值所组成的光谱我们把它叫做动态光谱,那么每个波长的光电脉搏波它都是相似型,在傅立叶变换里面任何一个函数如果它乘以10或者除以10也就是增加多少倍,它相应的分量也增加或者减少多少倍,所以我们就可以通过傅立叶变换的方式可以大幅度的提高数据采集的精度、提高性噪比,还可以降低对采样速度的要求,所以我们从每秒几兆以上的采样速度最后降到只需要每秒二十几赫兹的速度,但是这对计算要提出更高的要求,要完成傅立叶变换,目前我们对血红蛋白,血糖,中性粒子细胞,这几个最早测出来的成分都是做到2%到5%的平均误差,我们平时用的血糖仪误差大概在20%到30%。 第三个说的是中医舌诊,简单的说,做中医舌诊当然以我们中国人为主,喜欢做这种课题。比如说舌体庞大、或者舌形状或者纹理分析等等做了很多,但现在有哪一个真正能在临床上用呢?!没有。第二喜欢做舌色,特别是数码相机摄像头发展起来之后,好像用数码照起来很准,颜色是什么色就是什么色甚至可以有国家标准来做。但是我说,很遗憾这个是错误的。从舌色上来说犯的错误是什么呢?我们古人看到鸟在空中飞翔,用翅膀摇,人能够等效翅膀的是什么?当然就是手了,然后贴上些树叶或者羽毛之类的从上面往下跳,结果都摔死了,现在我们飞起来了,也有翅膀但翅膀是不摇的。可是我们一问中医,中医就说那个患者他的舌色是焦黄色或者淡红色或者什么东西,实际上对于一种颜色来说如果你用三原色来分解或者反过来讲如果你用这三种原色来调和出这种颜色,你是唯一的是确定的,但是如果我用1000个波长的颜色来调,它是什么分布呢?怎么个比例关系呢?无穷无尽。正因为这种无穷无尽才代表了各种各样的千变万化,各种病情的对身体对机理的影响。我们仅仅停留在中医他说的这种颜色上面,实际上我们把很多很多东西全给丢掉了,所以我们现在用光谱来做这个东西。这就是中医的系统辩证,我们必须牢牢记住这一点,我不是用西医、或者我们现在的一些观念叫做形而上学,片面的孤立的静止的去看待问题,去对待信息,这就是错误的,现在拿光谱去照,实际上是采了五个部位,现在对舌尖这一个部位,我们到医院去,不是什么患者都找得到,比如我们去肝炎科找到肝炎患者,到心脏科找到冠心病(患者),高血粘症的,当然还有健康。我们进去一做,得到的结果很让人惊讶,我们得到的结果是,最差的精度我们也在百分之八十八点几,还有的做到100%的,也就是说我建的模型判断患者,说他是他就是说,不是就不是。当然,我不是说我这个方法马上就能怎么样啦,但是就这么些样本里面,比如说少则二十几个多则一百多个患者拿其中一部分来建模预测另外一部分,我能做到这么高的精度,远远超过所有的其他方法所做的,那就很神奇了,因为时间关系我不向下展开讲了。我现在要说的是我这个光谱,我要做光谱成像,这就设计到一个概念,我不能把图像的信息和谱的信息分开,数据采集就牵扯到一个图像1024*1024这就是1兆,再加上每一个像素点就是一个光谱,假定1000个波长这就是1G,如果这光谱精度再高点那就是2G了。就在这么大的数据只是一个样本,要去采集处理建模等等,这就是对我们的单片机嵌入式系统的要求,那么理想状态是什么呢,后面跟光谱有关前面跟电有关,我做过一个鼠标,你摸着鼠标就已经在测量你的光电脉搏了,你摸着键盘就已经在测你的心电了,这是我们一个长江学者提出来的理念叫做激励工程,实际上就是说你坐在椅子上就已经在测你的受力情况,需要给你怎么调整或者给你加点红外,或者怎么按摩,怎么防止鼠标手之类,如果说我早上起来到计算机前面站一站可能摄像头就已经把我照进去了,(会提醒)该提高什么、该注意什么了。   一个很重要的问题是说:最糟糕是有病了才去医院去看,稍好一点说平时注意锻炼,更加好的是在没有任何迹象之前这种发展趋势没有到达临界值之前,已经在提示你或者无形地在给你治疗了,这就是理想,这就是未来单片机所能用到的,可能也是物联网之类的,可能很多很多。限于时间关系,我胡说八道了一番,谢谢大家!
个人分类: 生活点滴|3444 次阅读|2 个评论
[转载]单片机抗干扰技术及应用
hlyxue 2010-5-28 10:58
1 引 言 在单片机的应用系统中,系统的抗干扰技术是系统可靠性的重要方面。一个系统的正确与否,不仅取决于系统的设计思想和方法,同时还取决于系统的抗干扰措施,不然势必会出现原理正确而系统稳定性差,甚至不能实施,使得耗费了大量钱财和时间研制出来的控制系统成为一种摆设,电脑变成了烦恼。正因如此,抗干扰技术的研究越来越引起大家的高度重视。 2 单片机系统软件的抗干扰 一般来讲,窜入微机测控系统的干扰,其频谱往往很宽,采用硬件抗干扰措施,只能抑制某个频率段的干扰,仍有一些干扰会进入系统。因此,除了采取硬件抗干扰方法外,还要采取软件抗干扰措施。 2.1 模拟输入信号抗干扰 叠加在系统模拟输入信号上的噪声干扰,会导致较大的测量误差。但由于这些噪声的随机性,可以通过数字滤波技术剔除虚假信号,求去真值。常用方法如下: 算术平均滤波法 算术平均滤波法就是连续取N个值进行采样,然后求其平均值。该方法适用于对一般具有随机性干扰的信号进行滤波。这种滤波法的特点是:N值较大时,信号的平滑度好,但灵敏度低;当N值较小时,平滑度低,但灵敏度高。 递推平均滤波法 该方法是把N个测量数据看成一个队列,队列的长度为N,每进行一次新的测量,就把测量结果放入队尾,而扔掉原来队首的一次数据。计算N个数据的平均值。对周期性的干扰,此方法有良好的抑制作用,平滑度高,灵敏度低。但对偶发脉冲的干扰抑制作用差。 防脉冲干扰平均值滤波法 在脉冲干扰比较严重的场合,如果采用一般的平均滤波法,则干扰将会平均到结果中去,故平均值法不易消除由于脉冲干扰而引起的误差。为此,在N个采样数据中,取掉最大值和最小值,然后计算N-2个数据的算术平均值。为了加快测量速度,N一般取值为4。 2.2 死机现象的克服 当干扰通过总线或其他口线作用到CPU时,就会造成程序计数器PC值的改变,引起程序混乱,使系统失控。因此,在设计单片机系统时,如何发现CPU受到干扰,并尽可能无扰地使系统恢复到正常工作状态是软件设计应考虑的主要问题。 无论何种控制系统,一般讲,死机现象都是不允许的。克服死机现象最有效的办法就是采用单片机工加了硬件看门狗电路后仍然有死机现象,分析原因,可能有以下方面: 因为某种原因,程序混乱后,看门狗电路虽然发出了复位脉冲,但在程序刚刚正常还来不及发出一个脉冲信号,此时程序再次被干扰,而这时看门狗电路已处于稳态,不能再发出复位脉冲。 程序进入死循环,在该死循环中,恰好又有看门狗监视I/O口上操作的指令。而该I/O口仍有脉冲信号输出,看门狗检测不到这种异常情况。 在有严重干扰时,中断方式控制字有时会受到破坏,导致中断关闭。 可见,只用硬件看门狗电路是无法确保单片机正常工作的。因此,可采用以下方法作为补充。 软件看门狗的应用 选用定时器T0作为看门狗,将T0的中断定义为最高级中断。看门狗启动后,系统必须及时刷新T0的时间常数。 指令冗余技术 ①NOP的使用 在8031单片机指令系统中所有指令都不超过3个字节。因此,在程序中连续插入3条NOP指令,有助于降低程序计数器发生错误的概率。 ②重要指令冗余 对于程序流向起决定作用的指令(如RET,RETI,ACALL,LJMP,JZ等)和某些对系统工作状态有重要作用的指令(如SETBEA等)的后面,可重复写下这些指令,以确保这些指令的正确执行。 软件陷阱法 单片机系统程序跑飞意味着CPU执行不正确流程程序。而当乱飞程序进入非程序区,采用冗余技术无法使程序纳入正确轨道,此时可采用软件陷阱法,拦截乱飞程序。软件陷阱就是用引导指令(如LJMP)将扑获到的乱飞程序引向复位入口地址0000H,在此对程序进行出错处理,使其纳入正轨 ①软件陷阱格式   NOP   NOP   LJMP0000H ②软件陷阱安排未使用的中断区;   未使用的大片ROM空间;   程序区;   中断服务程序区。 2.3 系统复位特征 单片机应用系统采用看门狗电路后,在一定程度上解决了系统死机现象,但是每次发生复位都使系统执行初始化,这在干扰较强的情况下仍不能正常工作。同时系统虽然没有死机,但工作状态频繁改变,这同样是不能容忍的。 理想的复位特征应该是:系统可以鉴别是首次上电复位(又称冷起动),还是异常复位(又称热启动)。首次上电复位则进行全部初始化,异常复位则不需要进行全部初始化,测控程序不必从头开始执行,而应故障部位开始。 上电标志的设定方法: ①SP建立上电标志。 ②PSW.5建立上电标志。 ③内RAM建立上电标志。 软件复位与中断激活标志 当系统执行中断服务程序时,来不及执行RETI指令而受干扰跳出该程序后,程序乱飞过程中由软件陷阱或软件看门狗将程序引向0000H,显然这时中断激活标志并未清除,这样就会使系统热启动时,不管中断标志是否置位,都不会响应同级中断的请求。因此,由软件陷阱或看门狗捕获的程序一定要完成清除 MSC-51系列中中断激活标志,才能消除系统热启动后不响应中断的隐患。 程序失控后恢复运行的方法 一般来说,主程序是由若干个功能模块组成,每个功能模块入口设置一个标志,系统故障复位后,可根据这些标志选择进入相应的功能模块。这一点对一些自动化生产线的控制系统尤为重要。 总之,微机测控系统由于受到严重干扰而发生程序乱飞、陷入死循环以及中断关闭等故障。系统通过冗余技术、软件陷阱技术和看门狗技术等,使程序重新进入0000H单元,纳入正轨。因故障而进入0000H后,系统要执行上电标志判定、RAM数据检查与恢复、清除中断激活标志等一系列操作,决定入口地址。 2.4 睡眠抗干扰 在实际应用中,强干扰的来源往往是系统本身,例如被控负载的中断状态变化等。而这种干扰是可预知的,在软件设计时可采取适当措施避开。当系统接通或断开大功率负载时,暂停一切数据采集等工作。待干扰过后,再恢复进行。这比单纯在硬件上采取抗干扰措施要好的多。8031单片机中有一个电源控制寄存器 PCON。当PCON.0=1时,8031单片机进入等待工33作状态。这时单片机时钟被封锁,所有I/O口引脚均保持进入等待工作方式前的状态,内部时钟仍然继续供给中断系统定时/计数器和串行口、8031单片机现场(栈指针、程序计数器PC、状态字PSW、累加器ACC、内部RAM)和其他特殊功能寄存器内容保持不变。中断退出和硬件复位均可使8031单片机退出睡眠状态。 3 单片机系统中硬件抗干扰设计 一个好的电路设计,应在设计过程中充分考虑抗干扰性的要求。分析系统中可能引起干扰的部件,采取必要的硬件抗干扰措施,抑制干扰源、切断干扰传播途径。 3.1 抑制干扰源常用措施 给继电器线圈增加续流二极管,消除断电时产生的反电动势。 在继电器接点两端并接火花抑制电路,(一般为RC串联电路,电阻一般为几~几十k,电容为0.01F)减小电火花影响。 给电机加滤波电路,注意电容、电感连线要尽量靠近电机。 电路板上每个IC要并接一个0.01~0.1F高频电容,减小IC对电源的影响。注意高频电容的布线应靠近电源端,并尽量短,否则等于增大了电容的等效串联电阻,会影响滤波效果。 避免90折线,减小高频噪声发射。 在可控硅两端并接RC抑制电路,减小可控硅噪声。 3.2 切断干扰传播途径措施 充分考虑电源对单片机的影响。给单片机电源加滤波电路,减小电源噪声对单片机的干扰。 若用单片机的I/O口来控制电机等噪声器件,在I/O口与噪声源之间应加Ⅱ形滤波电路,或进行光电隔离。 注意晶振布线。晶振与单片机引脚尽量靠近,用地线把时钟区隔离起来,晶振外壳接地并固定。 电路板合理分区,如数字信号、模拟信号尽可能使干扰源与敏感器件远离。 用地线将数字区与模拟区隔离,数字地与模拟地分离,最后接在一点接于电源地。 单片机和大功率器件的地线要单独接地,以减小相互之间的干扰。 在单片机I/O口、电源线、电路板连线等关键地方使用抗干扰元件,如磁环、电源滤波器、屏蔽罩等。 3.3 提高敏感器件的抗干扰性能 提高敏感器件的抗干扰性能是指从敏感器件考虑尽量减小对干扰噪声的拾取,以及从不正常状态尽快恢复的方法。常用措施: 布线时尽量减少回路面积,降低感应噪声;   布线时电源线与地线尽量粗。除减小压降外,更重要的是降低耦合噪声; 对单片机的闲置I/O,不能悬空,应接地或电源,其他IC的闲置口一样; 满足要求的前提下,尽量降低单片机晶振和选用低速数字电路; IC器件尽量直接焊在电路板上,少用IC座。
个人分类: 科研笔记|2494 次阅读|0 个评论
一条过了12年也不落后的仪器设计建议—关于在伪随机多频激电仪中使用DSP的初步建议
chrujun 2010-4-23 23:52
近日整理老旧文档,发现了我12年前提出的伪随机多频激电仪设计建议。当时我研究生刚毕业,根据当时研制仪器的问题提出了一个仪器设计建议。令我非常吃惊的是,这个建议过了12年也没有过时。一个据某领导讲花费将近千万人民币的仪器开发项目,采用的正是我当年提出的仪器设计建议。 下面是没有改动一个字,我当年向有关牛人建议的仪器设计思路。欢迎各路高手批评斧正。 关于在伪随机多频激电仪中使用 DSP 的初步建议 陈儒军 仪器概述 伪随机多频激电仪的发送机与接收机之间通过光电同步。接收机采集完数据后,通过 RS-232 传到通用计算机处理。每个周期的伪随机多频信号采集 1024 点,采集周期数为 1 到 16 个。 仪器存在的问题 仪器存在的问题主要是工作效率低。数据采集本身就需要花费一定的时间,通过 RS-232 也需要大量的时间。伪随机多频信号的优点没有发挥出来,如能够在数据采集的同时进行数据处理,或能够在数据采集完成后快速处理,就能够充分发挥仪器的优点。 伪随机多频激电的数据处理 多频激电的数据处理分为四步: 1 、数据预处理,将观测数据解码,进行滤波的等处理。滤波将要花费大量的时间,主要有低通滤波,高通滤波,带通滤波,带阻滤波等。 2 、频谱分析,将采集的数字信号从时间域变换到频率域。 3 、标定,消除仪器对观测信号的变换。 4 、激电参数计算,根据伪随机多频信号的频率,信号采样频率,及伪随机多频信号的特点,将伪随机多频信号中的各个主频率提取出来,再计算相位、频散率、视电阻率等参数。 伪随机多频激电仪中采用 DSP 所需解决的问题 由于 DSP 在基于单片机的伪随机多频激电中仅是一种设想,许多问题要到具体实践中才能发现,而且有的问题看起来简单,做起来确难,本人提出的观点不一定正确,更说不上全面了。在这里仅根据我微薄的知识提出几点看法: 1、 为了方便,可把要解决的问题分解为单片机子系统和 DSP 子系统及其它们之间的相互作用问题; 2、 DSP 子系统要解决的问题有各种滤波器的设计及实现、 FFT 、及其它与激电有关的数据处理; 3、 单片机子系统与 DSP 子系统之间既有数据传输,又有命令传输。数据传输用于传输采集或处理好的数据,命令传输是单片机向 DSP 子系统发出命令,要求 DSP 子系统做滤波、 FFT 等处理。设计 DSP 子系统要考虑这一点,如果原先的单片机子系统已经没有端口用于数据或命令传输,单片机子系统也需要作出改变; 4、 对于具体数据处理方法,上述问题解决后可进一步研究。
个人分类: 地球物理及仪器|4156 次阅读|4 个评论
智能电源板调试与编程日记(1)
chrujun 2009-6-27 23:40
2009-06-24 星期三 晴:上午对昨天购买的芯片一一检查和整理。下午4:00左右电源板PCB板到货了。对电源板PCB板进行检查和焊接。由于电源板的铺铜厚了1倍,电源信号的走线宽度为1~2mm,焊接时散热很快。一些大器件很难焊好。仇洁婷建议换50W的烙铁。更换烙铁后焊接工作才有了起色。在仇洁婷的帮助下,一直焊接到晚上10:45,才焊好一块电源板的主供电系统部分。对电源板进行供电测试,发现-3.3V模拟电压无法产生,电压为-4.3V,无法用电位器控制。晚上回公寓后又对负电源产生电路进行研究,没有发现有什么问题。
个人分类: 地球物理及仪器|3381 次阅读|0 个评论

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-6-1 19:49

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部