单片机课程设计报告 - 图文

更新时间:2024-05-01 08:52:01 阅读量: 综合文库 文档下载

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

装 订线————————————————————————— ————————————————————————————————摘要

单片机课程设计主要是让我们增进对c51单片机的感性认识,加深对理论方面的理解。了解软硬件之间的有关知识,并掌握软硬件的设计过程、方法及实现,为以后的设计和实现应用系统打下良好基础。本次课程设计主要完成跑马灯及闪烁灯的实验设计。首先通过Protel 99 SE或proteus ISIS画好原理图,然后将绘制好的原理图在PCB面板上制线,通过导入Keil C的设计好的汇编语言程序,完成模拟和仿真,最后将所模拟的程序导入已做好的AT89C51芯片上完成功能演示整个过程。最终根据要求完成所有步骤,实现了预期演示跑马灯、流水灯、闪烁灯任务。 关键词:

单片机、软件、硬件、跑马灯、流水灯、闪烁灯、印制板图、程序、数码管

Abstract

SCM curriculum design is mainly let us enhance perceptions of the C51 microcontroller, to deepen theoretical understanding. Understanding of relevant knowledge between hardware and software, and master the design process of hardware and software, and the method of realization, and lay a good foundation for the design and implementation of application system. The experimental design of this course design mainly completes the marquee and flashing lights. Through the first Protel 99 SE or Proteus ISIS drawing principle diagram, and then draw principle of good business line in the PCB panel design, through the introduction of Keil C good assembly language program to complete the simulation, finally Complete the whole process of AT89C51 chip demo program to import the simulation done. Finally according to the requirements to complete all the steps to achieve the desired presentation marquees, lights, flashing lights. Keyword:

SCM, software, hardware, marquees, lights, flashing lights, printed circuit board diagram, program, digital tube

装 订线————————————————————————— ————————————————————————————————

引言

本次课程设计通过对单片机的学习和认识,单片机最小系统是在以MCS-52单片机为基础上扩展,使其能更方便地运用于测试系统中,不仅具有控制方便、组态简单和灵活性大等优点,而且可以大幅度提高被测试的技术指标,从而能够大大提高产品的质量和数量。单片机以其功能强、体积小、可靠性高、造价低和开发周期短等优点,称为在实时检测和自动控制领域中广泛应用的器件,在工业生产中称为必不可少的器件,尤其是在日常生活中发挥的作用也越来越大。通过学习新知识,巩固及更深一步理解已学知识。面对一个电子设计,应对出系统的方案,分析出各个板块,再对各个板块进一步的具体设计。先进行硬件的电路的设计,一定要考虑好应用什么原件、各个元件的具体参数、是否能实现应有功能,从而得到一个完整的硬件电路。再根据电路设计出来软件的功能模块、从而完成程序流程图,再根据流程图完成设计,并通过反复的调试、运行、更改,完成既定功能为止,最终将软件、硬件结合进行调试、运行,对其功能进行一一测试,并反复思考其测试中遇到相应问题的原因,并将其一一处理,从而达到本次设计的实验要求及最终目的。

一、单片机及其基本器件概述:

单片机最小系统,或者称为最小应用系统:是指用最少的元件组成的单片机可以工作的系统。对51系列单片机来说最小系统一般应该包括:单片机、晶振电路、复位电路、按键输入、显示输出等。单片机接口电路主要用来连接计算机和其它外部设备。各功能模块的选择及论证如下:

复位电路:由电容和电阻构成,由电路图并结合\电容电压不能突变\的性质,可以知道,当系统一上电,RST脚将会出现高电平,并且,这个高电平持续的时间由电路的RC值来决定。典型的51单片机当RST脚的高电平持续两个机器周期以上就将复位,所以,适当组合RC的取值就可以保证可靠的复位。本设计中R=1K,C=10uF。

晶振电路:典型的晶振取11.0592MHz(因为可以准确地得到9600波特率和19200波特率,用于有串口通讯的场合)同时也可取12MHz(产生精确的微秒级时歇,方便定时操作),因设计需要,本设计采用12M晶振。

单片机:一片AT89S51/52或其他51系列兼容单片机,本设计采用STC89C52RC。 接口电路:具有人机交互接口。具有一定的可扩展性,单片机I/O口可方便地与其他电路板连接。

通过该最小系统,我们可以用keil软件进行编程从而实现对一些外设的控制!比如一些

装 订线————————————————————————— ————————————————————————————————简单的实验:闪烁灯、跑马灯、数码管和蜂鸣器的展示等等!

二、STC89C52RC介绍

STC89C52RC单片机是宏晶科技推出的新一代高速/低功耗/超强抗干扰的单片机,指令代码完全兼容传统8051单片机,12时钟/机器周期和6时钟/机器周期可以任意选择。 主要特性如下:

1.增强型8051单片机,6时钟/机器周期和12时钟/机器周期可以任意 选择,指令代码完全兼容传统8051.

2.工作电压:5.5V~3.3V(5V单片机)/3.8V~2.0V(3V单片机)

3.工作频率范围:0~40MHz,相当于普通8051的0~80MHz,实际工作频率可达48MHz 4.用户应用程序空间为8K字节 5.片上集成512字节RAM

6.通用I/O口(32个),复位后为:P1/P2/P3/P4是准双向口/弱上拉,P0口是漏极开路输出,作为总线扩展用时,不用加上拉电阻,作为I/O口用时,需加上拉电阻。

7.ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无

需专用仿真器,可通过串口(RxD/P3.0,TxD/P3.1)直接下载用户程序,数秒即可完成一片

8.具有EEPROM功能 9.具有看门狗功能

10.共3个16位定时器/计数器。即定时器T0、T1、T2

11.外部中断4路,下降沿中断或低电平触发电路,Power -Down模式可 由外部中断低电平触发中断方式唤醒

三、课程设计内容

课题一:单片机最小系统的原理图和PCB版图设计

1、原理图如图所示:

2、PCB版图设计: PCB网络代码如图:

装订线————————————————————————— ————————————————————————————————生成PCB版图如图:

装订线————————————————————————— ————————————————————————————————课题二:单片机闪烁灯的设计

1、在proteus ISIS上完成印制板图制作,根据电路图连接好器件。

装 订线————————————————————————— 2、对89C51芯片导入汇编程序(见附录),以实现电路功能。

需要用keil c软件对汇编程序进行编译,生成相应的文件加入芯片即可。打开keil c软件后,首先需建立一个项目,点击菜单栏中的“工程”,选择弹出的下拉式菜单中的“新建工程”,然后弹出保存的对话框,在“文件名”中输入文件名保存即可,然后选择所要的单片机新建工程:

————————————————————————————————

装 订线—————————————————————————

————————————————————————————————选择好后,点击“文件”“新建”,将编写的汇编程序导入文件,并保存文件,这里注意要以“.ASM”为文件后缀名。然后右击目标一,点击“为目标一设置选项”,在弹出的对话框的菜单栏里选择“输出”,并将“产生HEX文件”选项上画勾,点击确定。最后将此文件加入已建好的项目中,然后再生成“hex”文件。生成hex文件

装 订线————————————————————————— ————————————————————————————————生成hex文件后就可以将汇编程序加入到芯片中。双击电路图中的89C51芯片,点击“Program File”中的文件找到“hex”文件所在处,点击鼠标添加,然后点击确定就把文件加入成功,添加文件

在芯片中加入汇编程序后即可进行功能仿真,点击“调试”菜单下的“执行”按钮,电路即进行仿真。观察仿真电路,可以看到发光二极管一直在闪烁,完成模拟仿真。

装订线————————————————————————— ————————————————————————————————打开上述操作中已保存的程序文件,将文件导入已做好的单片机,点击点击完成调试模拟仿真后,打开STC-ISP软件

装 订线————————————————————————— ————————————————————————————————Download/下载,打开单片机实验模板开关,完成实验。

课题二:单片机跑马灯的设计

1、在proteus ISIS上完成印制板图制作,根据电路图连接好器件。

装 订线————————————————————————— ————————————————————————————————2、运用Keil C编写的代码,生成“paomadeng.hex”文件(见附录),将程序导入面板中。

3、运行程序,使LED的闪烁,达到预期跑马灯效果。 课题三:单片机流水灯的设计

1、在proteus ISIS上完成印制板图制作,根据电路图连接好器件

装 订线————————————————————————— ————————————————————————————————

2、同跑马灯一样,用keil c 完成流水灯程序(见附录)并导入;完成调试,等到预期效果。

四、课程设计的心得体会、收获

通过此次为期两周的课程设计,我加深了对单片机以及C语言的认识和理解,

使各部分的知识得到了进一步的巩固。将平时学的理论知识真正应用到实际中,实现了学与用相结合,应用单片机这一开发环境,软硬件结合来达到设计一实物的目的。同时还了解了三个专业软件:KEIL C、PROTEUS、PROTEL 99 SE和仿真软件,现在基本熟悉了他们的应用与相关知识。其中还是存在一些问题,因为是第一次用到这些软件,对软件的基本了解还不够,在连接电路图,制作面板时还是会发生器件短路,参数出错,等等问题,但是及时问老师,同学,及时查询学习教程不断改正错误,完成课程设计。此次课程设计,关键的是整个课设过程,这中间有着我们的辛勤劳动和认真的思考,过程有些枯燥,但却十分有意义。仿真和程序的编写都会遇到很多问题,但我们保持耐心,认真对待,问题终会解决。整个过程认真坚持下来,你会收获很多,体会很多,不管是对以后的学习,还是对我们的自身本事的锻炼,这些都是我们非常宝贵的财富。 课设过程中遇到的苦难,通过对设计的认真分析以及与同学们的讨论,找到了其中的出错点,将其改正,每个问题都这样一一改正,整个课设完成的十分成功。此次课设还锻炼了我们的动手能力,开阔了我们的思维境界,使我们的知识更丰富,不仅加深了我

装 订线————————————————————————— ————————————————————————————————们对所学专业的认识,更增加了我们对所学专业的兴趣! 同时非常感谢两周来指导老师对我两周的耐心指导。

【附录】

1、闪烁灯c语言程序 方式一:

#include \

//#define uchar unsigned char //#define uint unsigned int sbit P10=P1^0; //延时子程序

void mDelay(unsigned int Delay)//主程序 { unsigned int i;

for(;Delay>0;Delay--) { for(i=0;i<124;i++) {;} } }

void main() { for(;;)

{ P10=!P10; //取反 P1.0

mDelay(1000); //延时1秒。如果是2000那么是2秒 } }

方式二:

#include //库文件

#define uchar unsigned char//宏定义无符号字符型 #define uint unsigned int //宏定义无符号整型

/******************************************************************** I/O定义

*********************************************************************/ sbit LED=P1^0; //定义单片机P1口的第0位 (即P1.0)

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

*********************************************************************/ void delay()//延时程序 {

uchar m,n,s;

for(m=20;m>0;m--) for(n=20;n>0;n--)

装 订线————————————————————————— ————————————————————————————————for(s=248;s>0;s--); }

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

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

while(1) //无限循环 {

LED=0; //点亮P1.0口灯 delay(); //延时

LED=1; //熄灭P1.0口灯 delay(); //延时 } }

/******************************************************************** 结束

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

2、流水灯c语言程序

#include //库文件

#define uchar unsigned char//宏定义无符号字符型 #define uint unsigned int //宏定义无符号整型

/******************************************************************** 初始定义

*********************************************************************/ uchar temp; //定义字符型变量 uchar a,b,i;

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

*********************************************************************/ void delay()//延时程序 { uchar m,n,s; for(m=20;m>0;m--) for(n=20;n>0;n--) for(s=248;s>0;s--); }

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

*********************************************************************/ void main() { temp=0xfe; //11111110定义每次一个灯亮

装 订线————————————————————————— ———————————————————————————————— while(1) { P3=P2=P0=P1=temp;//直接对1/0口赋值,使批输出低电平。 delay();//延时 for(i=1;i<8;i++)//实现广告灯的从右到左移动 { a=temp<

/******************************************************************** 结束

*********************************************************************/ 3、跑马灯c语言程序 方式一:

#include //库文件

#define uchar unsigned char//宏定义无符号字符型 #define uint unsigned int //宏定义无符号整型

/******************************************************************** 初始定义

*********************************************************************/ uchar temp; //定义字符型变量 uchar a,b,i;

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

*********************************************************************/ void delay()//延时程序 {

uchar m,n,s;

for(m=20;m>0;m--) for(n=20;n>0;n--) for(s=248;s>0;s--); }

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

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

while(1) {

temp=0xfe; //11111110定义每次一个灯亮

装 订线————————————————————————— ————————————————————————————————P3=P2=P0=P1=temp;//直接对1/0口赋值,使批输出低电平。 delay();//延时

for(i=1;i<8;i++)//实现广告灯的从右到左移动 {

a=temp<>(8-i); //右移8-i位 P3=P2=P0=P1=a|b;//相与求值 delay(); }

for(i=1;i<8;i++)//实现广告灯的从左到右移动 {

a=temp>>i; //右移i位 b=temp<<(8-i); //左移8-i位 P3=P2=P0=P1=a|b;//相与求值 delay(); } } }

/******************************************************************** 结束

*********************************************************************/ 方式二:

/*P0~P3一个灯循环亮且由慢变快*/

#include //库文件

#define uchar unsigned char//宏定义无符号字符型 #define uint unsigned int //宏定义无符号整型

uint tc; /*延时变量tc*/

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

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

{ void delay(int t); /*定义延时函数delay(int t)或delay(t)但delay()是错的因此函数是有参数的。*/ void light(); /*void函数应无类型int. float等 说明,定义亮灯函数 light(),其是无参数的。*/ while(1) /*大循环*/ {

tc=5000;

装 订线————————————————————————— ———————————————————————————————— while(tc>500) /*tc由5000开始到500循环*/ {

light(); tc=tc-1500; }

while(tc>=100) /*tc由500开始到小于100循环*/ {light(); tc=tc-80;} } } /*継续大循环*/

/******************************************************************** 亮灯子函数

*********************************************************************/ void light() /*亮灯子函数 light()其无直接参数*/ {

uint c; int i; c=0x0fe; /*P0口亮*/ for(i=1;i<=9;i++) {P0=c; delay(tc);

c=c<<1|1; /*等价c=c<<1;c=c+0x01*/ } /*注:若用P0=P0<<1|1;因读P0再右移再加1,当P0某个脚外电路拉底就不对了*/ c=0x7f; for(i=1;i<=9;i++) {P2=c; delay(tc); c=c>>1|0X80; } c=0x7f; for(i=1;i<=9;i++) {P3=c; delay(tc); c=c>>1|0X80; } c=0x7f; for(i=1;i<=9;i++) {P1=c; delay(tc); c=c>>1|0X80; } }

装 订线————————————————————————— ————————————————————————————————

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

*********************************************************************/ void delay(int t) /*延时函数delay(int t)*/ {int i; for(i=1;i<=t;i++) { } }

/******************************************************************** 结束

*********************************************************************/ 4、看门狗应用c语言程序

#include /*看门狗应用*/

sfr WDTRST = 0xA6; //看门狗声明 unsigned char i; unsigned char temp; unsigned char a,b; delay()//延时程序 {unsigned char m,n,s; for(m=20;m>0;m--) for(n=20;n>0;n--) for(s=248;s>0;s--); }

main() {

/****************************初始化看门狗*************************************/ WDTRST=0x1E;

WDTRST=0xE1;//初始化看门狗。

/***************************初始化看门狗*************************************/ while(1) {

/*******************************喂狗指令*************************************/ WDTRST=0x1E;

WDTRST=0xE1;//喂狗指令

/********************************喂狗指令*************************************/ temp=0xfe;

P3=P2=P0=P1=temp;//直接对1/0口p3赋值,使批p3.0输出低电平。 delay();//延时

for(i=1;i<8;i++)//实现广告灯的从右到左移动 {

a=temp<

装 订线—————————————————————————— ———————————————————————————————b=temp>>(8-i); P3=P2=P0=P1=a|b; delay(); }

for(i=1;i<8;i++)//实现广告灯的从左到右移动 {

a=temp>>i; b=temp<<(8-i); P3=P2=P0=P1=a|b; delay(); } } }

/************************************结束*************************************/

参考文献

【1】张毅刚.刘杰.单片机原理及应用.[M]哈尔滨:哈尔滨工业大学出版社,2008. 【2】郭天祥.新概念51单片机C语言教程.[M]北京:电子工业出版社,2009. 【3】王静霞.单片机应用技术C语言版.[M]北京:电子工业出版社,2009.

【4】 孙涵芳.MCS-51/96系列单片机原理及应用(修订版).北京航空航天大学出版社.1994 【5】李朝青.单片机原理及接口技术(第3版).北京航空航天大学出版社.2005 【6】蒋辉平.基于Proteus的单片机系统设计与仿真实例.机械工业出版社.2009

指导教师评语:

—————————————————————————— 装 订 线———————————————————————————————

实 验 成 绩: 指导(辅导)教师 :

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

Top