单片机课程设计Word文件下载.docx
《单片机课程设计Word文件下载.docx》由会员分享,可在线阅读,更多相关《单片机课程设计Word文件下载.docx(37页珍藏版)》请在冰点文库上搜索。
合计
14天
指导老师签名:
年 月 日
系主任(或负责老师)签名:
年 月 日
摘要
单片机是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域的广泛应用。
从上世纪80年代,由当时的4位、8位单片机,发展到现在的32位300M的高速单片机。
在本次单片机实习中,我要利用单片机最小系统设计一个扩展系统,其中包括矩阵键盘模块、温度检测模块、串口通信模块。
在系统的设计期间,我主要用到了proteus仿真软件和keil单片机C语言开发系统。
通过keil软件可以方便地在proteus上进行单片机的仿真,这给系统的设计与调试带来了很大的方便。
在矩阵键盘模块的软件实现中,我采用的行扫描法。
温度检测模块我使用了DS18B20温度监测器,这个芯片是“一线总线”结构,硬件电路非常简单,而且转换速度快,可实现高精度测温。
关键词:
单片机,矩阵键盘,数码管,串口通信
Abstract
MCUisAkindofintegratedcircuit,istouseverylargescaleintegratedcircuittechnologyhastheabilitytohandledatacentralprocessingCPUrandomstorageRAM,ROM,AvarietyofI/Oportandinterruptsystem,timer/timerfunctions(mayincludedisplaydrivercircuit,pulsewidthmodulationsystemcircuitandanalogmultiplexconverter,A/Dconvertingcircuits,etc)integratedintoApieceofsiliconwaferconstitutes,onAsmallandperfectmicrocomputersystem,intheindustrialcontrolfieldwidelyused.Fromthe1980s,bythefourandeightSCM,anddevelopmenttothepresentanda300mofhigh-speedmicrocontroller.
Inthesinglechipmicrocomputerinthepractice,Iwanttousesinglechipmicrocomputerminimumsystemdesignaextendedsystem,includingmatrixkeyboardmodule,temperaturedetectionmodule,serialcommunicationmodule.Inthesystemdesignperiod,ImainlyusetheproteussimulationsoftwareandkeilmicrocontrollerClanguagedevelopmentsystem.Throughthekeilsoftwarecanconvenientlyproteusinthesinglechipmicrocomputersimulation,thesystemdesignanddebugginghasbroughtgreatconvenience.
Inthematrixkeyboardmodulesoftwaretorealize,Ithelinescanmethod.TemperaturedetectionmoduleIusedtheDS18B20temperaturemonitor,thechipis"
alinebus"
structure,hardwarecircuitisverysimple,andconversionspeed,canrealizehighprecisiontemperaturemeasurement.
Keywords:
singlechipmicrocomputer,matrixkeyboard,digitaltube,serialcommunication
1、51单片机简介
51单片机是对目前所有兼容Intel8031指令系统的单片机的统称。
该系列单片机的始祖是Intel的8031单片机,后来随着Flashrom技术的发展,8031单片机取得了长足的进展,成为目前应用最广泛的8位单片机之一,其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。
目前很多公司都有51系列的兼容机型推出,在目前乃至今后很长的一段时间内将占有大量市场。
51单片机是基础入门的一个单片机,还是应用最广泛的一种。
AT89C52是一种带8K字节闪烁可编程可擦除只读存储器(FPEROM—FlashProgrammableandErasableReadOnlyMemory)的低电压,高性能CMOS8位微处理器,俗称单片机。
。
单片机的可擦除只读存储器可以反复擦除100次。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C52是一种高效微控制器。
1.1单片机引脚介绍
AT89C51单片机引脚图如图1所示:
引脚为程序存储器允许。
输出读外部程序存储器的选通信号。
引脚等于0时,单片机只访问外部程序存储器。
=1时,单片机访问内部程序存储器。
P0口为数据/低8位地址复用总线端口。
P1口为静态通用端口。
P2口为高8位地址总线动态端口。
P3口为双功能静态端口。
图1单片机引脚图
1.2单片机内部结构介绍
单片机内部结构如图2所示,包括:
1
一个8位的CPU;
24KB程序存储器ROM;
3128KBRAM数据存储器;
4两个16位的定时/计数器;
5可寻找64KB外部数据存储器和64KB外部程序存储空间的控制电路;
632条可编程的I/O线(4个8位并行I/O端口);
图2单片机内部结构图
7一个可编程全双工串行口;
具有两个优先级嵌套中断结构的5个中断源。
2、仿真软件简介
2.1proteus仿真软件简介
Proteus的ISIS是一款专业的单片机软件仿真系统。
proteus软件是英国Labcenterelectronics公司出版的EDA工具软件。
它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。
它是目前最好的仿真单片机及外围器件的工具,是目前世界上将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的较好设计平台,其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等,2010年即将增加Cortex和DSP系列处理器,并持续增加其他系列处理器模型。
在编译方面,它也支持IAR、Keil和MPLAB等多种编译器。
其特点如下:
①满足我们提出的单片机软件仿真系统的标准,并在同类产品中具有明显的优势。
②具有模拟电路仿真、数字电路仿真、单片机及其外围电路组成的系统的仿真、RS一232动态仿真、1C调制器、SPI调试器、键盘和LCD系统仿真的功能;
有各种虚拟仪器,如示波器、逻辑分析仪、信号发生器等。
③目前支持的单片机类型有:
68000系列、8051系列、AVR系列、PIC12系列、PIC16系列、PIC18系列、Z80系列、HC11系列以及各种外围芯片。
④支持大量的存储器和外围芯片。
总之该软件是一款集单片机和SPICE分析于一身的仿真软件,功能极其强大。
2.2PROTEL软件简介
PROTEL是Altium公司在80年代末推出的EDA软件,Protel99SE共分5个模块,分别是原理图设计、PCB设计(包含信号完整性分析)、自动布线器、原理图混合信号仿真、PLD设计。
2.3KEIL软件简介
KeilC51是美国KeilSoftware公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。
Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部分组合在一起。
KeilC51开发系统的优点如下:
①KeilC51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。
在开发大型软件时更能体现高级语言的优势。
②与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。
用过汇编语言后再使用C来开发,体会更加深刻。
KeilC51软件提供丰富的库函数和功能强大的集成开发调试工具,
2.4STC_ISP软件简介
STC-ISP是一款单片机下载编程烧录软件,是针对STC系列单片机而设计的,可下载STC89系列、12C2052系列和12C5410等系列的STC单片机,使用简便,现已被广泛使用。
3、单片机最小系统电路
单片机最小系统,或者称为最小应用系统,是指用最少的元件组成的单片机可以工作的系统.
对51系列单片机来说,最小系统一般应该包括:
单片机、晶振电路、复位电路.
3.1AT89C52的振荡电路
本设计选用12M的晶振构成震荡
电路,为单片机提供时钟脉冲。
C1、C2起稳定震荡频率、快速起振的
作用。
电容值一般为5-30pF。
震荡电路如图3所示:
图3震荡电路
3.2单片机复位电路
复位电路由一个C110uf的电容,一个C2104,一个10K电阻组成。
在引脚RST和电源间接一个琴键按钮,手动控制。
如图4复位电路所示:
图4复位电路
4、矩阵键盘及显示模块
4.1矩阵键盘
本次单片机实习中,键盘部分我采用4X4矩阵键盘。
将16个按键排成4行4列,第一行将每个按键的一端连接在一起构成行线,第一列将每个按键的另一端连接在一起构成列线,这样便一共有4行4列8跟线,我将这8跟线连接到单片机的P2口(8个I/O口),通过程序扫描键盘就可检测这16个键。
在这里,我使用了行扫描法。
即先送一列为低电平,其余几列均为高电平(此时可以确定列数),然后立即轮流检测一次各行是否有低电平,若检测到某一行为低电平(此时确定了行数),便可确认哪一行哪一列的按键被按下了。
用同样方法轮流送各列一次低电平,即可检测完16个按键。
矩阵键盘与单片机的连接方法如图5所示:
图5矩阵键盘
4.2数码管显示模块
这次实习中,我选用的数码管是共阳极数码管。
共阳极数码管其内部8个发光二极管的所有阳极全部连接在一起。
电路连接时,公共端接高电平。
当多个数码管连接在一起时,它们的公共端就是位选端。
在proteus仿真软件中,我使用了6位一体数码管,选用了P1.0到P1.5这6个I/O作为位选端。
但如果将位选端直接与单片机的I/O口相连,会带来一个问题,那就是单片机I/O口的输出电流不足以驱动数码管,则数码管显示时会有一些错误。
所以在这里,我先将单片机的I/O口通过74HC04(6输入反相器),将低电平转换成高电平再送入数码管的位选端。
通过反相器转换得到的高电平,可以驱动数码管。
每个数码管的8段二极管的引脚即为其段选端口,我选用了单片机的P0口8个I/O口作为段选端(这里需注意,PO口作为I/O使用时,需外接10K的上拉电阻,否则PO口无法正常工作)。
数码管内部发光二级管需要5mA以上的电路才可以点亮,而且电流不
可过大,否则会烧毁二极管。
由于单片机I/O口的输出电流没有这么大,所以数码管与单片机连接时需要加驱动电路。
在这里,我使用了上拉电阻的方法。
数码管与单片机的连接电路图如图6所示:
图6数码管显示电路
5、温度检测及显示模块
5.1DS18B20芯片介绍
本次实习中,我选用了DS18B20温度传感器设计温控系统。
DS18B20是美国DALLAS半导体公司推出的第一片支持“一线总线”接口的温度传感器,它具有微型化、低功耗、高性能、抗干扰能力强、易配微处理器等优点,可直接将温度转化为串行数字信号供处理器处理。
在这里,单片机接收到温度数据后,立即将数据传送到数码管实时显示。
5.2DS18B20温度传感器引脚
DS18B20引脚图如图7所示:
引脚说明:
GND-地,DQ-数字输入输出,VDD-供电电压。
图7DS18B20引图
5.3DS18B20温度传感器特性
1适应电压范围宽,电压范围在3.0
5.5V,在寄生电源方式下可由数据线供电。
2独特的单线接口方式,仅需一条口线即可实现与微处理器的双向通信。
3在使用中不需要任何外围电路,全部传感元件及转换电路集成在一个形如三极管的集成电路内。
4测温范围在
5可编程分辨率为9
12位,对应的可分辨温度分别为
6转换速度快,在9位分辨率时,最多在93.75ms内可把温度转换为数字。
7测量结果直接输出温度信号,具有极强的抗干扰纠错能力。
5.4DA18B20的连接方法
DS18B20有两种连接方法,即寄生电源供电和外部电源供电。
在测量温度高于100
时建议使用外部电源供电方式。
在本次实习中,我选用了寄生电源供电方式。
DS18B20与单片机通过P3.4口连接,连接方式如图8所示:
图8温度检测电路
5.5DS18B20工作时序
5.5.1DS18B20初始化
①先将数据线置高电平1;
②延时;
③数据线拉到低电平0;
④延时750us(延时范围可在480
960us之间);
⑤数据线拉到高电平1;
⑥延时等待。
若初始化成功则在15
60ms内产生一个由DS18B20返回的低电平0,根据该状态可以确定它的存在;
⑦若CPU独到数据线上的低电平0后,还要进行延时,其延时的实际从发出高电平算起最少要480us;
⑧将数据线再次达到高电平1后结束。
5.5.2DS18B20写数据
①数据线先置低电平0;
②延时15us;
③按从低位到高位的顺序发送数据(一次只发送一位);
④延时45us;
⑤将数据线拉到高电平1;
⑥重复①
⑤步骤,直到发送完整个字节;
⑦最后将数据线拉高到1。
5.5.3DS18B20读数据
①将数据线拉高到1;
②延时2us;
③将数据线拉低到0;
④延时6us;
⑤讲数据线拉高到1;
⑥延时4us;
⑦读数据线的状态得到一个状态位,并进行数据处理。
⑧延时30us;
⑨重复①
⑦步骤,直到读取完一个字节。
6、串口通信模块
6.1串口通信介绍
串行通信是将数据字节分成一位一位的形式在一条传输线上逐个传送,此时只需要一条数据线,外加一条公共信号地线和若干控制信号线。
因为一次只能传送一位,所以对一个字节的数据,至少要分8位才能传送完毕。
本次实习中,只有两个单片机进行通信,不需要控制信号线,其连接电路图如图9所示:
图9串口通信连接电路
6.2波特率计算
进行串口通信时,接收机和发送机的波特率必须一样,否则通信无法进行。
波特率只能由计数器
产生。
在本次实习中,
工作于方式2(8位自动重装初值计数方式),串行口工作于方式1(波特率可变10位异步通信方式)。
本系统的震荡电路中,晶振的振荡频率
=12MHz。
设传送速率为1200波特,则计数器
的计数初值X的计算方法如下:
取SMOD=0,算得X=230=E6H
故发送机和接收机的
的计数初值均为E6H。
7、软件实现方法
7.1编程思路
本次实习中,软件使用C语言实现。
在我设计的扩展系统中,矩阵键盘的1
10键作为数字0
9的按键,11、12、13键分别作为矩阵键盘扫描、温度检测、串口通信模块的功能选择键。
11键按下时,进入矩阵键盘扫描模块,按下1
10键,在数码管上显示相应的数值。
若按下其他键,跳出本模块,回到功能扫描模块。
12键按下时,进入温度检测模块,DS18B20开始工作,并将读取到的温度数据实时传送给单片机,单片机再将数据实时显示在数码管上。
13键按下是,进入串口通信模块。
此时,若11键按下,进入矩阵键盘串口通信模块,按下1
10键,在发送机和接收机的数码管上同步显示相应的数值。
若12键按下,进入温度检测串口通信模块,接收机和发送机的数码管上同步显示实时地温度值。
7.2主机程序流程图
主机(发送机)程序流程图如图10所示:
图10发送机流程图
8、结果分析
8.1矩阵键盘扫描功能测试
按下11键后,再分别按下0、1、2、3、4、5键,数码管显示如图11所示:
图11矩阵键盘扫描结果
8.2温度检测模块功能测试
按下12键后,数码管上显示的温度如图12所示:
图12温度检测结果
8.3串口通信功能检测
8.3.1矩阵键盘串口通信功能检测
按下13键,再按下11键,进入矩阵键盘串口通信模块,再分别按下0、1、2、3、4、5键,数码管显示如图13所示:
图13矩阵键盘串口通信结果
8.3.2温度检测串口通信功能检测
按下13键后,再按下12键,进入温度检测串口通信模块,发送机和接收机的结果如图14所示:
图图14温度检测串口通信结果
8.4结果分析
将程序下到单片机后,测试各功能,结果与预期一样。
美中不足的是,在串口通信模式下,发送机和接收机的数码管显示会有极微弱的闪烁。
分析原因应该是接收机的的接收程序采用的是中断方式编程。
9、小结与体会
这次实习一共有10天,这10天里我学到了很多关于单片机的东西。
这次实习,仿真方面,我们用到了PROTEL、PROTEUS、KEIL这3个软件。
以前学习单片机的时候,写程序时都是些一些分离的小程序,虽然功能也可以实现,但没有像这次这样,写的是一个系统的程序,也就是说要把各功能模块整合起来。
这时候,就要十分注意各个功能模块之间的相互影响,否则可能会带来一些意想不到的结果。
以前一直觉得单片机很简单,初学者很容易上手。
通过这次这么系统的运用,我发现,单片机虽然容易上手,但要熟练掌握其性能、想要得心应手地运用它,真的不是一朝一夕的事情。
只有通过多写程序,多上板子调试,你才会注意到一些平时不会注意的问题,积累经验,这样在以后写程序时,才可以避免出现更多的错误。
这几天,天天在调试程序,我发现要学好一样东西,真的不能浮躁,必须细心、虚心地学习。
网上的学习资料很丰富,有不懂的地方,可以多上网查查,或者向老师、同学请教。
一个人的见识是有限的,可以多听听别人的意见,再和自己的进行比较,发现自己的不足之处。
附录
1、参考资料:
[1]谢自美.电子线路设计·
实验·
测试(第三版).武汉:
华中科技大学出版社
[2]李群芳.单片微型计算机与接口技术(第3版).电子工业出版社,2008
[3]刘教瑜.单片机原理及应用.武汉理工大学出版社,2011
[4]张东亮.单片机原理与应用.人民邮电出版社,2009
[5]郭天祥.51单片机C语言教程.电子工业出版社.2009
[6]李群芳.单片微型计算机接口与技术.电子工业出版社.2008
2、程序
#include<
reg52.h>
stdio.h>
intrins.h>
#defineucharunsignedchar
#defineuintunsignedint
uintcount,a[8],temper,check=0;
floatf_temper;
sbitds=P3^4;
ucharcodetable[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,//显示字符表
0x80,0x90
};
voiddelay(uintxms)//延迟函数
{
uinti,j;
for(i=xms;
i>
0;
i--)
for(j=110;
j>
j--);
}
voiddata_display(ucharnum,uintwei)//0~9数据显示
{
for(i=0;
i<
wei-1;
i++)
{
if(i>
=6)
P1=0xfe;
if(i==0)
P0=table[num];
=1)
{
j=a[wei-i-1];
P0=table[j];
}
P1=_crol_(0xfe,i);
delay
(1);
P0=0xff;
}
}
voidsend(ucharkey_num)//串口键盘数据传送函数
SBUF=key_num;
while(!
TI);
TI=0;
voidsendtemp(uintt)//串口温度数据传送函数
{
uintb;
b=t/100;
b=b+11;
SBUF=b;
b=t-(b-11)*100;
voiddata_input()//0~9键盘扫描
uchari,j,temp,key;
while(temp!
=0xf0)
temp=P2;
temp=temp&
0xf0;
}
while
(1)
{
P2=0xfe;
//扫描第行
temp=temp&
if(temp!
delay(10);
temp=P2;
temp=t