单片机实习.docx
《单片机实习.docx》由会员分享,可在线阅读,更多相关《单片机实习.docx(18页珍藏版)》请在冰点文库上搜索。
单片机实习
机电工程学院
电子信息工程专业
实习总结(报告)
班级:
电子信息工程
院(系、部):
机电工程学院
学生姓名:
指导教师:
2015年7月15日
一、实习目的和意义1
、实习目的:
1
、实习意义:
1
二、实习内容1
三、功能模块介绍2
单片机最小系统4
电路原理5
振荡电路………………………………………………………………………….
复位电路………………………………………………………………………….
按键模块5
烧录模块5
电源模块6
液晶显示模块6
四、重点模块与实例7
从左到右的流水灯7
花样流水灯8
温度显示8
温度传感器8
温度显示仿真图9
温度显示实物图………………………………………………………
电子时钟显示9
时钟模块10
时钟模块连接电路10
电子时钟仿真图..........................................
电子时钟实物图.........................................
五、实习总结与心得11
六、参考文献12
附录12
一、实习目的和意义
、实习目的
基于AT90C54为核心制作的单片机最小系统,含有单片机工作的最基本组成单元——电源电路、复位电路和振荡电路。
另外,还有LED电路和RS232烧录串行接口电路以及用于扩展功能的四排与I/O端口相连的插孔。
通过对单片机最小系统的研究,掌握单片机各引脚的基本功能,理解单片机工作过程及工作原理,以及与各种外部器件的连接,能够自己制作一个单片机最小系统的开发板并为其设置一个用于下载程序的串口对其进行下载程序并进行调试使我们所学知识与实践结合起来。
所以我们应达到以下几点要求:
(1)利用单片机最小系统练习对原理图的辨认、焊接、连线,加深对基础知识的理解;
(2)掌握程序的编写和调试。
对编程和仿真软件的应用有了新的了解,完成系统的初始化,掌握日历时钟芯片、键盘显示等程序的编制及调试;
(3)反复对板子进行调试,加深对元器件的了解和板子工作原理的认知;
(4)通过单片机系统的调试、程序编制及运行,掌握单片机系统的工作原理、开发方法和操作方法。
实习意义
近年来随着计算机在社会领域的渗透,单片机的应用正在不断地走向深入,同时带动传统控制检测日新月益更新。
在实时检测和自动控制的单片机应用系统中,单片机往往是作为一个核心部件来使用,仅单片机方面知识是不够的,还应根据具体硬件结构,以及针对具体应用对象特点的软件结合,以作完善。
新世纪对新型人才的要求也越来越高,创新精神和实践能力是对新时期高素质人才的基本要求。
在本次实习中,不但可以掌握单片机软、硬件的综合调试方法,而且可以熟练掌握电路原理图,激发对单片机智能性的探索精神,提高学生的综合素质。
在制作学习过程中,不但可以掌握软、硬件的综合调试方法,而且可以使学生对单片机智能性产生强烈的欲望。
达到最大限度地掌握微机应用技术,软件及接口设计和数据采集与处理的技能,培养电综合实践素质的目。
二、实习内容
1.熟悉“单片机课程实习”电路板,领会、掌握该电路板的设计原理及硬件布局。
2.掌握单片机技术应用平台keil软件的学习。
借助平台软件,学习开发板的使用,按照要求编制、调试出正确的汇编语言程序。
3.针对实习电路板的功能,编制、调试、编译汇编语言程序,下载烧录并在实验板上运行,或利用软件proteus进行软件仿真。
实现的功能:
1.led显示模块:
单向循环流水led显示从左往右依次变亮;
2.花样流水灯:
从左往右依次变亮、从右往左依次变亮、从左往右再往左依次变亮、从左到右依次变暗,使用软件延时,通过发光二极管显示不同的花样,并且可以通过按键来控制流水灯的速度和模式切换;
3.利用数字温度传感器DS18B20测量温度信号,计算后在LCD液晶屏上显示相应的温度值;
4.利用时钟芯片在LCD1602液晶上显示时间,并通过按键进行年、月、日、时、分的调整;
三、功能模块介绍
单片机最小系统
图1单片机最小系统
电路原理
振荡电路
振荡电路由一个12M的晶振和两个电容所组成,原理图如下:
图2振荡电路
复位电路
复位电路由上电复位和按键复位两部分组成。
AT89C51系列单片机即为高电平复位,在复位引脚RST上接一电容到VCC,再接一电阻到GND,由此形成一个RC充放电路,原理图如下:
图3复位电路
按键模块
本设计采用的4个独立按键,分别是:
“设置”、“确认”、“加”、“减”。
在时间显示模块中判断“设置”键是否按下及第几次按下可以分别对日期、时间、星期选定,然后按“加”、“减”即可进行设置,“确认”键按下后,新数据即写入时钟芯片。
例如,“设置”键按1下,即可以对年份进行设置,按4下,即是可以对小时进行设置。
在花样流水灯模块中采用三个按键,分别是:
“模式切换”、“加速”、“减速”。
按“模式切换”可对流水灯的花样进行切换,按“加速”、“减速”可使其速度增快减慢。
其电路设计如图4所示。
图44位独立按键模块
烧录模块
RS232串口电路使用MAX232CPE作为电平转换芯片,并通过套件提供的串口电缆连接到计算机背后的COM口(9针D型口),用于MCS51LITE与上位机通信以及和其他串口设备的数据交互。
图5单片机程序烧录串行接口模块
电源模块
电源电路主要采用7805芯片,为单片机提供一个稳定的5V电源,原理图如下:
图6电源输入模块
液晶显示模块
1602液晶也叫1602字符型液晶,他是一种专门用来显示字母、数字、符号等的点阵型液晶模块。
它是由若干个5*7或者5*11等点阵字符位组成,每个点阵字符都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正一味如此所以他不能很好的显示图形(用自定义CGRAM,显示效果也不好)。
LCD1602是工业字符型液晶,能够同时显示16x02即32个字符。
1602采用标准的16脚接口,其中:
第1脚:
VSS为地电源第2脚:
VDD接5V正电源
第3脚:
V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。
第4脚:
RS为寄存器选择,高电平选数据寄存器、低电平选指令寄存器。
第5脚:
R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。
当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。
第6脚:
E端为使能端,当E由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:
D0~D7为8位双向数据线。
第15脚:
背光电源正极第16脚:
背光电源负极
图7液晶LCD1602显示电路
四、重点模块与实例
从左到右的流水灯
说明:
接在P0口的8个LED从左到右循环依次点亮,产生走马灯效果
整个系统工作由软件程序控制运行,根据需要,可以上电后系统经过初始化,进入用户设定模式状态。
图8流水灯显示
花样流水灯
于AT90C54单片机的彩灯控制方案,实现对LED灯的控制。
本方案以AT90C54单片机作为主控核心,与驱动等模块组成核心主控制模块。
在主控模块上设有晶振电路和8个LED灯,根据需要编写若干种亮灯模式,根据各种亮灯时间的不同需要,在不同时刻输出灯亮或灯灭的控制信号
程序在功能实现过程中的作用
(1)键盘扫描程序:
检测是否有按键按下,有按键按下则记录按下键的键值,并跳转至功能转移程序;无按键按下,则返回键盘扫描程序继续检测。
(2)功能转移程序:
对检测到的按键值进行判断,是功能键则跳转至相应的功能程序,我们设计的功能程序有三种,即模式切换功能、加速功能和减速的功能。
(3)通过外部中断程序实现速度的调整,由复位口实现电路的原来的速度。
图9花样流水灯仿真图
图10花样流水灯实物图
温度显示
温度传感器
温度是一个基本的物理量,自然界中的一切过程与温度密切相关。
设计里加入DS18B20温度传感器可以随时了解温度的变化。
DS18B20的封装引脚如图和单片机与DS18B20的连接如图10。
DS18B20温度传感器的I/O(DQ)引脚连接的是单片机的引脚。
图11DS18B20图12测温电路图
DS18B20温度传感器主要特性:
(1)适应电压范围更宽,电压范围:
~,Vcc为外接供电电源输入端,在寄生电源方式下可由数据线供电,GND为电源地。
(2)独特的单线接口方式,DS18B20在与单片机连接时仅需要一个引脚(DQ)即可实现微处理器与DS18B20的双向通讯。
(3)DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内。
(4)温范围:
55℃~+125℃,在-10~+85℃时精度为±℃。
(5)可编程的分辨率为9~12位,对应的可分辨温度分别为℃、℃、℃和℃,可实现高精度测温。
(6)负压特性:
电源极性接反时,芯片不会因发热而烧毁,但不能正常工作。
温度显示仿真图
图13LCD1602温度显示
温度显示实物图
图14LCD1602温度显示实物图
电子时钟显示
市场上可以选择的时钟芯片很多,功能也不尽相同,价格各异。
DS1302[8]是美国DALLAS公司推出的一种串行接口实时时钟芯片。
芯片内部具有可编程日历时钟和31个字节的静态RAM,它可以对年、月、日、星期、时、分、秒进行计时,日历时钟可自动进行闰年补偿,及时准确,接口简单,使用方便,工作电压范围宽,功耗低,芯片自身还具有对备份电池进行涓流充电功能,可以有效地延长备份电池的使用寿命。
DS1302引脚封装如图15所示。
图15DS1302引脚封装图
时钟模块连接电路图
图16单片机与DS1302的连接引脚图
电子时钟仿真图
图17时钟模块仿真图
电子时钟实物图
图18时钟模块实物图
五、实习总结与心得
经过一个月的实习我学到了很多知识,也发现了自己存在的一些问题。
通过此次的实习我体会到了。
只单单学习课本上的知识是不行的,我们需要的更多的是动手能力,是与实践相结合的能力。
在这次实习中我们一共焊了最小系统、烧录模块、按键模块、电源模块、流水灯模块、时钟模块六个模块。
应用这几个模块,我们分别实现了流水灯的循环点亮、花样流水灯、LCD1602显示屏显示温度、LCD1602显示屏显示时间这四样功能。
然后我们分别用protues系统仿真软件对各个模块进行了模拟仿真,用keil软件编制了汇编语言程序,验证了我们所设计的程序。
在设计过程中使我懂得在设计程序之前,务必要对所用单片机的内部结构有一个系统的了解,知道该单片机内有哪些资源:
懂得设计的关键是要有一个清晰的思路和一个完整的软件流程图。
在设计程序时,不能妄想一次就将整个程序设计好,“反复修改,不断改进”是程序设计的必经之路。
要养成注释程序的好习惯,一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白你思路,这样也为资料的保存和交流提供了方便。
整个设计的过程中,还是碰到了一些问题。
比如,对于键盘的延时防抖问题不能较好的解决;设计中我最大的收获就是自己的动手能力和独立解决问题的能力得到了很大的提高,在动手的过程中,不仅能增强实践能力,而且在理论上可以有更深的认识。
感谢这次实习让我意识到了本身的不足,使得自己得到了提升。
六、参考文献
[1]许珉.单片机原理及应用[M].北京:
中国电力出版社,
[2]三恒星科技.MCS-51单片机原理与应用实例[M].北京:
电子工业出版社,
[3]王为青,程国钢.单片机KeilCx51应用开发技术[M].北京:
人民邮电出版社,
[4]JohnMarkus.电子电路大全[M].北京:
计量出版社,1995
[5]阎石.数字电子技术基础[M].北京:
高等教育出版社,,第4版
[6]邓元庆.数字电路与逻辑设计[M].北京:
电子工业出版社,2001
附录
实验所用程序如下
1.流水灯
#ifndef__REG52_H__
#define__REG52_H__
/*BYTERegisters*/
sfrP0=0x80;
sfrP1=0x90;
sfrP2=0xA0;
sfrP3=0xB0;
sfrPSW=0xD0;
sfrACC=0xE0;
sfrB=0xF0;
sfrSP=0x81;
sfrDPL=0x82;
sfrDPH=0x83;
sfrPCON=0x87;
sfrTCON=0x88;
sfrTMOD=0x89;
sfrTL0=0x8A;
sfrTL1=0x8B;
sfrTH0=0x8C;
sfrTH1=0x8D;
sfrIE=0xA8;
sfrIP=0xB8;
sfrSCON=0x98;
sfrSBUF=0x99;
/*8052Extensions*/
sfrT2CON=0xC8;
sfrRCAP2L=0xCA;
sfrRCAP2H=0xCB;
sfrTL2=0xCC;
sfrTH2=0xCD;
/*BITRegisters*/
/*PSW*/
sbitCY=PSW^7;
sbitAC=PSW^6;
sbitF0=PSW^5;
sbitRS1=PSW^4;
sbitRS0=PSW^3;
sbitOV=PSW^2;
sbitP=PSW^0;;
Current_Temp_Display_Buffer[9]=Display_Digit[1]+'0';
Current_Temp_Display_Buffer[8]=Display_Digit[2]+'0';
Current_Temp_Display_Buffer[7]=Display_Digit[3]+'0';
if(Display_Digit[3]==0)
Current_Temp_Display_Buffer[7]='';
if(Display_Digit[2]==0&&Display_Digit[3]==0)
Current_Temp_Display_Buffer[8]='';
if(ng)
{
if(Current_Temp_Display_Buffer[8]=='')
Current_Temp_Display_Buffer[8]='-';
elseif(Current_Temp_Display_Buffer[7]=='')
Current_Temp_Display_Buffer[7]='-';
else
Current_Temp_Display_Buffer[6]='-';
}
Set_LCD_POS(0x00);
for(i=0;i<16;i++)
{
Write_LCD_Data(Temp_Disp_Title[i]);
}
Set_LCD_POS(0x40);
for(i=0;i<16;i++)
{
Write_LCD_Data(Current_Temp_Display_Buffer[i]);
}
Set_LCD_POS(0x4d);
Write_LCD_Data(0x00);
Set_LCD_POS(0x4e);
Write_LCD_Data('C');
}
voidmain()
{
LCD_Initialise();
Read_Temperature();
Delay(50000);
Delay(50000);
while
(1)
{
Read_Temperature();
if(DS18B20_IS_OK)
Display_Temperature();
DelayXus(100);
}
}
{
ucharKey;
P2=P1=0xFF;
P0=0x00;
ModeNo=0;Idx=4;
/*P3=DSY_CODE[ModeNo];*/
IE=0x82;
TMOD=0x00;
TR0=1;
while
(1)
{
Key=GetKey();
if(Key!
=0)KeyProcess(Key);
}
}
4、LCD1602
#include<>
#include<>
#include<>
#defineuintunsignedint
#defineucharunsignedchar
sbitIO=P1^0;.,六,为了与DS1302的星期格式匹配,返回值需要加1
DateTime[5]=(w+d)%7+1;
}
//***年月日时分++/--***//
voidDateTime_Adjust(charx)
{
switch(Adjust_Index)
{
case6:
//年00-99
if(x==1&&DateTime[6]<99)DateTime[6]++;
if(x==-1&&DateTime[6]>0)DateTime[6]--;
//获取2月天数
MonthsDays[2]=isLeapYear(2000+DateTime[6])?
29:
28;
//如果年份变化后当前月份的天数大于上限则设为上限
if(DateTime[3]>MonthsDays[DateTime[4]])
{
DateTime[3]=MonthsDays[DateTime[4]];}
RefreshWeekDay();//刷新星期
break;
case4:
//月01-12
if(x==1&&DateTime[4]<12)DateTime[4]++;
if(x==-1&&DateTime[4]>1)DateTime[4]--;
MonthsDays[2]=isLeapYear(2000+DateTime[6])?
29:
28;
if(DateTime[3]>MonthsDays[DateTime[4]])
{
DateTime[3]=MonthsDays[DateTime[4]];}
RefreshWeekDay();
break;
case3:
//日00-28、29、30、31,调节之前首先根据年份得出该年中断二月天数
MonthsDays[2]=isLeapYear(2000+DateTime[6])?
29:
28;
//根据当前月份决定调节日期的上限
if(x==1&&DateTime[3]if(x==-1&&DateTime[3]>0)DateTime[3]--;
RefreshWeekDay();
break;
case2:
//时
if(x==1&&DateTime[2]<23)DateTime[2]++;
if(x==-1&&DateTime[2]>0)DateTime[2]--;
break;
case1:
//分
if(x==1&&DateTime[1]<59)DateTime[1]++;
if(x==-1&&DateTime[1]>0)DateTime[1]--;
break;
}
}
//-定时器0每秒刷新LCD显示-//
voidT0_INT()interrupt1
{
TH0=-50000/256;
TL0=-50000%256;
if(++tCount!
=2)
return;
tCount=0;
//按指定格式生成待显示的日期时间串
Format_DateTime(DateTime[6],LCD_DSY_BUFFER1+5);
Format_DateTime(DateTime[4],LCD_DSY_BUFFER1+8);
Format_DateTime(DateTime[3],LCD_DSY_BUFFER1+11);
//星期
strcpy(LCD_DSY_BUFFER1+13,WEEK[DateTime[5]-1]);
//时分秒
Format_DateTime(DateTime[2],LCD_DSY_BUFFER2+5);
Format_DateTime(DateTime[1],LCD_DSY_BUFFER2+8);
Format_DateTime(DateTime[0],LCD_DSY_BUFFER2+11);
//显示年月日,星期,时分秒
Display_LCD_String(0x00,LCD_DSY_BUFFER1);
Display_LCD_String(0x40,LCD_DSY_BUFFER2);
}
//----键盘中断(INT0)-----//
voidEX_INT0()interrupt0
{
if(K1==0)//选择调整对象(YMDHM)
{
DelayMS(10);
if(K1==0){
//while(K1==0);
if(Adjust_Index==-1||Adjust_Index==1)
{
Adjust_Index=7;
}
Adjust_Index--;
if(Adjust_Index==5)Adjust_Index=4;
LCD_DSY_BUFFER2[13]='[';
LCD_DSY_BUFFER2[14]=Change_Flag[Adjust_Index];
//显示调节对象
LCD_DSY_BUFFER2[15]=']';
}
}
elseif(K2==0)//加
{//while(K2==0);
DelayMS(10);
if(K2==0)
DateTime_Adjust
(1);
}
elseif(K3==0)//减
{
DelayMS(10);//while(K3==0);
if(K3==0)
DateTime_Adjust(-1);
}
elseif(K4==0)//确定
{
//while(K4==0);
DelayMS(10);
if(K4==0){
SET_DS1302();
//将调整后的时间写入DS1302
LCD_DSY_BUFFER2[13]='';
LCD_DSY_BUFFER2[14]='';
LCD_DSY_BUFFER2[15]='';
Adjust_Index=-1;
}
}
}
voidmain()
{
Init_LCD();//液晶初始化
IE=0x83;//允许INT0,T0中断,EA=1,,ET0=1,EX0=1
IP=0x01;//设置外部中断0为高级中断
IT0=0x01;//外部中断0为电平触发,低电平有效
TMOD=0x01;//设置定时器T0工作方式为方式1,
TH0=-50000/256;//装入初始值,定时1秒
TL0=-50000%256;
TR0=1;//启动定时器
while
(1)
{
//如果未执行调整操作则正常读取当前时间
if(Adjust_Index==-1)GetTime();
}
}