单片机课程设计报告.docx
《单片机课程设计报告.docx》由会员分享,可在线阅读,更多相关《单片机课程设计报告.docx(22页珍藏版)》请在冰点文库上搜索。
![单片机课程设计报告.docx](https://file1.bingdoc.com/fileroot1/2023-5/10/3bb935ed-3bc5-4afd-8995-6ecbfd6c8753/3bb935ed-3bc5-4afd-8995-6ecbfd6c87531.gif)
单片机课程设计报告
山东大学
威海分校
课程设计(论文)
设计(论文)题目
单片机基本功能的设计与实现
姓名:
学号:
学院:
机电与信息工程学院
专业:
机械设计制造及其自动化
年级:
级
指导教师:
陈原
2012年05月23日
目录
摘要2
前言3
一.80c52单片机简介4
二、开发板各个模块5
1、复位电路5
2、流水灯6
3、蜂鸣器7
4、数码管显示电路7
5、DY18b64LCD显示9
6、ds1302时钟电路10
7、USB供电线路11
8、独立按键12
三、程序调试与编译13
四、程序设计(举例)14
1、跑马灯14
2、音乐播放(世上只有妈妈好)15
3、独立按键控制数码管显示18
结语20
摘要
本设计以STC89C52单片机为控制系统,实现上电复位,手动复位,晶振,流水灯,蜂鸣器,四位八段数字动态显示,独立按键显示。
外加5V电源,DS1302时钟,126*84显示屏等。
在单片机最小系统中可以继续扩展,实现电机控制,声音控制,灯光控制,温度控制,频率控制等。
是实现单片机控制的基本模型。
关键词
STC89C52最小系统控制程序设计
ABSTRACT
Thedesignforthecontrolofsingle-chipSTC89C52system,power-onreset,manualreset,oscillationtransistors,speakers,foureightthenumberofdynamicdisplay,independentkey.5Vexternalpowersupply,DS1302clock,126*84LCDandsoon.Inthesmallestsingle-chipsystemcancontinuetoexpand,therealizationofmotorcontrol,soundcontrol,lightingcontrol,temperaturecontrol,frequencycontrol.Istoachievesingle-chipmicrocomputertocontrolthebasicmodel.
KEYWORDS
STC89C52Singlechipminimizesystemcontrolprogramdesign
前言
MCS-51系列单片机目前在国内广泛应用于各个行业,而且学习资料齐全,是单片机学习的首选。
本学习版采用STC89C52芯片的I/O口设计显示/键盘电路,而且设有扩展接口作为通讯和中断接接口,扩展性强。
通过此电路的学习,可熟悉51系列单片机结构特点,掌握软件设计的基本思路和基本方法,为进行更复杂的系统设计打下坚实的基础,单片机课程设计给我很好的向导。
以下是我所设计的单片机板,如下:
图1-1-1单片机正面图
图1-1-2单片机背面图
一.80c52单片机简介
所选用为STC89C52单片机,
STC89C52具体介绍如下:
①主电源引脚(2根)
VCC(Pin40):
电源输入,接+5V电源
GND(Pin20):
接地线
②外接晶振引脚(2根)
XTAL1(Pin19):
片内振荡电路的输入端
XTAL2(Pin20):
片内振荡电路的输出端
③控制引脚(4根)
RST/VPP(Pin9):
复位引脚,引脚上出现2个机器周期的高电平将使单片机复位。
ALE/PROG(Pin30):
地址锁存允许信号
PSEN(Pin29):
外部存储器读选通信号
图1-2-189C52单片机管脚图
EA/VPP(Pin31):
程序存储器的内外部选通,接低电平从外部程序存储器读指令,如果接高电平则从内部程序存储器读指令。
④可编程输入/输出引脚(32根)
STC89C52单片机有4组8位的可编程I/O口,分别位P0、P1、P2、P3口,每个口有8位(8根引脚),共32根。
PO口(Pin39~Pin32):
8位双向I/O口线,名称为P0.0~P0.7
P1口(Pin1~Pin8):
8位准双向I/O口线,名称为P1.0~P1.7
P2口(Pin21~Pin28):
8位准双向I/O口线,名称为P2.0~P2.7
P3口(Pin10~Pin17):
8位准双向I/O口线,名称为P3.0~P3.7
图1-2-2单片机主控单元
二、开发板各个模块
1、复位电路
按钮复位需要人为在复位输入端RST上加入高电平。
一般采用的办法是在RST端和正电源Vcc之间接一个按钮。
当人为按下按钮时,则Vcc的+5V电平就会直接加到RST端。
手动按钮复位的电路如所示。
由于人的动作再快也会使按钮保持接通达数十毫秒,所以,完全能够满足复位的时间要求。
原理图如下所示:
图2-1-1复位电路
这里我们采用了最简单的方式按键复位电路
2、流水灯
这里采用了共阳极接法,通过单片机控制p1八个口的电平,高电平时不亮,低电平时led导通发光。
采用移位的方式实现流水灯的功能。
利用的控制程序在程序设计章节从给出。
原理图以及实物图如下所示:
图2-2-1流水灯控制电路介绍
图2-2-2实际流水灯
3、蜂鸣器
蜂鸣器发声原理是电流通过电磁线圈,使电磁线圈产生磁场来驱动振动膜发声的,因此需要一定的电流才能驱动它,单片机IO引脚输出的电流较小,单片机输出的TTL电平基本上驱动不了蜂鸣器,因此需要增加一个电流放大的电路.
图2-3-1
程序中改变单片机P2.5引脚输出波形的频率,就可以调整控制蜂鸣器音调,产生各种不同音调的声音.另外,改变P2.5输出电平的高低电平占空比,则可以控制蜂鸣器的声音大小.
实际蜂鸣器参见图2-4-2.
4、数码管显示电路
LED数码管是将8个发光二极管封装而成的,每段为一发光二极管,其字形结构如图(a)所示.选择不同字段发光,可显示出不同的字形,例如,当a、b、c、d、e、f、g字段亮时,显示出字符“8”;当a、f、g、c、d字段亮时,显示出字符“5”.图(b)所示为单个LED数码管的引脚排列图,图中com引脚是单个LED数码管的公共端。
共阳极数码管——>内部8个LED的阳极连接在一起作为公共引出端;只有在公共端接高电平时,该数码管才会亮.
共阴极数码管——>内部8个LED的阴极连接在一起作为公共引出端;只有在公共端接低电平时,该数码管才会亮.
图2-4-1数码管电路图
这里采用的是共阳极接法,通过单片机控制p0口的高低电平实现数码管的通断。
下为数码管及蜂鸣器的实物图:
图2-4-2数码管及蜂鸣器实物
5、DY18b64LCD显示
带中文字库的128X64是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128×64,内置8192个16*16点汉字,和128个16*8点ASCII字符集.利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。
可以显示8×4行16×16点阵的汉字.也可完成图形显示.低电压低功耗是其又一显著特点。
由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。
图2-5-1DY18b64LCD显示电路
图2-5-2显示屏插槽
6、ds1302时钟电路
80c52的时钟电路如图所示,由振荡器及定时元件、时钟发生器、地址锁存允许信号ALE等几部分组成。
振荡器的工作频率在1.2~12MHZ间,一般用晶振做定时控制元件.这里采用12MHZ的晶振作为振荡器。
图2-6-1时钟电路电路图
图2-6-2时钟电路实物
7、USB供电线路
USB口的1脚为+5V,4脚为GND,在你设计版时可以直接引用这个电源为单片机供电,如板上需要3.3V则再加个1117模块稳压输出3.3V。
在我的使用中,我发现:
1、不要知路及反接
2、电流不要超过500mA,一般我们会在USB进来的+5V上串一个500mA的自恢复保险
图2-7-1USB供电电路
图2-7-2供电电路实物图
8、独立按键
在单片机应用系统中,除了复位按键有专门的复位电路及专一的复位功能外,其它按键都是以开关状态来设置控制功能或输入数据.当所设置的功能键或数字键按下时,计算机应用系统应完成该按键所设定的功能,键信息输入是与软件结构密切相关的过程.对于一组键或一个键盘,总有一个接口电路与CPU相连.CPU可以采用查询或中断方式了解有无将键输入并检查是哪一个键按下,将该键号送入累加器ACC,然后通过跳转指令转入执行该键的功能程序,执行完后再返回主程序。
本设计是利用按键控制数码管的变化。
图2-8-1独立按键设计
图2-8-2独立按键实物
三、程序调试与编译
打开Keiluvision2程序,新建一个工程,点确定按钮,取名为.uv2格式的文件,再新建个文件,取名为.asm格式的文件,再把自己已经写好的程序复制在该文件里。
右击target文件,调节参数(要生成.hex的文件,为以后烧程序做准备),单击target文件,后右击soursegroup1文件,添加已取名.asm文件,点调试快捷键,找出程序的错误并根据错误进行相应的修改,在此过程中每次修改后都要保存再进行编译,直到程序无错误。
最后程序完成,会生成.hex的文件。
把已焊接好的电路板接在电脑上,把芯片按好在该板上,打开at89s51烧程序,添加已编译好的.hex文件,击电擦除后,再进行烧程序,看看焊板上的LED灯和数字管的现象是否和自己的思路以及实验要求的一致,如果不一致或者程序有错误或者达不到实验要求,要认真分析实验程序和求教于老师或者同学,直到最后程序成功达到预期目的。
四、程序设计(举例)
1、跑马灯
#include
voiddelay(unsignedinti);//声明延时函数
charLED;
main()
{
unsignedchari;
while
(1)
{LED=0xfe;
for(i=0;i<8;i++)
{
P1=LED;
delay(500);
LED=LED<<1;//左移
LED=LED|0x01;//移位后,后面的位为高电平
if(LED==0x7f)break;//提前退出FOR循环
}
for(i=0;i<8;i++)
{
P1=LED;
delay(500);
LED=LED>>1;//右移
LED=LED|0x80;//移位后,后面的位为高电平
}
}
}
/*******延时函数*************/
voiddelay(unsignedinti)
{
unsignedcharj;
for(i;i>0;i--)
for(j=255;j>0;j--);
}
2、音乐播放(世上只有妈妈好)
#include//包含头文件,一般情况不需要改动?
//头文件包含特殊功能寄存器的定义
/*------------------------------------------------
硬件端口定义
------------------------------------------------*/
sbitSPK=P2^5;//定义音乐输出端口
unsignedcharTimer0_H,Timer0_L,Time;
//世上只有妈妈好数据表
codeunsignedcharMUSIC[]={6,2,3,5,2,1,3,2,2,5,2,2,1,3,2,6,2,1,5,2,1,
6,2,4,3,2,2,5,2,1,6,2,1,5,2,2,3,2,2,1,2,1,
6,1,1,5,2,1,3,2,1,2,2,4,2,2,3,3,2,1,5,2,2,
5,2,1,6,2,1,3,2,2,2,2,2,1,2,4,5,2,3,3,2,1,
2,2,1,1,2,1,6,1,1,1,2,1,5,1,6,0,0,0
};
//音阶频率表高八位
codeunsignedcharFREQH[]={
0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8,
0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC,//1,2,3,4,5,6,7,8,i
0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,
0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,
};
//音阶频率表低八位
codeunsignedcharFREQL[]={
0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,
0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F,//1,2,3,4,5,6,7,8,i
0xEE,0x44,0x6B,0xB4,0xF4,0x2D,
0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,
};
/*------------------------------------------------
uS延时函数,含有输入参数unsignedchart,无返回值
unsignedchar是定义无符号字符变量,其值的范围是
0~255这里使用晶振12M,精确延时请使用汇编,大致延时
长度如下T=tx2+5uS
------------------------------------------------*/
voidDelayUs2x(unsignedchart)
{
while(--t);
}
/*------------------------------------------------
mS延时函数,含有输入参数unsignedchart,无返回值
unsignedchar是定义无符号字符变量,其值的范围是
0~255这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
voidDelayMs(unsignedchart)
{
while(t--)
{
//大致延时1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
/*------------------------------------------------
节拍延时函数
各调1/4节拍时间:
调4/4125ms
调2/4250ms
调3/4187ms
------------------------------------------------*/
voiddelay(unsignedchart)
{
unsignedchari;
for(i=0;iDelayMs(250);
TR0=0;
}
/*------------------------------------------------
定时器0中断
------------------------------------------------*/
voidTIM0_ISR()interrupt1
{
TR0=0;
SPK=!
SPK;
TH0=Timer0_H;
TL0=Timer0_L;
TR0=1;
}
/*------------------------------------------------
歌曲处理函数
------------------------------------------------*/
voidSong()
{
TH0=Timer0_H;//赋值定时器时间,决定频率
TL0=Timer0_L;
TR0=1;//打开定时器
delay(Time);//延时所需要的节拍
}
/*------------------------------------------------
主函数
------------------------------------------------*/
voidmain(void)
{
unsignedchark,i;
TMOD|=0x01;//置定时器0工作方式1
EA=1;//打开全局中断
ET0=1;//打开定时0中断
while
(1)
{
i=0;
while(i<100)
{//音乐数组长度,唱完从头再来
k=MUSIC[i]+7*MUSIC[i+1]-1;//去音符振荡频率所需数据
Timer0_H=FREQH[k];
Timer0_L=FREQL[k];
Time=MUSIC[i+2];//节拍时长
i=i+3;
Song();
}
}
}
3、独立按键控制数码管显示
#include
#defineucharunsignedchar
sbitP2_0=P2^0;
sbitP2_1=P2^1;
sbitP2_2=P2^2;
sbitP2_3=P2^3;
sbitP3_2=P3^2;
sbitP3_3=P3^3;
sbitP3_4=P3^4;
sbitP3_5=P3^5;
sbitP3_6=P3^6;
sbitP3_7=P3^7;
ucharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,
0xf8,0x80,0x90};//数码管段码
ucharDisp_Num=0;
voiddelay(uchari)
{
ucharj,k;
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
voiddisplay(uchari)
{
P2_0=0;P2_1=1;P2_2=1;P2_3=1;
P0=table[0];
delay
(2);
P2_0=1;P2_1=0;P2_2=1;P2_3=1;
P0=table[0];
delay
(2);
P2_0=1;P2_1=1;P2_2=0;P2_3=1;
P0=table[0];
delay
(2);
P2_0=1;P2_1=1;P2_2=1;P2_3=0;
P0=table[i];
delay
(2);
}
/*演示主程序*/
voidmain(void)
{
unsignedinta;
P3_2=1;P3_3=1;P3_4=1;P3_5=1;P3_6=1;P3_7=1;//设置为输入
while
(1)
{
for(a=100;a>0;a--)
{
display(Disp_Num);
if(P3_2==0)
{
Disp_Num=0x06;
}
elseif(P3_3==0)
{
Disp_Num=0x05;
}
elseif(P3_4==0)
{
Disp_Num=0x04;
}
elseif(P3_5==0)
{
Disp_Num=0x03;
}
elseif(P3_6==0)
{
Disp_Num=0x02;
}
elseif(P3_7==0)
{
Disp_Num=0x01;
}
}
}
}
结语
这次课程设计终于顺利完成,在设计中遇到很多编程问题,从最初的选题和焊接电路板,我都认真的按照电路图进行仔细焊接,在这个星期之中我们通过参阅书籍及课本以及在老师的指导帮助下,终于游刃而解。
一次次调试与编译的失败没有使我感到气馁,反而增加我信心。
这次的单片机课程设计,我加深了对单片机理论知识的理解,将理论很好地应用到实际当中去,课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.
回顾起此次单片机课程设计,我仍感慨颇多。
的确,从选题到定稿,从理论到实践,在这段日子里,可以说得是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,从而提高自己的实际动手能力和独立思考的能以及独立的力。
在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,今后一定要吃透吃深。