2014单片机课程设计课程设计说明书(示例)20141226 - 图文

更新时间:2023-10-24 21:55:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

设计成绩

课程设计说明书

题 目 单片机课程设计

姓 名 孟奥杰 学 号 1010409005 专业年级 2010级光信息9班 指导教师 张 涛

2015年1 月5日

I

摘 要

利用C语言编程方法,结合在《单片机接口原理及技术》课程中学到的知识。论文从项目开发的硬件到设计思路到程序设计做了一个完整的论述。

此次课程设计共分为三个设计项目,其中在个性化定时器中,采用单片机片内中断定时器产生等距的时间周期,并向可设定时间的倒计时装置提供一个相对精准的时钟源,再集合矩阵键盘添加相应设置功能并完成此次设计。在第二个测量室内温度项目设计中,用到了一个机遇I2C通信的ADC/DAC芯片检测NTC与固定电阻上NTC分得的电压值,算出NTC的阻值后利用查表法找出当时环境温度。而在花样点阵中,由于三个小项目都有其各自的特点,所以为充分达到最佳的显示效果每个对应的算法都不相同。如点阵显示方面,旋转跑马灯采用的是静态显示法,而在另外两个里面则采用动态扫描法。

在此次设计中,严格的按照先熟悉硬件架构,在再制定程序流程图,最后才编写程序的方式,这样大大的避免了不必要的麻烦。

关键词:单片机,定时器,温度测量,8*8点阵,

Abstract

This thesis designed for simple keyboard, the basic requirement is to send 1, 2, 3, 4, 5, 6, 7 seven notes.

Well-known, the music is made up by many different scales, and each scale corresponds to different frequency, so we can use different frequency to make combination of scales, and then produce wonderful music.

As for single-chip microcomputer, it is very convenient to produce different frequency, we just calculate an audio cycle, then this cycle divided by 2, namely half cycle time, using timer to time the half cycle time.

Whenever timing, it will output pulse I/O reverse phase, and repeat the timing, the half cycle again to the I/O reversed-phase, then can get this frequency pulse from the I/O feet. So we can use microcontroller timer to make it work in the counter mode and generate different frequency signal. Thus produce different notes.

Keywords: scales,frequency, single-chip microcomputer

I

目 录

摘 要 ...................................................................... I Abstract .................................................................... I 目 录 ....................................................................... 1 1 单片机课程设计的目的和意义 ................................................ 1 2设计任务与总体设计思路 .................................................... 1

2.1 设计要求 ............................................................ 1 3硬件电路设计 .............................................................. 3

3.1 STC15F408AD简介 ..................................................... 4 3.2 74HC573锁存器 ....................................................... 5 3.3 74Ls 138译码器 ...................................................... 5 3.4 硬件电路图 .......................................................... 6 4 软件设计 .................................................................. 6

4.1设计思路与流程图 ..................................................... 6 4.2 关键程序 ............................................................ 7 5 问题分析与解决方法 ....................................................... 10 6 收获与展望 ............................................................... 11 参考文献 ................................................................... 11 附录A:NTC温度计运行图 .................................................... 12 附录B:点阵花样显示运行图1 ................................................ 12 附录C:点阵花样显示运行图2 ................................................ 13

1 单片机课程设计的目的和意义

大学期间的课程设计是在专业知识结构、技能培养、综合应用等各方面培养锻炼学生的一项十分重要的工作。根据通信广电专业的特点和培养目标,希望学生在学习单片机课程后,能将理论知识与实际开发应用相结合,通过在校内实训基地对给定设计题目的分析与思考,能相对独立的设计出电路并进行程序设计,最终制作出的设计能实现各项功能,从而将理论、实践紧密结合,为学生今后从事专业技术工作奠定坚实的基础。

掌握单片机及应用系统开发,是电子类工程师必须具备的重要技能,是重要信息科学研究的平台,是就业和深造的必须技能,也是后续开发应用ARM、DSP 等高级设计的基础,是怀化学院推行“三位一体”人才培养模式的具体举措,是贯彻执行“国家教育部”和“国家财政部”2007年2号文件,加强本科教育、重实践、重基础的很好举措。通过完成课程设计题目硬件与软件开发的完整过程,使学生牢固掌握单片机系统的开发和应用。切实加强动手能力,提升对理论知识的认识,两者结合,提高理论指导、解决实际问题的能力。

以电子技术基础理论与数字电路技术基础知识为指导,结合C语言、汇编语言进行程序设计,完成给定功能的硬件设计、调试。包括以下几个方面:

(1)深入理解单片机的工作原理,掌握单片机程序设计的思路; (2)熟悉常用电子仪器操作使用和测试方法;

(3)掌握计算机辅助设计,熟练使用KeilC软件进行程序编写、编译、调试; (4)熟练单片机汇编语言或C语言程序设计; (5)牢固掌握单片机系统的开发应用的过程;

(6)掌握单片机的接口技术及外围芯片的特性及应用;

(7)通过编程与调试,逐步掌握模块化程序设计方法和调试技术;

2设计任务与总体设计思路

2.1 设计要求

本设计要实现摇摇棒显示功能,STC单片机作为主控器,实现以下设计要求: (1)编程实现32个LED组成的流水灯显示,同时测试焊接是否有错误。

(2)编程实现通过按键控制32个LED的流水灯,在上下、两边往中间,中间往两边的流动效果间切换。

(3)编程实现晃动时显示蓝色的“2014年11月”文字,注意检测起晃动时的始点位置决定显示位置。

(4)编程实现晃动时显示蓝色的“12104060xx名字”学号与名字。

以下文字根据不同的题目自己修改 1.音乐频谱的要求:

(1)实现15列LED的流水灯点亮方式(每一列单独控制) (2)实现音乐信号的FFT变换(可以选择512点、1024点)

(3)实现特定频率模拟信号的频谱显示(根据频谱信号强弱显示不同的信号条) (4)实现电脑播放音乐的频谱动态显示效果。

注意:该电路板上使用STC12C5A60S2单片机控制,但未将P3.0、P3.1端口引出供程序下载使用,

故需要同学们自己将其接出来以便于编程调试,如何引出请大家自行想办法解决, 如果焊接失败或者将电路板损坏,请自己去淘宝购买相同的电路板替换。

2.极光电路的要求:(请使用流动性好的焊锡丝与30瓦以上尖嘴烙铁)

(1)焊接时需要先焊接LED,LED最长的引脚接电路板方孔焊盘,接错不亮。

背面C1为0805贴片电容,0805贴片电阻除R22为1M欧(印字:105)外,其余均为120欧(印字:121)。

单片机芯片注意缺口方向,焊接时注意引脚对齐,电路板上没有预留了4针下载接口,需要我们自己

将芯片的P3.0、P3.1端口以及VCC、GND4条线引出供程序下载使用。

(2)根据电路图我们可以知道作者使用了4个引脚与4*7个引脚的配合实现了28个3色LED的彩色显示功能,

编写程序时可以先测试哪个端口控制哪几个LED,以便于自己进行圆圈式的循环流动显示。

(3)编写程序实现全部灯泡的红色、绿色、蓝色三种状态显示。

(4)编写程序实现由内圈到外圈,依次按照由红色变绿色,再变蓝色的渐变点亮方式。

(5)编程实现不同的LED随机显示不同颜色。

(6)编程实现最外圈的循环流动显示,由红色,变红绿,变红蓝,变绿蓝,变红绿蓝的方式滚动显示。

3.循迹小车的要求:(电路板上已经预留了4针下载接口)

(资料请看:http://item.taobao.com/item.htm?id=41930315979) (1)焊接时请注意按照说明书进行。

(2)编程实现驱动小车直线前进(不循迹,不避障)。

(3)编程实现驱动小车避障前行(在一个围棋的圈内自主行进)。 (4)编程实现驱动小车循迹前进.

(5)编程实现小车跟随硬纸板前行(驱动左右两边的2个避障红外检测电路实现)。

4.旋转LED的要求:

(已共享该制作的所有资料,详见《十字旋转LED显示屏资料.rar》,电路板上已经预留了4针下载接口))

(1)按照要求进行焊接,注意LED是在电路板侧立边焊接的,有红色、蓝色两种,限流电阻不同,不要焊错。

组装底部无线供电电路时注意线圈、电机、三极管、电源连接线等细节。

(2)编程实现两侧流水灯显示,同时测试焊接是否有错误(程序已给出)。 (3)编程实现旋转显示红色的文字“2014年11月”,显示蓝色的文字“单片机课程设计”。

(4)编写EEPROM读写函数,实现上位机将显示内容发送过来先存入EEPROM后再调出显示。

5.LED点阵电子时钟的要求:

(电路板上已经预留了4针下载接口,配套下载线为PL2303芯片,请按说明安装驱动与下载程序)

(1)编程实现LED点阵显示屏最外圈的旋转流水灯显示功能。 (2)编程实现点阵显示汉字功能,并实现3级亮度可调。 (3)编程实现DS18B20的温度读取功能,显示在点阵屏上。 (4)编程实现DS1302的程序读写,并进行万年历的显示功能。

(5)编程实现可通过按键调整的万年历程序,并实现3级亮度可调。

6.液晶显示的简易计算器的要求:

此电路需要自己焊接,请按照给定的原理图进行焊接,注意有极性的单片机芯片与LED。

(1)编程实现LCD1602液晶的显示驱动,可以显示ABCDEF,abcdef,12345678等字符。 (2)编程实现4×4键盘的扫描判断并在1602上显示各个按键值(0-9,+,-,×,÷,C,=)。

(3)编程实现10位以内整数的加减法运算程序。 (4)编程实现10位以内整数的乘除法运算程序。

(5)编程实现10位以内浮点数的加减乘除的运算程序。 要求LCD1602第一行显示: 7654321×1234567 第二行显示结果: =9449772114007

7.液晶显示的温湿度检测仪的要求:

此电路需要自己焊接,请按照给定的原理图进行焊接,注意有极性的单片机芯片与LED。

(1)编程实现LCD1602液晶的显示驱动,可以显示ABCDEF,abcdef,12345678等字符。 (2)编程实现DHT11的温度读取程序,并在LCD1602上显示出来。 (3)编程实现DHT11的湿度读取程序,并在LCD1602上显示出来。

(4)编程实现温湿度上下线设定功能,超过限定范围时能发出“嘀嘀嘀”报警声音。

3硬件电路设计

根据设计的要求,将系统的功能分为几个模块,分别写实现这些模块的硬件电路是哪些,怎么设计的即可。

3.1 STC15F408AD简介

STC15F408AD是一种带8K字节FLASH存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的高速低功耗,超强抗干扰的单片微处理器,俗称单片机。其指令代码完全兼容8051单片机,1T时钟周期。外形及引脚排列如图2.1所示。

图3.1 STC15F408AD引脚图

主要特性:与MCS-51 兼容 4K字节可编程FLASH存储器寿命:1000写/擦循环数据保留时间:10年全静态工作:0Hz-24MHz

AT89C51管脚说明: VCC:供电电压。 GND:接地。

P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P0口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。

P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。

P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。

P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。

P3口也可作为AT89C51的一些特殊功能口,P3.0 RXD(串行输入口)P3.1 TXD(串行输出口)P3.2 /INT0(外部中断0)P3.3 /INT1(外部中断1)P3.4 T0(记时器0外部输入)P3.5 T1(记时器1外部输入)P3.6 /WR(外部数据存储器写选通) P3.7 /RD(外部数据存储器读选通)P3口同时为闪烁编程和编程校验接收一些控制信号。

RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。 ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。

/PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。

/EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。

XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。 XTAL2:来自反向振荡器的输出。

3.2 74HC573锁存器

LM386是八进制 3 态非反转透明锁存器,采用20脚双列直插塑料封装,外形如图2.2所示。

图3.2 74HC573外形管脚图

74HC573高性能硅门CMOS器件, 当锁存使能端LE为高时,这些器件的锁存对于数据是透明的(也就是说输出同步)。当锁存使能变低时,符合建立时间和保持时间的数据会被锁存。 当输入的数据消失时,在芯片的输出端,数据仍然保持; 这个概念在并行数据扩展中经常使用到。

3.3 74Ls 138译码器

74LS138 为3 线-8 线译码器,当一个选通端(E1)为高电平,另两个选通端((/E2))和/(E3))为低电平时,可将地址端(A0、A1、A2)的二进制编码在Y0至Y7对应的输出端以低电平译出。比如:A2A1A0=110时,则Y6输出端输出低电平信号。

图3.3 74LS138外形管脚图

3.4 硬件电路图

整个系统的硬件电路如图3.4所示,包括xxxxxx。

图3.4 硬件电路原理图

4 软件设计

4.1设计思路与流程图

这个个性化定时器我们采用的是单片机中中断定时器Time0,产生一个25ms的时间段,然后通过适当的算法,将其实现十分秒的倒计。设置相应的标志位使蜂鸣器鸣叫。程序流程图如下图所示。

图4.1设计程序流程图

在主程序流程图中,T0初始化以后,首先要通过扫描键盘,判断是否有按键按下。若没有按键按下,则要继续扫描,不断重复循环过程,直到发现按键按下,程序才能根据按键的功能,将相对应的音符T值装入到T0以后,T0开始启动。程序随后继续扫描按键,若按键保持按下状态,则T0继续保持工作状态,直到倒计时计数。

图4.2为T0中断子程序图。

Time0中断入口 重装TH0、TL0 对时间段计数处理时分秒 中断返回 图4.2为T0中断子程序图

4.2 关键程序

#include #include

sbit LS138A = P2^2; //定义138译码器的输入A脚由P2.2控制 sbit LS138B = P2^3; //定义138译码器的输入脚B由P2.3控制

sbit LS138C = P2^4; //定义138译码器的输入脚C由P2.4控制 #define Led_Port P0

#define MS 1 //数码管扫描显示时间间隔 #define PCF8591 0x90 //PCF8591 地址 //此表为 LED 的字模, 共阴数码管 0-9 - unsigned char code Disp_Tab[] =

{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};

unsigned int code Temp_Tab[]=//从0-50度,步进为1摄氏度的每个温度所对应的NTC温度值 {

33626,31898,30270,28730,27291, 25927,24641,23427,22281,21198, 20176,19209,18295,17436,16612, 15104,14409,13751,13127,12535, 11974,11441,10936,10455,10000, 9566,9155,8956,8763,8391,8637, 7700,7379,7073,6789,6505,6241, 5989,5749,5519,5301,5092,4893, 4703,4521,4348,4182,4023,3871, 3726,3588 };

/******************************************************************* 预定义函数

*******************************************************************/

bit ISendByte(unsigned char sla,unsigned char c);//给PCF8591P发送一个字节 unsigned char IRcvByte(unsigned char sla); //从PCF8591P读取一个字节 void Led_display(unsigned int Temp); //扫描显示函数 void LED_duan_slect(unsigned char i); //数码管位选函数

/******************************************************************* 延时函数

*******************************************************************/ void delay(unsigned int i) {

unsigned char j; while(i--)

for(j=0;j<115;j++); }

/******************************************************************* 主函数

*******************************************************************/ void main(void) {

unsigned char BB;

unsigned char AD_Value;

unsigned int Temp_position; while(1) {

ISendByte(PCF8591,0x40); //向PCF8591P发送读取通道值 AD_Value=IRcvByte(PCF8591); //ADC0 模数转换1 放大2倍显示

Temp_position=(unsigned int)((255.0/(float)AD_Value-1.0)*15295.0); //把读取到的电信号转换成NTC电阻值 for(BB=0;BB<=50;BB++) {

if(Temp_position>=Temp_Tab[BB]) {

Led_display(BB); break; } } } }

/******************************************************************* ADC发送字节[命令]数据函数

*******************************************************************/ bit ISendByte(unsigned char sla,unsigned char c) {

Start_I2c(); //启动总线 SendByte(sla); //发送器件地址 if(ack==0)return(0);

SendByte(c); //发送数据 if(ack==0)return(0);

Stop_I2c(); //结束总线 return(1); }

/******************************************************************* ADC读字节数据函数

*******************************************************************/ unsigned char IRcvByte(unsigned char sla) { unsigned char c;

Start_I2c(); //启动总线 SendByte(sla+1); //发送器件地址 if(ack==0)return(0);

c=RcvByte(); //读取数据0

Ack_I2c(1); //发送非就答位 Stop_I2c(); //结束总线 return(c);

}

/******************************************************************* 一次数码管扫描显示测得温度

*******************************************************************/ void Led_display(unsigned int Temp) {

Led_Port=Disp_Tab[Temp00/100]; LED_duan_slect(5); delay(MS); Led_Port=0x00;

Led_Port=Disp_Tab[Temp0/10]; LED_duan_slect(6); delay(MS); Led_Port=0x00;

Led_Port=Disp_Tab[Temp]; LED_duan_slect(7); delay(MS); Led_Port=0x00; }

void LED_duan_slect(unsigned char i) {

switch(i) //使用switch 语句控制位选 也可以是用查表的方式 学员可以试着自己修改

{

case 0:LS138A=0; LS138B=0; LS138C=0; break;

case 1:LS138A=1; LS138B=0; LS138C=0; break; case 2:LS138A=0; LS138B=1; LS138C=0; break; case 3:LS138A=1; LS138B=1; LS138C=0; break; case 4:LS138A=0; LS138B=0; LS138C=1; break; case 5:LS138A=1; LS138B=0; LS138C=1; break; case 6:LS138A=0; LS138B=1; LS138C=1; break; case 7:LS138A=1; LS138B=1; LS138C=1; break; } }

5 问题分析与解决方法

写一下在设计硬件、焊接硬件与编写程序过程中遇到的问题,以及如何解决的。

6 收获与展望

通过本次课程设计我们获益良多,我加深了对单片机的了解,并对一个嵌入式程序有了基本的了解,虽在编写程序的时候碰到了很多问题,但通过从书本,网络搜集到的知识把在项目设计中遇到的问题一一解决了。

在这次的课程设计中,我了解到了,一个流程图对程序的编写起到了非常重要的作用。在事前写好流程图后,在编写程序的时候就可以有一条清晰的思路。当在编好的程序一直到单片机上进行调试出现的问题时,只要顺着主流程,再按照单片机执行的时序便可清晰的了解到此次问题是出在哪。

在电子技术应用领域中,单片机的应用愈来愈多地应用到各行各业。如:工业控制、仪器仪表、电讯技术、办公自动化和计算机外部设备、汽车与节能、商用产品、家用电器等。目前,单片机正朝着大容量片上存储器、多功能i/o接口、宽范围工作电源和低功耗方向发展。要开发单片机的应用,不但要掌握单片机硬件和软件方面的知识,而且还要深入了解各应用系统的专业知识,只有将这两方面的知识融会贯通和有机结合,才能设计出优良的应用系统。一个好的工程设计师不仅要掌握单片机的工作原理,而且还要不断了解各公司最新芯片的结构和应用,在实际应用中找到最好的性能价格比。所以以后还要注意培养接受新知识的自学能力,掌握芯片发展动态。

同时也让我们找到了自己在某些知识上的欠缺,并通过这次机会得到弥补,取得进步。

参考文献

[1].彭伟.《单片机C语言程序设计实训100例》.电子工业出版社.2009年6月. [2].杨居义.《单片机课程设计实例教程》.清华大学出版社.2010年8月. [3].郭天祥.《新概念51单片机C语言教程》.电子工业出版社.2009年1月. [4].余成波.《传感器与自动检测技术》.高等教育出版社.2009年7月.

[5].杨欣.张延强.张铠麟.《实例解读51单片机完全学习与应用》.人民邮电出版社.2011年4月.

附录A:NTC温度计运行图

附录B:点阵花样显示运行图1

附录C:点阵花样显示运行图2

本文来源:https://www.bwwdw.com/article/tf92.html

Top