基于STC-C51的流水灯的设计与实现
一、设计目的
以STC-80C51单片机最小系统为核心,设计多样式流水灯。掌握外围LED电路的设计方法,熟练掌握C51软件编程控制方法,实现LED闪烁功能,最终完成单片机的应用与外围电路的开发任务。 二、设计任务
首先以STC-80C51单片机原理图为蓝本,焊接单片机最小系统板并上电测试成功;其次在最小板的开发区焊接LED电路并测试成功;最后用keil C编程软件及STC-ISP下载软件完成STCC51单片机对外围流水灯设计的整体控制。 三、设计需求
整个流水灯系统由按键控制,实现各种状态之间的转换,即按键第一次压下,流水灯进入到第一种状态;按键第二次压下,流水灯进入到第二种状态;以此类推。 四、设计材料
序号 1 2 4 5 6 7 器件 STC-C52单片机最小系统板 LED发光二极管 微动开关 1200Ω 导线 焊锡丝 数量 1 16 1 17 1m 1 功能 核心 灯显 按键 LED上拉电阻 辅助材料 辅助材料
开放与创新实验_流水灯设计报告
流水灯控制系统设计
摘要:
本系统由单片机系统、外中断键盘(微动开关)、发光二极管等部分组成。系统能够实现以下功能:
1. 灯阵从由下顶点开始,同时从两边向上延伸点亮。 2. 灯阵从由上顶点开始,同时从两边向下延伸点亮。
3. 灯阵从由下顶点开始,以逆时针依次点亮,最后回到下顶点。 4. 灯阵从由下顶点开始,以顺时针依次点亮,最后回到下顶点。 5. 先奇数灯点亮,然后偶数灯点亮,呈交替状态。 6. 所有灯先同时点亮,后同时熄灭,呈闪烁状态。 7. 以上六种状态依次运行。
以上七种运行方式,由外部中断(微动开关)控制,即一次中断运行状态1,两次中断运行状态2,… 当遇到第八此中断时,再次从状态1开始。
整个系统中,以按下微动开关的次数作为输入信号,以发光二极管的亮和灭及其顺序为输出信号,软件系统中,以C51语言作为基本编程语言,以左移和右移作为控制发光二极管是否发光和发光顺序的基本方式。
关键词:单片机,发光二极管,微动开关,外部中断,C51语言。
1
目录
一.绪论 .................................................................................... 3 二.实验原理: ........................................................................ 3 三.实验的各种方案(输入端接按键及外部中断接按键两种方案)论证优劣 .................................................................. 4 四.硬件设计 ............................................................................ 4 五.软件设计 ............................................................................ 5 1.流程图: ............................................................................ 5 2.源代码: ............................................................................ 6 五.系统调试(用keil.c51对程序进行调试,以及把程序烧
录到单片机的过程): .................................................... 10 六.实验心得体会(设计过程中出现的问题) .................... 10
2
一.绪论
1.题目分析
设计要求是流水灯的控制,需自己设计图形并实现若干种状态。
2.功能要求
我们利用STC80C51单片机作为核心控制部分扩展外部并口芯片,用P0、P1端口控制灯的亮灭,P3.2端口控制按键,应用外部中断来实现流水灯的控制。
二.实验原理:
中断的概念:
CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生); CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务); 待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回),这一过程称为中断 。
MCS-51单片机的中断系统结构图:
主程序 中断请求 执行主程序 断点 继续执行主程序 中断响应 执行中断处理程序 中断返回 3
三.实验的各种方案(输入端接按键及外部
中断接按键两种方案)论证优劣
方案一:利用STC-80c51单片机作为系统核心控制部分扩展外部并口芯片。由P0、P1、P2端口控制发光二极管,选择P0、P1、P2任一端口接按键来控制流水灯。
方案二:利用STC-80c51单片机作为系统核心控制部分扩展外部并口芯片。由P0、P1、P2端口来控制灯的亮灭,P0.2(检测中断信号)接按键。
方案一将输入端接按键需要纯粹的软件编程来控制按键,对CPU的利用率高,但在日常生活中利用率不高;而将外部中断与按键相接来控制流水灯,降低了CPU的利用率,可以更好的利用单片
四.硬件设计
此电路总体来说由两部分组成。一部分是STC80C51单 片机,另一部分是单片机的外部扩展由发光二极管构成。 STC80C51单片机:
P0口与P1口外接发光二极管
P3.2口接外部中断开关(微动开关) 其他系统线按要求连接
灯流二极管接线图:
4
五.软件设计
1.流程图:
初始化 向上点亮 向下点亮 逆时针点亮 顺时针点亮 先奇数亮 后偶数亮 闪烁 顺序 5
2.源代码:
#include #include #define uint unsigned int #define uchar unsigned char void Function0(void); void Function1(void); void Function2(void); void Function3(void); uchar ID; uchar cnt=0; uint j; void main() { SP=0x50; P1=0x00; //P0=0x00; EA=1; IT0=1; EX0=1; TMOD=0x10;
TH1=15536/256; TL1=15536%256; ET0=1; TR0=1; ID=1;cnt=0; while(1) {
if(ID>7) ID=1; switch(ID) {
case 1:
Function0(); break; case 2:
Function1(); break; case 3:
Function2(); break; case 4:
Function3();
6
case 5:
Function4();
case 6:
Function5();
case 7:
Function6(); break;
} } }
void Function0(void) //{
uint i; P1=0xFE; P0=0XFE;
while(cnt!=10); cnt=0;
for(i=0;i<7;i++) {
P1=P1<<1; P0=P0<<1
while(cnt!=10); cnt=0; }
P1=0x7F; P0=Ox7F
for(i=0;i<7;i++) {
P0=P0>>1; P1=P1>>1
while(cnt!=20); cnt=0; } }
void Function1(void) //{
uint i; P1=0x7F; P0=0x7F;
while(cnt!=10); cnt=0;
for(i=0;i<7;i++)
第一种状态:向上交叉点亮第二种状态:向下交叉点亮7
{
P1=P1>>1; P0=P0>>1
while(cnt!=10); cnt=0; }
P1=0xFE; P0=OxFE
for(i=0;i<7;i++) {
P0=P0<<1; P1=P1<<1
while(cnt!=20); cnt=0; } }
void Function2(void) //{
uint i; P1=0xFE; P0=0xFF;
for(i=0;i<7;i++) {
P1=P1<<1;
while(cnt!=10); cnt=0; } P1=0xFF; P0=0xBF;
for(i=0;i<6;i++) {
P0=P0>>1;
while(cnt!=10); cnt=0; }
void Function3(void) //{
uint i; P1=0xFF; P0=0xFE;
for(i=0;i<6;i++)
第三种状态:逆流点亮第四种状态:顺流点亮8
{
P0=P0<<1;
while(cnt!=10); cnt=0; } P0=0xFF; P1=0x7F;
for(i=0;i<7;i++) {
P1=P1>>1;
while(cnt!=10); cnt=0; }
void Function4(void) //{
uint i;
while(cnt!=10); cnt=0;
for(i=0;i<7;i++) {
P1=0xAA; //P0=0xAA;
while(cnt!=20); cnt=0; P1=0x55; //P0=0x55;
while(cnt!=20); cnt=0; } }
void Function5(void) //{
uint i;
while(cnt!=20); cnt=0;
for(i=0;i<3;i++) {
P1=0x00; // P0=0x00;
while(cnt!=20); cnt=0; P1=0xFF; // P0=0xFF;
第五种状态:先奇数灯亮,再偶数灯亮;第六种状态:闪烁3次 9
while(cnt!=20); cnt=0; } }
void Function6(void) //第七种状态:依次点亮 {
void Function5(void) void Function0(void) void Function1(void) void Function2(void) void Function3(void) void Function4(void) void Function5(void) }
void it0() interrupt 1 {TH1=(65536-50000)/256; TL1=(65536-50000)%256; cnt++; }
void int0() interrupt 0 {
ID++;
if(ID>=8) ID=1; }
五.系统调试(用keil.c51对程序进行调试,以及把程序烧录到单片机的过程):
利用STC-80C51单片机作为系统核心控制部分,用外围16个发光二极管模拟流水灯的显示
将所得程序烧录入单片机中.
六.实验心得体会(设计过程中出现的问题)
在这次试验中,我发现的主要问题是好多同学在焊接电路板的时候都是虚焊,导致电路不通或是灯不亮,所以我们应该注意在焊接时尽量防止虚焊,以
10
减少多次焊接,防止电路板被损坏。
这次实验设计让我明白,开放与创新实验课能够给我们一个理论与实践结合的机会。经过查资料、选方案、设计电路、撰写设计报告、使我得到一次较全面的工程实践训练。理论联系实际,提高和培养创新能力。同时,结合PROTIUS软件,进行仿真设计,可以体现现代化的设计方法和理念,使我们各方面能力,得到比较大的提高,在这次的单片机控制流水灯设计过程中,让我加深了对单片机及其工作原理的理解。使我们得到了一次用专业知识、专业技能分析和解决问题全面系统的锻炼。使我在单片机的基本原理、单片机应用系统开发过程,以及在常用编程设计思路技巧(特别是C51语言)的掌握方面都能向前迈了一大步,为日后成为合格的应用型人才打下良好的基础.
11