搜索
您的当前位置:首页正文

燕山大学单片机课设设计可控流水灯(c语言)

来源:筏尚旅游网
燕⼭⼤学单⽚机课设设计可控流⽔灯(c语⾔)

⽬录⼀、引⾔⼆、课题综述2.1 课题的来源2.2 课题的意义2.3 课题的⽬标2.4 课题的技术三、系统分析

3.1 80C51单⽚机的基本组成

3.2 80C51单⽚机引脚图及引脚功能介绍3.3 解决问题的基本思路3.4 解决问题的总体⽅案四、硬件组成4.1 晶振震荡电路4.2 按键复位电路4.3 电源电路4.4 独⽴按键电路4.5 ⼋位跑马灯电路4.6 彩灯的总驱动电路五、代码编写六、程序调试七、结论⼋、参考⽂献⼀、引⾔

单⽚机课程设计主要是为了让我们增进对单⽚机芯⽚电路的感性认识,加深对理论⽅⾯的理解。了解软硬件的有关知识,并掌握软硬件设计过程、⽅法及实现,为以后设计和实现应⽤系统打下良好基础。另外,通过简单课题的设计练习,使我们了解必须提交的各项⼯程⽂件,达到巩固、充实和综合运⽤所学知识解决实际问题的⽬的。⼆.课题综述2.1 课题的来源

当今社会,随着科学技术的进步和电⼦产业的迅猛发展,这种由单⽚机芯⽚控制各种硬件⼯作的技术也⽇益成熟,并普及在交通、化⼯、机械等各个领域。⽽流⽔灯这项技术在⽣活中的应⽤更是⼴泛,较为贴近⽣活。⽽流⽔灯控制的设计所需要的知识也正好吻合了我们本学期对于单⽚机这门课程的学习,所以设计流⽔灯控制的这个课题让我们对知识的学习和巩固都有了进⼀步的加深。2.2 课题的意义

这次单⽚机课程设计是为了通过对单⽚机编程设计控制LED灯流⽔闪亮的设计加强学⽣团队配合的能⼒和创造⼒;综合运⽤专业及基础知识,解决实际⼯程技术问题的能⼒。能够让学⽣深⼊真是的体会到所学的理论知识和实践相结合的过程,并融⼊的所学知识的海洋⾥,从中找出⾃⾝的不⾜并加以改正。2.3 预期的⽬标

对8个LED灯设计⼏种流⽔灯显⽰⽅式,⽤按键进⾏⽅式选择,并⽤⼀个按键就控制流⽔灯流动的速度;2.5 课题的技术

通过编程达到LED灯的显⽰⽅式、模式切换按钮的控制、亮灯速度的按键控制等技术。三、系统分析

3.1 8051单⽚机的基本组成1、中央处理器(CPU)

中央处理器是单⽚机的核⼼,完成运算和控制功能。有运算电路和控制电路,其中控制电路是单⽚机的指挥控制部件,保证单⽚机各部分能⾃动⽽协调的⼯作。例如定时控制电路和振荡电路均属于控制电路。单⽚机执⾏程序就是在控制电路的控制下进⾏的。⾸先从程序存储器读出指令,送指令寄存器保存;然后送指令译码器进⾏译码,译码结果送定时控制电路,有定时控制逻辑产⽣各种定时信号和控制信号;再送到系统的各个部件去控制相应的操作。这就是执⾏⼀条指令的全过程,⽽执⾏程序就是不断地重复这⼀过程。2 、内部数据存储器(内部RAM)

8051芯⽚中共有256个RAM单元,通常把这256个单元按其功能划分为两部分:低128单元(单元地址00H~7FH)和⾼128单元(单元地址80H~FFH)。内部RAM的⾼128单元是供给专⽤寄存器使⽤的,其单元地址为80H~FFH。因这些寄存器的功能已作专门规定,故称之为专⽤寄存器(Special Function Register),也可称为特殊功能寄存器SFR区。但⾼128单元被专⽤寄存器占⽤,能作为寄存器

供⽤户使⽤的只是低128单元,⽤于存放可读写的数据。因此通常所说的内部数据存储器就是指前128单元,简称内部RAM。⽚内低128字节RAM是⽤户真正可以存取随机数据的数据存储器,其地址为00H-7FH。

3、内部程序存储器(内部ROM)

8051共有4 KB掩膜ROM,⽤于存放程序、原始数据或表格,因此,称之为程序存储器,简称内部ROM。它的⽚内ROM地址为0000H~0FFFH(4KB),它的⽚外ROM最⼤容量可为0000H~FFFFH。⽚内与⽚外ROM在低4KB地址出现重叠,这种重叠的区分由8051的管脚EA进⾏控制。还有⼀组特殊单元是0003H~002AH,共40个单元。这40个单元被均匀地分为5段,作为5个中断源的中断地址区。中断响应后,按中断种类,⾃动转到各中断区的⾸地址去执⾏程序,因此在中断地址区中理应存放中断服务程序。但通常情况下,8个单元难以存下⼀个完整的中断服务程序,因此通常也是从中断地址区⾸地址开始存放⼀条⽆条件转移指令,以便中断响应后,通过中断地址区,再转到中断服务程序的实际⼊⼝地址。4、定时/计数器

8051共有两个16位的定时/计数器,以实现定时或计数功能,并以其定时或计数结果对计算机进⾏控制。5 、并⾏I/O⼝

8051共有4个8位的I/O⼝(P0、P1、P2、P3),以实现数据

的并⾏输⼊/输出。每个⼝都包含⼀个锁存器、⼀个输出驱动器和输⼊缓冲器。实际上,它们已被归⼊专⽤寄存器之列,并且具有字节寻址和位寻址功能。在访问⽚外扩展存储器时,低8位地址和数据由P0⼝分时传送,⾼8位地址由P2⼝传送。在⽆⽚外扩展存储器的系统中,这4个⼝的每⼀位均可作为双向的I/O端⼝使⽤。

6、串⾏⼝

MCS-51单⽚机有⼀个全双⼯的串⾏⼝,以实现单⽚机和其它设备之间的串⾏数据传送。该串⾏⼝功能较强,既可作为全双⼯异步通信收发器使⽤,也可作为同步移位器使⽤。7、中断控制系统

MCS-51单⽚机的中断功能较强,以满⾜控制应⽤的需要。8051共有5个中断源,即外中断两个,定时/计数中断两个,串⾏中断⼀个。全部中断分为⾼级和低级共两个优先级别。3.2 、 80C51单⽚机引脚图及引脚功能介绍XTAL218XTAL119ALE 30EA31

PSEN 29RST9

P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427P1.01P1.12P1.23P1.3P3.0/RXD 10P3.1/TXD 11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD17

P3.6/WR 16P3.5/T115U280C51

80C51有40条引脚,共分为端⼝线、电源线和控制线三类。 1.端⼝线(4×8 = 32条):I/O 端⼝:P0、P1、P2、P3⼝,共32个引脚。

P3⼝还具有第⼆功能,⽤于特殊信号输⼊输出和控制信号(属控制总线)。2.电源线(2条):

VCC 为+5V 电源线,VSS 为接地线。 3.控制线(6条):(1)ALE/P R O G ——————

:地址锁存允许/编程线 ALE 功能:⽤来锁存P0⼝送出的低8位地址P R O G ——————

功能:⽚内有EPROM 的芯⽚,在EPROM 编程期间,此引脚输⼊编程脉冲。

(2) PSEN:外ROM 读选通信号。 (3)RST/VPD:复位/备⽤电源。 RST (Reset )功能:复位信号输⼊端。 VPD 功能:在Vcc 掉电情况下,接备⽤电源。 (4)E A ———/Vpp:内外ROM 选择/⽚内EPROM 编程电源。E A ———

功能:内外ROM 选择端。

Vpp 功能:⽚内有EPROM 的芯⽚,在EPROM 编程期间,施加编程电源Vpp 。 4.I/O 线(5)XTAL1、XTAL2 :晶体振荡电路反相输⼊端和输出端。 3.3 解决问题的基本思路

通过按键来控制流⽔灯的流动⽅式,⽤⼀个按键来控制流⽔灯的流动速度,控制流动速度的程序是利⽤中断程序来实现的 3.4系统总体设计⽅案在做此设计时,应先确定其系统框架,以下便是此设计的系统框图。图1 系统框图

从图1中可以看出,如果要让接在P1.0⼝的LED1亮起来,那么只要把P1.0⼝的电平变为低电平就可以了;相反, 如果要接在P1.0⼝流⽔灯8051电源

的LED1熄灭,就要把P1.0⼝的电平变为⾼电平;同理,接在P1.1~P1.7⼝的其他7个LED的点亮和熄灭的⽅法同LED1。因此,要实现流⽔灯功能,我们只要将发光⼆极管LED1~LED8依次点亮、熄灭,8只LED灯便会⼀亮⼀暗的做流⽔灯了。四、硬件组成

按照单⽚机系统扩展与系统配置状况,单⽚机应⽤系统可分为最⼩系统、最⼩功耗系统及典型系统等。AT89C51单⽚机是美国ATMEL 公司⽣产的低电压、⾼性能CMOS 8位单⽚机,具有丰富的内部资源:4kB闪存、128BRAM、32根I/O⼝线、2个16位定时/计数器、5个向量两级中断结构、2个全双⼯的串⾏⼝,具有4.25~5.50V的电压⼯作范围和0~24MHz⼯作频率,使AT89C51单⽚机时⽆须外扩存储器。因此,本流⽔灯实际上就是⼀个带有⼋个发光⼆极管的单⽚机最⼩应⽤系统,即为由发光⼆极管、晶振、复位、电源等电路和必要的软件组成的单个单⽚机。,

4.1 、晶振震荡电路

图2

1 时钟信号的产⽣

在MCS-51芯⽚内部有⼀个⾼增益反相放⼤器,其输⼊端为芯⽚引脚XTAL1,其输出端为引脚XTAL2 。⽽在芯⽚的外部,XTAL1和XTAL2之间跨接晶体振荡器和微调电容,从⽽构成⼀个稳定的⾃激振荡器,这就是单⽚机的时钟电路,如图3所⽰。

时钟电路产⽣的振荡脉冲经过触发器进⾏⼆分频之后,才成为单⽚机的时钟脉冲信号。⼀般地,电容C1和C2取30 pF左右,晶体的振荡频率范围是1.2~12 MHz。晶体振荡频率⾼,则系统的时钟频率也⾼,单⽚机运⾏速度也就快。再此wo选⽤振荡频率为12 MHz的晶振。2. 时序

时序是⽤定时单位来说明的。MCS-51的时序定时单位共有4个,从⼩到⼤依次是:节拍、状态、机器周期和指令周期。下⾯分别加以说明。1) 节拍与状态

把振荡脉冲的周期定义为节拍(⽤P表⽰)。振荡脉冲经过⼆分频后,就是单⽚机的时钟信号的周期,其定义为状态(⽤S表⽰)。这样,⼀个状态就包含两个节拍,具前半周期对应的拍节叫节拍1(P1),后半周期对应的节拍叫节拍2(P2)。2) 机器周期

MCS-51采⽤定时控制⽅式, 因此它有固定的机器周期。规定⼀

个机器周期的宽度为6个状态,并依次表⽰为S1~S6。由于⼀个状态⼜包括两个节拍,因此,⼀个机器周期总共有12个节拍,分别记作S1P1、S1P2、…、S6P2。由于⼀个机器周期共有12个振荡脉冲周期, 因此机器周期就是振荡脉冲的⼗⼆分频。

当振荡脉冲频率为12 MHz时,⼀个机器周期为1µs;当振荡脉冲频率为6 MHz时,⼀个机器周期为2µs。本设计采⽤的晶振频率为12MHz。3) 指令周期

指令周期是最⼤的时序定时单位, 执⾏⼀条指令所需要的时间称为指令周期。它⼀般由若⼲个机器周期组成。不同的指令,所需要的机器周期数也不相同。通常,包含⼀个机器周期的指令称为单周期指令,包含两个机器周期的指令称为双周期指令,等等指令的运算速度与指令所包含的机器周期有关,机器周期数越少的指令执⾏速度越快。

单⽚机执⾏任何⼀条指令时都可以分为取指令阶段和执⾏指令阶段。ALE引脚上出现的信号是周期性的,在每个机器周期内出现两次⾼电平。第⼀次出现在S1P2和S2P1期间,第⼆次出现在S4P2和S5P1期间。ALE信号每出现⼀次,CPU就进⾏⼀次取指操作,但由于不同指令的字节数和机器周期数不同,因此取指令操作也随指令不同⽽有⼩的差异。4.2按键复位电路

图3

复位是单⽚机的初始化操作,其主要红能是把程序计数器PC内容初始化为0000H,也就是使单⽚机从0000H单元开始执⾏程序,同时使CPU和系统中的其他功能部件都处在⼀个确定的初始状态,并从这个状态开始⼯作。8051单⽚机采⽤两种复位⽅式:⼀种是加电⾃动复位,另⼀种为⼿动按键复位。

单⽚机复位的条件是:必须使RST/VPD 或RST引(9)加上持续两个机器周期(即24个振荡周期)的⾼电平。2µs以上时间的⾼电平,在RST引脚出现⾼电平后的第⼆个机器周期执⾏复位。上电复位电路是通过外部复位电路的电容充电来实现的,在电源Vcc的上升时间不超过1ms就可以实现⾃动上电复位,即接通电源就完成了系统的复位初始化。在接电瞬间,RESET端的电位与VCC相同,随着充电电流的减少,RESET的电位逐渐下降。只要保证RESET为⾼电平的时间⼤于两个机器周期,便能正常复位。⼿动按键复位要求在电源接通的条件下,⽤按键开关操作使但单⽚机复位,如图3所⽰。4.3 电源电路

4.4独⽴按键电路

通过独⽴按键来控制流⽔的的流动⽅式4.5⼋位跑马灯电路

4.6彩灯的总驱动电路

五、代码编写总程序#include

#define uint unsigned int #define uchar unsigned char void si();void san();void wu();void jiu();void liu();void qi();void delay(uint);sbit key1=P3^5;sbit key2=P3^4;sbit key3=P3^3;sbit key4=P3^2;uchar temp;uchar temp2;uchar temp3;uchar temp4;uchar temp5;uchar temp6;uint l;uint e;uint a;uint b;uint c;uint d;uint f;uint g;uint h;uint j;uint k;

void main(){

EA=1; //允许打开总中断EX0=1;EX1=1;IT0=0;IT1=1;e=0;P3=0xff;while(1){

if(key1==0) //按下key1键{

e++; //每按下⼀次e⾃加⼀次if( e>3) e=1; //如果e>3时,把e置为1switch(e){

case 1:san(); // 当e=1时执⾏⼦程序san() break;case 2:liu() ; //当e=2时执⾏⼦程序si()break;

case 3: qi(); //当e=3时执⾏⼦程序qi()break;}}

if(key2==0){

wu(); } //当按下key2键后执⾏⼦程序wu()}}

void san(){uchar

table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};for(a=0;a<15;a++){

temp=table[a];P1=temp;delay(l);}}void wu(){uchar

table2[]={0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xc3,0x81,0x00 };for(c=0;c<10;c++){

temp3=table2[c];P1=temp3;delay(l);}}void liu(){uchar

table4[]={0x88,0xcc,0xee,0xff,0xee,0xcc,0x88,0x00 };for(f=0;f<8;f++){

temp5=table4[f];

P1=temp5;delay(l);}}void qi(){

uchar table5[]={0x3f,0x0f,0x03,0x00};for(g=0;g<4;g++){

temp6=table5[g];P1=temp6;delay(l);}}

void jiu() interrupt 0 //外部中断0,当key4键按下后程序跳转到外部中断 0程序中,当中断程序运⾏完后继续进⾏未完成的程序{Uchar

table3[]={0x00,0xff,0x00,0xff,0xe7,0xff,0xe7,0xff,0xc3,0xff ,0xc3,0xff,0x81,0xff,0x81,0xff};P3=0xff;delay(h);for(d=0;d<16;d++){

temp4=table3[d];P1=temp4;delay(l);}delay(l) ;}

void shi() interrupt 2 //外部中断1 控制流⽔灯的流动速度 { //当key3键按下后h⾃加,当h>3后,h ⾃动置为0h++;if(h>3)h=0;

因篇幅问题不能全部显示,请点此查看更多更全内容

Top