单片机应用实训项目报告.docx
《单片机应用实训项目报告.docx》由会员分享,可在线阅读,更多相关《单片机应用实训项目报告.docx(20页珍藏版)》请在冰豆网上搜索。
单片机应用实训项目报告
第一组:
艾胜陈宏超
刘露张松
实训指导老师:
郑老师
日期:
第十三十四周
目录
绪论3
1.1概述3
1.2设计要求及主要功能介绍3
第二章系统总体方案设计4
2.1系统功能模块的划分4
2.2系统原理框图4
2.3系统仿真原理图5
2.4PCB原理图5
2.5PCB板6
2.6系统硬件设计6
2.7系统软件设计7
2.8硬件设计与调试13
2.9成果展示13
小组总结14
3.1小组成员有话说:
14
3.2小组总结15
3.3小组评分15
参考文献16
绪论
1.1概述
单片机以其强大的控制能力已经被广泛应用于诸多领域,配以各种接口传感器可以实现系统的智能化。
无论是在工业控制领域、医疗卫生领域、还是在国防军事领域、航天航空领域,微控制器都起着举足轻重的作用。
从最初的8位控制器到现在的16位、32位控制器都还有很大的发展和应用空间。
本次实训以贴近实际为主,我们组就设计一个带有测温功能的电子万年历,再设计的过程中将所学的知识运用到实际中来,已达到培养我们运用知识解决实际问题的能力。
1.2设计要求及主要功能介绍
(1)显示实时时间。
由实时时钟芯片DS1302提供实时时间的数据。
(2)显示实时温度。
由温度测量芯片DS18B20提供实时温度的数据。
(3)参数修改。
由四个按钮来修改参数:
加减按钮﹑定位按钮﹑确定按钮。
(4)通讯。
通过RX232串口与上位机的通讯,将数据上传给上位机。
第二章系统总体方案设计
2.1系统功能模块的划分
按照设计要求,系统可以分为以下几个基本功能模块:
显示模块
参数修改模块﹑通讯模块等。
有些模块的功能是由硬件完成,有些模块的功能由软、硬件配合完成,有些模块则是由软件、硬件、机械三部分共同完成。
将系统拆分成以上的这些基本功能模块后,再根据各个模块所要完成的功能分别去设计,也就是按照“逐步求精”的思想去设计本系统,这将使设计工作细化,也有助于制定进度安排。
2.2系统原理框图
2.3系统仿真原理图
2.4PCB原理图
2.5PCB板
2.6系统硬件设计
1)该项目的CPU使用AVR系列中的ATMEG16。
该芯片能存储16K的指令程序且程序不丢。
(并且我们有现成的针对AVR系列单片机的仿真软件和程序编写环境)
2)实时时间模块用美国DALLAS公司推出实时时间芯片DS1302,
实时时钟电路DS1302是DALLAS公司的一种具有涓细电流充电能力的电路,主要特点是采用串行数据传输,可为掉电保护电源提供可编程的充电功能,并且可以关闭充电功能。
DS1302可以对年、月、日、周日、时、分、秒进行计时,且具有闰年补偿等多种功能。
3)实时温度模块用智能温度芯片DS18B20。
单线数字温度传感器DS18B20就是一个1-wire器件,该器件可把温度直接转换成串行数字信号供微机处理。
由于每片DS18B20含有唯一的硅串行数,所以在一条总线上可挂接任意多个DS18B20芯片。
从DS18B20读出的信息或写入DS18B20的信息,仅需要一根端口线,该端口线同时也可以向DS18B20供电,从而无需额外电源。
DS18B20提供9~12位温度读数,构成多点温度检测系统而无需任何外围硬件。
4)参数修改模块采。
在该模块中采用四个功能各不相同的按键(加减参数按钮﹑定位修改按钮﹑确定修改按钮)。
2.7系统软件设计
该项目相对来说简单,软件也不复杂,我将软件分为如下模块:
1)显示模块:
voidCanShuXianShi(intcanshu,chardian)
{
chari;
lcd[0]=32;//编号的十位转变为ASCII码
lcd[1]=32;//编号的个位转变为ASCII码
lcd[2]=32;//空格
canshu=canshu*6.25;
if(canshu>=0)lcd[3]=32;//符号处理
else{
canshu=-canshu;
lcd[3]=0x2d;//负号
}
lcd[4]=(uchar)(canshu/10000)+0x30;//参数的万位转变为ASCII码
lcd[5]=(uchar)(canshu/1000%10)+0x30;//参数的千位转变为ASCII码
lcd[6]=(uchar)(canshu/100%10)+0x30;//参数的百位转变为ASCII码
lcd[7]=(uchar)(canshu/10%10)+0x30;//参数的十位转变为ASCII码
lcd[8]=(uchar)(canshu%10)+0x30;//参数的个位转变为ASCII码
//插入小数点
for(i=9;i>9-dian;i--)
lcd[i]=lcd[i-1];
lcd[9-dian]=0x2e;
for(i=4;i<8-dian;i++)//消除参数前面的0
if(lcd[i]==48)lcd[i]=32;
elsebreak;
}
该函数将温度的值进行剥离,然后再将剥离的每位数填充在数组lcd[9]中,然后在主函数中一位一位的送显示。
2)参数修改模块
if(PINB.0==0&&x==1)
{N++;
delay_ms(10);
}
x=PINB.0;
if(PINB.1==0&&y==1)
{N--;
delay_ms(10);
}
y=PINB.1;
if(PINB.2==0&&y==1)
{M++;
delay_ms(10);
if(M>5)M=0;
}
s=PINB.2;
if(M==0)sss=N;
if(M==1)mmm=N;
if(M==2)hhh=N;
if(M==3)yy=N;
if(M==4)mm=N;
if(M==5)dd=N;
zhuanhuan(N);
for(i=0;i<=1;i++)
putchar(i,7,d[i]);
putchar(3,7,M+0x30);
if(PINB.3==0&&z==1)
{rtc_set_time(hhh,mmm,sss);
rtc_set_date(dd,mm,yy);
}
z=PINB.3;
该函数利用四个按键,加减按键用来增减需要修改的参数,定位按键用来定位需要修改参数的位置。
3)实时时间模块和温度测量模块利用库函数故不再累述。
4)12864显示器的模块函数.
autowr)
{
DATA_OUT=0xFF;//使用上拉电阻
DATA_DIR=0x00;//设置端口输入
CD=1;
WR=1;
RD=0;
CE=0;
if(autowr){
while(DATA_IN&0x08==0x00);
}
else{
while((DATA_IN&0x01==0x00)|(DATA_IN&0x02==0x00));
}
RD=1;
DATA_DIR=0xFF;//设置端口输出
}
//----------------------------------
//功能:
向端口写命令
//comm:
待写命令
//----------------------------------
voidwr_comm(ucharcomm)
{
chk_busy(0);//检测端口是否忙
CD=1;//命令
RD=1;
CE=0;
WR=0;
DATA_OUT=comm;
WR=1;
}
//----------------------------------
//功能:
向端口写命令
//dat写命令
//----------------------------------
voidwr_data(uchardat)
{
chk_busy(0);//检测端口是否忙
CD=0;//数据
RD=1;
CE=0;
WR=0;
DATA_OUT=dat;
WR=1;
}
//----------------------------------
//功能:
自动写数据
//----------------------------------
//功能:
写一个数据和命令
//dat:
待写数据
//comm:
待写命令
//----------------------------------
voidwr_od(uchardat,ucharcomm)
{
wr_data(dat);
wr_comm(comm);
}
//----------------------------------
//功能:
写两个数据和一个命令
//datl,dath:
待写数据
//comm:
待写命令
//----------------------------------
voidwr_td(uchardatl,uchardath,ucharcomm)
{
wr_data(datl);
wr_data(dath);
wr_comm(comm);
}
//----------------------------------
//功能:
写一个16进制数据和一个命令
//dat:
待写数据
//comm:
待写命令
//----------------------------------
voidwr_xd(uintdat,ucharcomm)
{
uchardatl,dath;
datl=dat;
dath=dat>>8;
wr_td(datl,dath,comm);
}
voidputchar(intx,inty,unsignedcharzifu)
{
wr_xd(STARTADD_T+16*y+x,0x24);
wr_xd(0,0x20);
wr_od(zifu-0x20,0xc0);
}
//----------------------------------
//功能:
点(x,y)位置的象素点
//形参:
x:
水平位置坐标(0~127)
//y:
垂直位置坐标(0~63)
//set:
1-点黑,0-点白
//----------------------------------
voidPutPixel(intx,inty,intset)
{
if(x<0||x>=MAX_X||y<0||y>=MAX_Y)
return;
else{
uintaddr=STARTADD_G;
addr+=y*BYTES_PER_LINE;
addr+=x/8;//计算x点左边有多少个完整的字节,并将作图地址定位到此处
wr_xd(addr,0x24);//地址指针定位
if(set)//如果是点黑
wr_comm(0xF8+(7-x%8));
else//如果是点白
wr_comm(0xF0+(7-x%8));
}
}
//----------------------------------
//功能:
在(x,y)位置显示24*24点阵的汉字
//形参:
x:
水平位置坐标(0~127)
//y:
垂直位置坐标(0~63)
//zi:
汉字点阵数组
//size:
点阵数
//amp_x:
水平放大倍数
//amp_y:
垂直放大倍数
//color:
是否反白显示
//----------------------------------
voidDisp_HanZi(intx,inty,flashucharzi[],intsize,intamp_x,intamp_y,intcolor)
{
inti,j,k,m,n;
for(i=0;ifor(m=0;mfor(j=0;jfor(k=0;k<8;k++)//象素
for(n=0;nif(zi[i*size/8+j]&(0x80>>k))//逐位判断,如果对应位为1,则点亮此点
PutPixel(x+((j*8)+k)*amp_x+n,y+i*amp_y+m,!
color);
else
PutPixel(x+((j*8)+k)*amp_x+n,y+i*amp_y+m,color);
}
//----------------------------------
//功能:
LCD初始化函数
//----------------------------------
voidInit_LCD(void)
{
CTL_DIR=0xFF;
DATA_DIR=0xFF;//设置端口输入
CD=1;
WR=1;
RD=1;
CE=1;
wr_xd(STARTADD_T,0x40);//置文本显示区首地址
wr_xd(STARTADD_G,0x42);//置图形显示区首地址
wr_td(BYTES_PER_LINE,0x00,0x41);//置文本显示区宽度
wr_xd(BYTES_PER_LINE,0x43);//置图形显示区宽度
wr_comm(0x80);//置"或"模式
//wr_td(0x02,0x00,0x22);//置CGRAM偏置地址
wr_comm(0x9C);//启用文本显示,启用图形显示
}
//功能:
清屏函数
//--------------------------------------------------------------------------
voidVLine(intx0,inty0,inty1,intcolor)
{
uchartmp;
if(y0>y1){//对y0、y1大小进行排列,以便画图
tmp=y1;
y1=y0;
y0=tmp;
}
do{
PutPixel(x0,y0,color);//逐点显示,描出垂直线
y0++;
}while(y1>=y0);
}
2.8硬件设计与调试
1)将设计好的PCB图打印在油墨纸上;
2)用转印机将油墨纸上的图转印在双面印制板;
3)用Fecl3溶液腐蚀印制板;
4)将已腐蚀好的板子用去污粉洗净;
5)用台钻将印制板上的焊盘打好;
6)根据原理图在印制板上焊接电路;
7)检查线路,确定无误后通电。
观察CA12864显示屏的调节电位器控制CA12864的亮度;
2.9成果展示
比较遗憾的是,双面印制板用完了,最后智能用面包板代替,但最终还是根据要求完成了项目,以上是我们的成果。
小组总结
3.1小组成员有话说:
【艾胜】在我焊完这个实验板后,我感受很多,我记得,我连续好几天天在实验室焊板子,完全投入其中,不知不觉到了中午、晚上,时间过得很快,而我也自得其乐。
出了很多问题,但我最后还是完成了,我非常开心。
我板子焊得比较认真,但缺乏这方面的经验。
虽然不是第一次焊板子,但我还是没有一次性成果,实在有些遗憾。
但我还是自认为良好,毕竟我在自己的努力下完成了任务,虽然为了赶进度,我曾在实验室熬夜一整晚,但是这些付出都是值得的。
【张松】这次项目制作确实走了不少弯路,但是也体会到了那种做团结合作所带来的快乐,回想那几天焊板子的时光都感觉是那么充实,每天埋头在那里焊到了吃饭的时间都想还有一点,再焊一点,结果一晃一两个小时都过去了,真有点废寝忘食的劲头,也给自己留下了一段难忘的经验。
完成了印制板的制作,但是却没有完成最后的测试,最后只得在面包板上重新焊接,感觉很遗憾。
不过有了这一次的经验,下一次我肯定能做的更好。
【刘露】一直都觉得一个女生似乎很难做到诸如拿电烙铁焊东西这类男性化的事情的,但经过此次的实践,深刻体会到,没有什么是不可能的,只要你愿意。
刚开始,一切都进行的比较顺利。
仿真图,PCB图,一气呵成。
在第一个星期班级购买器件时我还自告奋勇的跟上了,确实见了不少世面。
后来泡板子、调试时出了不少问题,不过也被我们一一解决,完成硬件电路着实让我学到了不少的东西。
细节决定成败,学习,不严谨是学不到东西的。
同时,做任何事要想想最终的目的,在完成的基础上谈完善,“花瓶”是毫无价值的!
学无止境,我们都需要继续努力!
【陈宏超】通过这次的硬件实物制作,我知道了干好一事的必备条件:
干任何事情要整体思路清晰:
做一件事之前一定要清楚自己要干什么,该怎么干,只有这样我才能保持一颗愉悦的心情去做这件事,才能做好这件事;
做事时要做到兢兢业业:
在焊电路的时候一定要认真仔细,不能丢三落四,每一个焊盘焊结实了才能焊接下一个,这样才能尽量减少错误提高成功率。
在后来帮助其他同学检查错误的时候就发现很多都是由于不仔细导致虚焊等不容易看出来的错误,导致反复检查浪费很多时间。
还有每焊完一个器件后再回头看看是不是每个该焊的引脚都焊好了;
要有遇到问题的心里准备:
由于人的大脑并不是编好程序的电脑,考虑问题的时候总会有一些纰漏。
我发现每个模块的焊接时很难做到一次成功。
而检查排除问题的过程往往是一艰难而又痛苦的过程,因此我们要做好遇到问题的心里准备,以一颗平静的心去解决它。
而这个过程正我们查缺补漏,自我能力提升的一个必不可少的过程。
3.2小组总结
两周智能仪器实训很快结束了,在这短暂的时间里,我们基本上实现了所有的功能,但是有些地方还不是很完善!
我们在接到实训任务的时候,心里确实有一点儿的不知所措,对于水位测量似懂非懂。
主要还是没有理解水位测量器的本质和掌握水位测量器的核心架构。
还好负责实训项目的老师把项目改为了带测温功能的万年历,假如没有这些,恐怕我们很难在短短的两个星期时间里完成了。
不管说啥,实训项目我们算是完成了.通过这次实训,确实让自己受益匪浅。
在实训期间,我学到了很多知识,遇到了一些困难,也看到了自己的理解存在着许多问题。
测试的时候,总会遇到这样那样的问题,还有写代码时一不小心就会把字母写错,从而造成软件不能执行!
所以我们在做程序时一定要细心在信心!
当前的软件的功能日趋复杂,知识达不到一定的深度和广度是难以在实际工作中应付自如的。
在小组成员的共同努力和老师的精心指导下,我们掌握了更丰富全面的单片机编程技术、电子CAD制版技巧和电路焊接技巧,使我们真正对所学的知识融会贯通,熟练运用。
再加以刻苦学习及训练,不断地开拓自己的视野,增强自己的实践操作技能,为以后能找到个好工作而努力。
“纸上得来终觉浅,绝知此事要躬行!
”在短暂的实习过程中,让我深深的感觉到自己在实际运用中的专业知识的匮乏,刚开始的一段时间里,对一些工作感到无从下手,茫然不知所措,这让我感到非常的难过。
在学校总以为自己学的不错,一旦接触到实际,才发现自己知道的是多么少,这时才真正领悟到“学无止境”的含义。
“千里之行,始于足下”,这是一个短暂而又充实的实习,我认为对我走向社会起到了一个桥梁的作用,过渡的作用,是人生的一段重要的经历,也是一个重要步骤,对将来走上工作岗位也有着很大帮助。
突然想起鲁迅先生的一句话:
这里本来没有路,只是走的人多了,也便成了路。
生活的路呢?
生活的路也是人走出来的,每个人一生总要去很多陌生的地方,然后熟悉,而接着又要启程去另一个陌生的地方。
作为初涉社会的开端,这里有许多回忆和联想,面对残酷的现实社会,每个人都无法选择逃避,除了勇敢面对,我们也无从选择!
走向明天,我依然走我自己!
不再茫然…
3.3小组评分
组员
艾胜
张松
陈宏超
刘露
小组评分
98
96
90
94
自评
95
94
84
88
总评
96.5
95
85
91
参考文献
《单片机原理及应用》中国电力出版社2005年7月
《智能仪器技术》武汉电力职业技术学院2009年6月
《智能仪器技术实训指导书》武汉电力职业技术学院2009年6月
2011-5-27
武汉电力职业技术学院
09641班