电子技术应用课程设计
课题: 基于51单片机的彩灯制作
专业班级: 信息工程101 学生姓名: 胡晓桥 孙悦妍 学号: 1007100032 1007100014 指导老师: 高星辉 刘外喜 日期: 2012年9月 24日-9月28日
一.系统描述 1.实验目的
为掌握和熟悉STC80C51 4个I/O口的应用及对I/O的一般控制方法,了解4094芯片的8位串行输入转为8位并行输出的工作方式,利用STC80C51 4个I/O口实现32个LED控制和用P3.1、P3.2、P1.0及4094实现串口控制8个彩灯。通过完成这一包括电路设计和程序开发的完整过程,了解开发一单片机应用系统的全过程,为今后的设计打下基础。
2.硬件分析
STC80C51共有4个I/O口,可控制32个彩灯,在实现过程中要控制的彩灯分为4个部分,每一部分均由8个彩灯组成。第1部分由P0口控制;第2部分由P1口控制;第3部分由P2口控制;第4部分由P3口控制。另外8个彩灯由以P3.0、P3.1、P1.0控制的4094芯片组成的电路控制,这两组彩灯分别由两个程序控制,各不影响。
在并口控制彩灯的实现中,由于芯片STC80C51供电能力有限,所以在单片机控制的彩灯处各加上拉电阻,以防供电能力不足而导致的电路设计缺陷。
在串口控制彩灯的实现中,P3.0为数据输入口,P3.1为时钟输入口,驱动P3.0口的数据到4094芯片。4094为串口数据输入转换为8位并口数据输出。P1.O为4094串口输入转变为数据输出的使能控制,当P1.0为高电平时,4094串口输入变为并口输出;P1.0为低电平时,4094输出的数据不变。同样,4094控制的彩灯也各加上拉电阻。
由于STC80C51 4个I/O的每个串口都有对彩灯的控制,同时P3.0、P3.1、P1.0又对串口8个彩灯控制,P3.0、P3.1、P1.0在实现功能控制中有冲突,所以在这次彩灯设计中采用了一个跳线功能(相当于一个二路开关功能)。当开关打到一端时,P3.0、P3.1、P1.0控制并口彩灯;而当开关打到另一端时,P3.0、P3.1、P1.0控制串口彩灯,所以实现过程中采取的是两个主程序,以实现其功能。
3.电路设计
STC80C51 4个I/O分别对应控制32个LED彩灯,4094芯片将串口数据输入转换为8位并口数据输出。为保护这两个IC片,我们增加了一个稳压模块,将输入电压范围为6~9V稳定在5V左右。
二.电路原理图
1
1.系统硬件框图
2.系统原理图设计
复位电路 晶振电路 单 稳压电路 片 机 LED驱动及显示电路
Proteus 仿真原理图 3.PCB布线设计
2
三.单片机彩灯控制应用程序设计
程序流程图
并口控制彩灯程序流程图 串口控制彩灯程序流程图
四、调试与测试
画完PCB图并印刷电路板之后,我们便开始焊接元件和调试。刚开始通电时,发现所有LED灯都不亮,包括稳压模块的指示灯。通电几分钟后,稳压块和STC80C51都开始发烫,我们急忙关掉电源,检查电路。后来发现是稳压模块并没有接在电源的入口处,于是我们改正后,又重新接上
3
电源,这回LED彩灯终于绽放了它的光彩。可是,还是有些美中不足,有些LED灯光芒很微弱甚至不亮,我们猜测是焊接得不好或者是虚焊,于是又重新把不亮的LED灯重新焊接。之后再进行调试,LED彩灯果真按着程序闪动变换。
五、成品图片
4
附1.元件清单:
名称 STC80C51单片机 4094芯片 LED灯 电阻 电容 电解电容 稳压块 开关 电源插口 覆铜板 排针、电线 总计 数量 2 1 41 41 2 2 1 1 1 1 若干 价格(元) 11 1.5 3 2 0.4 0.4 1 0.4 0.5 7 1 28.2 附2.系统详细软件代码:
1.彩灯并口程序
//*************包含的头文件**************** #include
5
//*************变量定义**************** #define DELAY_TIME 550
unsigned char change,change1,change2; unsigned char i,j; sbit P00=P0^0; sbit P01=P0^1; sbit P02=P0^2; sbit P03=P0^3; sbit P04=P0^4; sbit P05=P0^5; sbit P06=P0^6; sbit P07=P0^7; sbit P17=P1^7; sbit P27=P2^7; sbit P32=P3^2; sbit P33=P3^3; sbit P34=P3^4; sbit P35=P3^5; sbit P36=P3^6; sbit P37=P3^7;
//*************函数声明**************** void de_lay(void); void lig_rotate1(void); void lig_rotate0(void); void lig_circle(void); void lig_jump(void); void lig_circle_light(void); void lig_all_put_out(void); void Delay_us(int time); void Delay_ms(int time);
6
//*************主程序开始**************** void main() {
while(1) { }
//************使彩灯由P0.0-P3.7顺时针依次点亮***************** void lig_rotate0(void) {
change=0xff; }
lig_all_put_out(); Delay_ms(200); lig_rotate0(); lig_rotate1(); for(j=0;j<5;j++)
lig_circle();
for(j=0;j<4;j++)
lig_jump();
for(j=0;j<4;j++) { }
for(j=0;j<4;j++)
lig_jump(); lig_circle_light(); lig_all_put_out();
for(i=0;i<=7;i++) {
change<<=1; P0=change;
7
Delay_ms(DELAY_TIME);
}
change=0xff;
for(i=0;i<=7;i++) {
change>>=1;
P2=change;
Delay_ms(DELAY_TIME);
}
change=0xff; }
//*************使彩灯由P0.0-P3.7顺时针依次熄灭**************** void lig_rotate1(void) {
for(i=0;i<=7;i++) { }
change=0xff; for(i=0;i<=7;i++) { }
change>>=1; P1=change;
Delay_ms(DELAY_TIME); change>>=1; P3=change;
Delay_ms(DELAY_TIME);
P00=1;
Delay_ms(DELAY_TIME); P01=1;
8
Delay_ms(DELAY_TIME); P02=1;
Delay_ms(DELAY_TIME); P03=1;
Delay_ms(DELAY_TIME); P04=1;
Delay_ms(DELAY_TIME); P05=1;
Delay_ms(DELAY_TIME); P06=1;
Delay_ms(DELAY_TIME); P07=1;
Delay_ms(DELAY_TIME); change=0x00;
for(i=0;i<=7;i++) { change>>=1; change+=0x80; P2=change;
Delay_ms(DELAY_TIME);
}
change=0x00;
for(i=0;i<=7;i++) {
change>>=1; change+=0x80; P3=change;
Delay_ms(DELAY_TIME);
}
change=0x00;
9
}
for(i=0;i<=7;i++) { }
change>>=1; change+=0x80; P1=change;
Delay_ms(DELAY_TIME);
//***********使P0,P1,P2,P3分别控制的所有的灯顺时针点亮************* void lig_circle(void) { }
//*************彩灯间隔点亮****************** void lig_jump(void) {
10
change1=0xaa; change2=0x55; P0=0x00;
Delay_ms(DELAY_TIME); P0=0xff; P2=0x00;
Delay_ms(DELAY_TIME); P2=0xff; P3=0x00;
Delay_ms(DELAY_TIME); P3=0xff; P1=0x00;
Delay_ms(DELAY_TIME); P1=0xff;
}
P1=P3=0xaa; P2=P0=0x55; Delay_ms(900); P1=P3=0x55; P2=P0=0xaa; Delay_ms(900);
//***********使P0,P1,P2,P3分别控制的所有的灯逆时针点亮****************** void lig_circle_light(void) { }
//************熄灭所有的灯**************** void lig_all_put_out(void) { }
11
change1=0xaa; change2=0x55; P1=0x00;
Delay_ms(DELAY_TIME); P1=0xff; P3=0x00;
Delay_ms(DELAY_TIME); P3=0xff; P2=0x00;
Delay_ms(DELAY_TIME); P2=0xff; P0=0x00;
Delay_ms(DELAY_TIME); P0=0xff;
P1=P2=P3=P0=0xff;
//************us时间延时*************** void Delay_us(int time) { }
//*************ms时间延时*************** void Delay_ms(int time) { }
//*************彩灯串口程序***************** //*************包含的头文件***************** #include
//*************宏定义***************** #define uchar unsigned char #define DELAY_TIME 600
//************函数声明****************** void Effect1(void); void Effect2(void); void Effect3(uchar n); void Effect4(void); void lig_put_out(void); void Init_Programme(void); void Delay_us(int time); void Delay_ms(int time);
//*************变量声明***************** uchar change,change1,change2; sbit P10=P1^0; uchar i,j;
12
while(time--)_nop_();
while(time--)Delay_us(20);
//**************主函数**************** void main() { Init_Programme(); while(1) { Effect1(); Effect2(); Effect3(5); Effect4();
}
}
//*************小灯渐亮***************** void Effect1(void) { change=0xff; for(i=0;i<=7;i++) { change<<=1; SBUF=change; TI=0; while(!TI); P10=1; P10=0;
Delay_ms(DELAY_TIME);
}
lig_put_out();
}
//*************小灯渐灭***************** void Effect2(void)
13
{ }
//*************小灯间隔亮与灭***************** void Effect3(uchar n) {
change=0x00; for(i=0;i<=7;i++) { }
lig_put_out();
change>>=1; change+=0x80; SBUF=change; TI=0; while(!TI); P10=1; P10=0;
Delay_ms(DELAY_TIME);
change=0x55; change1=0xaa; for(i=0;i SBUF=change; TI=0; while(!TI); P10=1; P10=0; Delay_ms(DELAY_TIME); SBUF=change1; TI=0; 14 } } while(!TI); P10=1; P10=0; Delay_ms(DELAY_TIME); lig_put_out(); //**************小灯的混合效果**************** void Effect4(void) { int time=1000; change=change1=change2=0xfe; for(i=0;i<55;i++) { } change=0xfe; change1=0xff; for(i=0;i<=7;i++) { 15 SBUF=change; TI=0; while(!TI); P10=1; P10=0; change1<<=1; change2>>=7; change=change1|change2; change1=change2=change; time-=15; Delay_ms(time); for(j=0;j<5;j++) { SBUF=change; TI=0; while(!TI); P10=1; P10=0; Delay_ms(400); SBUF=change1; TI=0; while(!TI); P10=1; P10=0; Delay_ms(400); } } } change<<=1; Effect3(5); //**************程序的初始化**************** void Init_Programme(void) { SCON=0x00; ES=0; P10=0; SBUF=Oxff; TI=0; while(!TI); P10=1; P10=0; 16 } //**************熄灭所有的灯**************** void lig_put_out(void) { } //**************us时间延时**************** void Delay_us(int time) { } //***************ms时间延时*************** void Delay_ms(int time) { } while(time--)Delay_us(30); while(time--)_nop_(); SBUF=0xff; TI=0; while(!TI); P10=1; P10=0; 17