年 月 日
言……………………………………………………………2???1.1设计任务……………………………………………………….2??
1.设计要求……………………………………………………2?
课题综述………………………………………………………2?2.1课题的来源………………………………………………?2???2.2面对的问题……………………………………………………3??
2?系统分析………………………………………………………3
3.1?STC89C52单片机引脚图及引脚功能介绍…………………4
4系统设计………………………………………………………4?4.1硬件设计…………………………………………………4?4.1.1硬件框图……………………………………………………4?
4.1.详细设计硬件………………………………………………5
4.2软件设计………………………………………………………6
4.三、硬件原理图…………………………………………………7?4.4?元件清单………………………………………………………8
4.6代码编写………………………………………………………9
5心得体会…………………………………………………………9?
6致谢………………………………………………………………10?
参考文献…………………………………………………………11
单片机课程的设计主要是为了让我们提高STC89C51单片机电路的感性理解,加深对理论的理解。了解软硬件的相关知识,掌握软硬件的设计过程、方法和实现,为以后的设计和实现应用系统奠定良好的基础。此外,通过简单主题的设计实践,我们可以了解必须提交的工程文件,以巩固、丰富和综合运用所学知识来解决实际问题。
设计一个单片机控制的心形流水灯系统
(1)可实现多种的流水灯模式
(2)可通过红外遥控进行控制
当今社会,这种由单片机芯片控制各种硬件工作的技术也日益成熟,并普及在交通、化工、机械等各个领域。而流水灯这项技术在生活中的应用更是广泛,较为贴近生活。而流水灯控制的设计所需要的知识也正好吻合了我们本学期对于单片机这门课程的学习,所以设计流水灯控制的这个课题让我们对知识的学习和巩固都有了进一步的加深。
这次课程设计是通过STC89C52位单片机实现。但面对的问题却是两方面的:一个是软件的设计,也就是实现流水灯控制功能的程序编辑;另一个是硬件的设计,需要我们自己连接、焊接电路板。而更为严峻的就是设计的最后还要将软硬件相结合。
本次设计的目的在于加深STC89C52单片机的理解,首先来简单认识一下,它的引脚如图3-1所示: 图3.1 STC89C52
STC89C52引脚可以分为四个部分,各个引脚功能如下:
主电源引脚(2根)
• Vcc:电源输入,接+5V电源
GND:接地线
• 外接晶振引脚(2根)
XTAL1:片振荡电路的输入端
XTAL2:片振荡电路的输出端
• 控制引脚(4根)
RST/PROG:复位引脚,引脚上出现2个机器周期的高电平将使单片机复位。 ALE/VPP:地址锁存允许信号
PESN:外部存储器选通信号
EA/VPP:程序存储器的外部选通,接低电平从外部程序存储器读指令,如果接高电平则从部程序存储器读指令
• 可编程输入/输出引脚(32根) STC89C52单片机有4组8位的可编程I/O口,分别为P0、P1、P2、P3口,每个口有8位(8根引脚),共32根。
P0口:8位双向I/O口线
P1口:8位准双向I/O口线
P2口:8位准双向I/O口线
P3口:8位准双向I/O口线
按照单片机系统扩展与系统配置状况,单片机应用系统可分为最小系统、最小功耗系统及典型系统等。STC89C52单片机是本次课程设计运用的主要原件。流水灯控制设计是用一个带有多个发光二极管的单片机最小应用系统,即为由发光二极管、晶振、复位、电源等电路和必要的软件组成的单个单片机。从原理图中可以看出,如果要让接在P1、P2、P3、P0口的LED亮起来,那么只要把P2、P1、P3、P0口的电平变为低电平就可以了;因此,要实现流水灯功能,我们只要将发光二极管LED1~LED32依次点亮、熄灭,LED灯便会一亮一暗的做流水灯了。在此我们还应注意一点,由于人眼的视觉暂留效应以及单片机执行每条指令的时间很短,我们在控制二极管亮灭的时候应该延时一段时间,否则我们就看不到“流水”效果了。
(1)复位电路部分
当要对晶体重置时,只要对此引脚电平提升至高电平并保持两个及其周期以上的时间便能完成系统重置的各项动作,使得部特殊功能寄存器容均被设成已知状态。
(2)晶振部分
(3)红外接收头部分
单片机的应用系统由硬件和软件组成,在硬件原理图搭建完成上电之后,我们还不能看到流水灯循环点亮的现象,我们还需要编写程序控制单片机管脚电平的高低变化,来实现发光二极管的一亮一灭
红外遥控的工作原理
系统上电初始化后,对单片机的P3.3口进行检测,当其为高电平时,系统处于等待状态。当其为低电平时,将启动中断服务程序,实现接收数据帧。需要说明的是:数据帧采用中断方式进行接收,单片机在外中断1方式下工作。在数据帧接收时,将对所接收数据的前3位码的码宽进行验证。前3位码的码宽分别为4ms、2ms、4ms,若任意一位的码宽不满足要求,都将作为错误码处理,当系统接收到的高电平脉宽大于5ms时,结束脉冲接收。然后系统会对所接收脉冲的最后两位脉宽进行验证,其值应分别是2ms和4ms,否则将会作为错误码处理,最后系统根据累加器A中的脉冲个数,在单片机P0或P2口的某一对应引脚输出控制信号,同时在P1口输出相应的二进制数据。此时即完成一次数据的接收处理。HRM5700B接收8个编码时的输出信号波形如下图
红外接收头接收8个编码时的输出信号波形图
数据帧的接收处理
当红外线接收器输出脉冲帧数据时,第一位码的低电平将启动中断程序,实时接收数据帧。在数据接收时,先对第一位(起始位)码的码宽进行验证。若第一位低电平码的脉宽小于2ms,将作为错误码处理;否则认为是起始码,累加器A加1.当间隔位的高电平大于3ms时,结束接收,然后根据累加器A中的脉冲个数,执行相应的输出操作。图3-14为红外线接收器输出的一帧遥控码波形图。
遥控接收控制流程图
遥控接收中断流程图
中断过程:首先判断低电平脉宽度是否大于2ms,若脉宽不到2ms,中断返回;若低电平大于2ms,则接收并地低电平脉冲计数,接下来看判断高电平脉冲宽度是否大于3ms,若脉宽不到3ms,则返回上一接收计数过程;若高电平脉宽大于3ms,则按照脉冲个数至对应功能程序。此时中断返回。
#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit P0_0=P0^0;
sbit P0_1=P0^1;
sbit P0_2=P0^2;
sbit P0_3=P0^3;
sbit P0_4=P0^4;
sbit P0_5=P0^5;
sbit P0_6=P0^6;
sbit P0_7=P0^7;
sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit P1_2=P1^2;
sbit P1_3=P1^3;
sbit P1_4=P1^4;
sbit P1_5=P1^5;
sbit P1_6=P1^6;
sbit P1_7=P1^7;
sbit P3_0=P3^0;
sbit P3_1=P3^1;
sbit P3_3=P3^3;
sbit P3_4=P3^4;
sbit P3_5=P3^5;
sbit P3_6=P3^6;
sbit P3_7=P3^7;
sbit P2_0=P2^0;
sbit P2_1=P2^1;
sbit P2_2=P2^2;
sbit P2_3=P2^3;
sbit P2_4=P2^4;
sbit P2_5=P2^5;
sbit P2_6=P2^6;
sbit P2_7=P2^7;
uint pwm=99; //调节占空比变量
uint su=0;
uint vaule=0;
char moshi=0;
char lm=0;
uint sudu=60;
sbit hwx=P3^2; //红外接收数据引脚,
unsigned char ly_lhj[4]; //保存NEC的四个字节数据
bit ly_flag=0; //成功接收标志
void delay1(void){
unsigned char i=10;
while(i--);
}
void delay(unsigned int i)//延时函数
{
unsigned int a,b;
for(a=sudu;a>0;a--)
for(b=i;b>0;b--);
}
void dis1() //花样一函数
{
uchar j;
int time=70;
P2=0XFE;
delay(time);
for(j=0;j<7;j++)
{
P2=(P2<<1);
delay(time);
if(ly_flag==1){ly_flag=0;goto hm;}
}
P3_0=0;
delay(time);
P3_1=0;
delay(time);
P3_3=0;
delay(time);
if(ly_flag==1){ly_flag=0;goto hm;}
P3_4=0;
delay(time);
P3_5=0;
delay(time);
P3_6=0;
delay(time);
if(ly_flag==1){ly_flag=0;goto hm;}
P3_7=0;
delay(time);
P0=0XFE;
delay(time);
for(j=0;j<7;j++)
{
P0=(P0<<1);
delay(time);
if(ly_flag==1){ly_flag=0;goto hm;}
}
P1=0XFE;
delay(time);
for(j=0;j<7;j++)
{
P1=(P1<<1);
delay(time);
if(ly_flag==1){ly_flag=0;goto hm;}
}
delay(1000);
if(ly_flag==1){ly_flag=0;goto hm;}
delay(1000);
if(ly_flag==1){ly_flag=0;goto hm;}
delay(1000);
if(ly_flag==1){ly_flag=0;goto hm;}
delay(1000);
hm:;
}
void dis2()
{
char j,aa;
int time=100;
aa=0x80;
for(j=0;j<7;j++)
{
P1=aa;
delay(time);
aa=_cror_(aa,1);
aa=aa | 0x80;
if(ly_flag==1){ly_flag=0;goto hm;}
}
P1=0XFF;
aa=0x80;
for(j=0;j<7;j++)
{
P0=aa;
delay(time);
aa=_cror_(aa,1);
aa=aa | 0x80;
if(ly_flag==1){ly_flag=0;goto hm;}
}
P0=0XFF;
P3_7=1;
delay(time);
P3_6=1;
delay(time);
P3_5=1;
delay(time);
P3_4=1;
delay(300);
if(ly_flag==1){ly_flag=0;goto hm;}
P3_3=1;
delay(time);
P3_1=1;
delay(time);
P3_0=1;
delay(time);
if(ly_flag==1){ly_flag=0;goto hm;}
aa=0x80;
for(j=0;j<7;j++)
{
P2=aa;
delay(time);
aa=_cror_(aa,1);
aa=aa | 0x80;
if(ly_flag==1){ly_flag=0;goto hm;}
}
P2=0XFF;
hm:;
}
void dis3()
{
uchar j;
P2=0XFE;
delay(100);
for(j=0;j<7;j++)
{
P2=(P2<<1)|0X01;
delay(100);
if(ly_flag==1){ly_flag=0;goto hm;}
}
P2=0XFF;
P3_0=0;
delay(100);
P3_0=1;
P3_1=0;
delay(100);
P3_1=1;
P3_3=0;
delay(100);
P3_3=1;
P3_4=0;
delay(100);
if(ly_flag==1){ly_flag=0;goto hm;}
P3_4=1;
P3_5=0;
delay(100);
P3_5=1;
P3_6=0;
delay(100);
P3_6=1;
P3_7=0;
delay(100);
P3_7=1;
if(ly_flag==1){ly_flag=0;goto hm;}
P0=0XFE;
delay(100);
for(j=0;j<7;j++)
{
P0=(P0<<1)|0X01;
delay(100);
if(ly_flag==1){ly_flag=0;goto hm;}
}
P0=0XFF;
P1=0XFE;
delay(100);
for(j=0;j<7;j++)
{
P1=(P1<<1)|0X01;
delay(100);
if(ly_flag==1){ly_flag=0;goto hm;}
}
P1=0XFF;
hm:;
}
void dis4()
{
char j;
P2=0X00;
delay(300);
P3_0=0;
P3_1=0;
P3_3=0;
P3_4=0;
P3_5=0;
P3_6=0;
P3_7=0;
delay(300);
if(ly_flag==1){ly_flag=0;goto hm;}
P0=0X00;
delay(300);
P1=0X00;
delay(300); //
for(j=0;j<6;j++)
{
P0=0XFE;
P1=0XFF;
P2=0X00;
P3_0=0;
P3_1=0;
P3_3=0;
P3_4=0;
P3_5=0;
P3_6=0;
P3_7=0;
delay(300);
if(ly_flag==1){ly_flag=0;goto hm;}
P0=0X01;
P1=0X00;
P2=0XFF;
P3_0=1;
P3_1=1;
P3_3=1;
P3_4=1;
P3_5=1;
P3_6=1;
P3_7=1;
delay(300);
}
hm:;
}
void dis5()
{
char i;
int time=200;
P0=0XFF;
P3=0XFF;
for(i=0;i<12;i++)
{
P2=0XFD;
P1=0X7F;
delay(time);
P2=0XFB;
P1=0XBF;
delay(time);
P2=0XF7;
P1=0XDF;
delay(time);
if(ly_flag==1){ly_flag=0;goto hm;}
P2=0XEF;
P1=0XEF;
delay(time);
P2=0XDF;
P1=0XF7;
delay(time);
P2=0XBF;
P1=0XFB;
delay(time);
if(ly_flag==1){ly_flag=0;goto hm;}
P2=0X7F;
P1=0XFD;
delay(time);
P2=0XFF;
P3=0XFE;
P1=0XFE;
delay(time);//
P1=0XFF;
P3=0XFD;
P0=0X7F;
delay(time);
if(ly_flag==1){ly_flag=0;goto hm;}
P3=0XF7;
P0=0XBF;
delay(time);
P3=0XEF;
P0=0XDF;
delay(time);
P3=0XDF;
P0=0XEF;
delay(time);
if(ly_flag==1){ly_flag=0;goto hm;}
P3=0XBF;
P0=0XF7;
delay(time);
P3=0X7F;
P0=0XFB;
delay(time);
P3=0XFF;
P0=0XFC;
delay(time);
P0=0XFF;
if(i<4)time=time-40;
}
hm:;
}
void dis6()
{
char j;
int time=200;
for(j=0;j<12;j++)
{
P0=0XFC;//
P2=0XFD;//P21
P1=0X7F;//P17
delay(time);
P3=0X7F;//P37
P0=0XFB;//P02
P2=0XFB;//P22
P1=0XBF;//P16
delay(time);
P3=0XBF;//P36
P0=0XF7;//P03
P2=0XF7;//P23
P1=0XDF;//P15
delay(time);
if(ly_flag==1){ly_flag=0;goto hm;}
P3=0XDF;//P35
P0=0XEF;//P04
P2=0XEF;//P24
P1=0XEF;//P14
delay(time);
P3=0XEF;//P34
P0=0XDF;//P05
P2=0XDF;//P25
P1=0XF7;//P13
delay(time);
P3=0XF7;//P33
P0=0XBF;//P06
P2=0XBF;//P26
P1=0XFB;//P12
delay(time);
if(ly_flag==1){ly_flag=0;goto hm;}
P3=0XFD;//P31
P0=0X7F;//P07
P2=0X7F;//P27
P1=0XFD;//P11
delay(time);
P2=0XFF;
P0=0XFF;
P1=0XFE;//P10
P3=0XFE;//P30
delay(time);
P1=0XFD;//P11
P2=0X7F;//P27
P0=0X7F;//P07
P3=0XFD;//P31
delay(time);
if(ly_flag==1){ly_flag=0;goto hm;}
P1=0XFB;//P12
P2=0XBF;//P26
P3=0XF7;//P33
P0=0XBF;//P06
delay(time);
P1=0XF7;//P13
P2=0XDF;//P25
P3=0XEF;//P34
P0=0XDF;//P05
delay(time);
P1=0XEF;//P14
P2=0XEF;//P24
P3=0XDF;//P35
P0=0XEF;//P04
delay(time);
if(ly_flag==1){ly_flag=0;goto hm;}
P1=0XDF;//P15
P2=0XF7;//P23
P3=0XBF;//P36
P0=0XF7;//P03
delay(time);
P1=0XBF;//P16
P2=0XFB; //P22
P3=0X7F;//P37
P0=0XFB;//P02
delay(time);
P1=0X7F;//P17
P2=0XFD;//P21
P3=0XFF;//
P0=0XFC;
delay(time);
P1=0XFF;//P17
P2=0XFF;//P21
P0=0XFF;
if(j<4)time=time-40;
}
hm:;
}
void dis7()
{
char j;
int time=70;
for(j=0;j<3;j++)
{
P0=0XFC;
delay(time);
P3=0X7F;
P0=0XF8;
delay(time);
P3=0X3F;
P0=0XF0;
delay(time);
P3=0X1F;
P0=0XE0;
delay(time);
P3=0X0F;
P0=0XC0;
delay(time);
P3=0X07;
P0=0X80;
delay(time);
P3=0X05;
P0=0X00;
delay(time);//
if(ly_flag==1){ly_flag=0;goto hm;}
P3=0X04;
P1=0XFE;
delay(time);
P2=0X7F;
P1=0XFC;
delay(time);
P2=0X3F;
P1=0XF8;
delay(time);
P2=0X1F;
P1=0XF0;
delay(time);
P2=0X0F;
P1=0XE0;
delay(time);
P2=0X07;
P1=0XC0;
delay(t