本帖最后由 kk5290122 于 2013-3-1 09:03 编辑
不知不觉寒假已经结束了,由于种种原因我在论坛里销声匿迹了将近一个月,在此也跟各位说声抱歉。2013新的一年,新的开始,首先恭祝各位坛友:蛇年大吉,万事如意。新年后的第一次我想与大家分享的是我上学期所做过的一个小项目--------温度控制器,刚好也算是对上学期的一个总结,其实说是项目其实也不算什么项目,主要是导师拿来让我们做课题训练的练习,为了让我们能够有所收获,导师可谓是煞费苦心,从最初单片机的各个外围接口模块的硬件制作与编程练习,到不同模块间的组合编程练习,再到产品系统级的设计,各个阶段老师对我们都会有相应的要求。
硬件制作方面要求我们能够完成相应电路原理图的设计和PCB板的制作,软件编程方面要求我们能够领会良好的程序架构设计和模块化编程的思想,到了产品设计阶段老师则要求我们从一个真正产品的角度来完成我们的练习。每一个阶段老师都有他独到的用意,只可惜到最后我们都没能完全达到老师最初的要求,其实这也在老师的预期之内,老师更看重的是我们在整个过程中学到了什么。尽管没能完全按照老师最初的要求完成所有训练,在整个训练过程中收获还是挺多的,下面就分阶段跟大家分享一下我在各个训练阶段的收获和心得。 一.硬件阶段 由于我们同一届的训练都是同时开始的,所以最初我们有好几个人一起训练,最开始我们是分模块训练的,我抽到的是AD转换器ADC0809,虽然以前多少也了解过这个芯片,但一想到要按照我们学校的制板要求来制作PCB板,心中不免有些许紧张,由于我们学校的制板设备比较落后,所以制板要求也就多了许多,比如说制作双层板时上下两层是不导通的,再加上其他的一些制板限定,这就给制板带来了一定麻烦。第1次所设计的PCB板尺寸过小需要重做,第2次没有按照ADC0809的标准电路图设计又需要重做,直到第3次制板才算达到学校的制板要求,这也是我入学以来制作的第一个PCB电路板,从画电路原理图和PCB图到电路板的转印、腐蚀、钻孔、打磨、焊接,每一步都是自己亲自动手完成的,这部处女作真可谓是来之不易……下面就给大家秀一下我这部处女作的靓照,从电路原理图到PCB图再到印制电路板:
ADC0809原理图
ADC0809 PCB图
ADC0809 印制电路板正面
ADC0809 印制电路板反面
二.软件阶段 硬件制作好之后自然是要编程序以验证所设计硬件的正确性,由于以前编程序都是使用C语言,这也是大家所通用的语言,自然而然会想着这次也用C语言了,可没想到的是老师却偏偏让我们用汇编语言来编程,当时想这下可麻烦了,提起汇编就头疼,虽然在大学学过汇编,可当时学习就是为了拿学分,根本什么都不懂,更别说用来编程了,这下该咋办呢…… 当时我就硬着头皮去找老师,问老师可不可以用C语言来编程,当时老师就火了,老师说:“用C语言我还让你们编程序呀!本科生都会,我也知道C语言好用,我之所以让你们用汇编来编程就是要让你们从最根本上来掌握各个模块,而且有些地方用C语言是不行的,汇编不会就学,我让你们训练就是要让你们把自己以前欠缺的知识补回来,而且你们这一辈子或许也就这一次学习汇编的机会了,所以你们哪里不会就自己从哪里学起,现在不学以后会吃亏的。” 被老师大骂了一顿之后我自然要回去乖乖的学习汇编了,首先就从最基本的指令开始学起,就这样将近学习了一个月我终于把汇编的基本指令学完了,然后就开始试着自己编写程序,用了一个星期我又终于把我的ADC0809模块调试了出来,当看到我自己一步步制作的硬件能够在我用汇编语言编写的程序下正常工作的时候,我当时是无比的兴奋,这一个多月来的付出总算没有白费,我想这种心情大家应该都会有体会吧……!这也坚定了我后面学习汇编的决心。 在完成了我们各自模块的硬件制作与软件调试之后,就需要我们不同模块之间的相互组合了,我所使用的模块组合主要有:AD模块+PWM模块+时钟模块+键盘显示模块。这里就要求我们领会程序架构的灵活性以及模块化设计的思想,至于老师所要让我们领会的具体内容在此就不过多介绍了,到最后我们都没有一个能够很好的领会,这里就跟大家分享一些我在编写程序过程中的一些使用代码,主要是在处理AD转换器接收到的数据时所使用到的一些比较不错的代码,其中包括:标度变化、滑动平均滤波、数据求和及数据求平均。部分代码如下,有需要完整代码的坛友可以查看工程文件,里面有详细的代码说明。 - <FONT size=5 face=宋体>/*0-2V电压至0-100‘C的标度变换
- 变换公式:TEMP=(ADQ*10+ADB)*5+ADS*5/10*/
- CONV: MOV A,ADQ ;
- MOV B,#10 ;
- MUL AB ;高8位B中,低8位A中
- ADD A,ADB ;ADQ*10+B
- MOV B,#5 ;
- MUL AB ;
- MOV TEMP1,A ;TEMP1=(ADQ*10+ADB)*5
- MOV A,ADS ;
- MOV B,#5 ;
- MUL AB ;
- MOV B,#10 ;
- DIV AB ;商在A中,余数在B中S*5/10
- ADD A,TEMP1 ;
- MOV TEMP2,A ;TEMP2暂存实际采样到的温度值
- ; MOV A,TEMP2 ;
- ; MOV B,#10 ;
- ; DIV AB ;
- ; MOV TEMPS,A ;温度十位
- ; MOV TEMPG,B ;温度个位
- RET ;
- /*滑动平均滤波:数据暂存队列50H-57H,*/
- FILT: SETB RS0 ;
- SETB RS1 ;
- MOV R0,#57H ;
- MOV R1,#56H ;
- MOV R7,#7 ;移位次数
- LOOP: MOV A,@R1 ;把采样得到的数值压入队列
- MOV @R0,A ;56H移入57H
- DEC R0 ;
- DEC R1 ;
- DJNZ R7,LOOP ;
- MOV 50H,TEMP2 ;最新采样值入队列尾
- ;数据求和
- MOV R7,#8 ;求和数据个数
- MOV R2,#0 ;R2累加和暂存单元
- MOV R3,#0 ;
- MOV R0,#50H ;求和数据首地址
- SUM: MOV A,R2 ;队列内数据求和
- ADD A,@R0 ;
- MOV R2,A ;
- MOV A,R3 ;
- ADDC A,#00H ;
- MOV R3,A ;R3是低8位进位数据暂存寄存器
- INC R0 ;地址加1
- DJNZ R7,SUM ;
- ;数据求平均
- MOV R7,#3 ;R2平均值暂存单元
- AVER: CLR C ;累加数据求平均,16字节,右移位时要先移
- MOV A,R3 ;高位,再移低位。
- RRC A ;
- MOV R3,A ;
- MOV A,R2 ;
- RRC A ;
- MOV R2,A ;
- DJNZ R7,AVER ;
- MOV TEMP3,R2 ;平均值转存TEMP3
- MOV A,TEMP3 ;
- MOV B,#10 ;
- DIV AB ;
- MOV TEMPS,A ;温度十位
- MOV TEMPG,B ;温度个位
- CLR RS0 ;
- CLR RS1 ;
- RET ;</FONT>
复制代码 下面就是把各个模块组合到一起的整体电路图,其中最下面的是我们实验室自己制作的所谓的母板,在它上面可以放置最多4个不同的子模块,右上角是我们实验室自己制作的51单片机最小系统板,在它上面插放的是7279键盘显示接口模块,用以实现对温度控制器的键盘控制输入和数据显示,其它三个子板就是我们自己制作的各个模块,把它们组合到一起就可以实现最基本的温度控制器的功能。
模块组合整体图
三.系统产品设计阶段 由于时间及资源的缘故,我们没能按照真正的产品设计把最后的产品设计做出来,不过由于这个项目也是我导师以前专门做过的项目,所以最终设计完成的产品我们这里也有样品,在这里也给大家秀一下靓照。
成品温控仪内部结构
成品温控仪外部界面
总结: 回想上学期半年多以来的训练历程,有付出也有收获,为了训练上学期从暑假一直到放寒假,晚上我几乎都是在实验室度过的,当然有付出必有收获,经过半年多来的刻苦训练我最终学到了很多知识;有痛苦也有喜悦,经常由于某一个程序调试不出来,我拍过桌子也摔过书,然而每当程序调试出来的时候我又激动万分,心里又无比的高兴。此外更重要的一点是编程序要耐得住寂寞,坐得主冷板凳,而且一定要多动手编程,不能只看不写。这次就跟大家分享这么多吧,以后有时间再跟大家继续分享。 此外在这半年多时间里我还有一个更大的收获就是:结识了爱板,结识了xinxin,结识了爱板众多的坛友。宝剑锋从磨砺出,梅花香自苦寒来!接下来的时间我要更加努力去学习,望大家以后多多指点,多多交流,大家相互学习,共同进步! 回帖是美德,还望大家多多拍砖添瓦!
作于2013年02月28日!!
|