1、 摘要单片机是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器 CPU、随机存储器 RAM、只读存储器 ROM、多种 I/O 口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D 转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域广泛应用。从上世纪 80 年代,由当时的 4 位、8 位单片机,发展到现在的 300M 的高速单片机。本课程设计是基于 51 系列单片机所设计的,用 AT89C51 芯片控制跑马灯游戏机,整个系统有 2 种模式可以选择,首先接通电源后单片机全部 LED 闪烁;若按下 K
2、1,则使单片机从全部 LED闪烁切换到 LED 从左到右依次点亮,再从右到左依次点亮,循环往复;若按下 K2,则使单片机在 LED 流水灯模式中暂停。关键词:单片机、AT89C51、跑马灯I目录1.设计任务与要求 .12.总体设计方案 .13.系统硬件电路设计 .13.1 时钟电路设计 .13.2 复位电路设计 .23.3 按键电路设计 .23.5 LED 电路设计 .33.6 系统总电路原理图 .34.系统软件设计 .34.1 系统软件总体设计 .34.1.1 定义及函数文件 .34.1.2 子程序 .44.1.3 主程序 .44.2 主程序设计 .54.2.1 流程图 .55.实验结果及分
3、析 .8结束语 .11附录 A 程序清单 .12附录 B 系统总电路原理图 .14参考文献 .1511.设计任务与要求(1)用单片机 I/O 口控制发光二极管(LED)点亮和熄灭来模拟跑马灯游戏机;(2)控制 8 个发光二极管(LED)依次点亮,被点亮的灯短暂延时后熄灭。循环此状态;(3)用开关模拟功能按键,分别实现开始、停止功能;(4)当“开始键”未按下时,处于待机状态,所有发光二极管闪烁;(5)当“开始键”按下后,发光二极管循环点亮;(6)当“停止键”按下时,发光二极管(LED)循环状态暂停,若此时,正巧最后一个红色 LED 被点亮,表示该操作人获胜,赢得游戏,同时蜂鸣器鸣响 3 秒,以示
4、庆祝;反之则蜂鸣器鸣响 500ms 示意输掉游戏。(7)继续按下“开始键” ,游戏仍能继续。2.总体设计方案图 21 总体设计方案3.系统硬件电路设计 3.1 时钟电路设计几乎所有的数字系统在处理信号都是按节拍一步一步地进行的,系统各部分也是按节拍做的,要使电路的各部分统一节拍就需要一个“时钟信号” ,产生这个时钟信号的电路就是时钟电路。 时钟电路的核心是个比较稳定的振荡器(一般都用晶体振荡器) ,振荡器产生的是正弦波,频率不一定是电路工作的时钟频率,所以要把这正弦波进行分频,处理,形成时钟脉冲,然后分配到需要的地方。让系统里各部分工作时使用。如图 3-1 所示。图 31 时钟电路发光二极管N
5、 YNYNY51 单片机 蜂鸣器按键模块23.2 复位电路设计图 32 复位电路图 33 公式复位电路是一种用来使电路恢复到起始状态的电路设备,它的操作原理与计算机有着异曲同工之妙,只是启动原理和手段有所不同。为确保微机系统中电路稳定可靠工作,复位电路是必不可少的一部分,复位电路的第一功能是上电复位。一般微机电路正常工作需要供电电源为 5V5%,即 4.755.25V。由于微机电路是时序数字电路,它需要稳定的时钟信号,因此在电源上电时,只有当 VCC 超过 4.75V 低于 5.25V 以及晶体振荡器稳定工作时,复位信号才被撤除,微机电路开始正常工作。见图 32,3 3。3.3 按键电路设计按
6、键中有上下两张薄膜,涂有导电橡胶电路,中间有个薄膜,带孔,用于隔离两张带有导电橡胶的薄膜。按键在孔的位置,按下按键的时候,两张带导电橡胶的薄膜透过中间的圆孔,接通电路,通过芯片编码,输出。见图 34。图34 按键电路33.4蜂鸣器电路设计图35 蜂鸣器电路多谐振荡器由晶体管或集成电路构成。当接通电源后(1.515V 直流工作电压),多谐振荡器起振,输出 1.52.5kHZ 的音频信号,阻抗匹配器推动压电蜂鸣片发声。见图 353.5 LED 电路设计图36 LED 电路3.6 系统总电路原理图本系统由一个 89C52 芯片、8 个发光二极管、3 个开关,电阻,电容,蜂鸣器,晶振,三极管等组成,电
7、路原理图如图 3-7 所示。其中按功能分为时钟电路,复位电路,按键电路,蜂鸣器电路,LED 电路。主体成分为 89C52 芯片。图详见附录二。 4.系统软件设计4.1 系统软件总体设计4.1.1 定义及函数文件#include “reg52.h“4#include#define uchar unsigned char /uchar=unsigned char#define uint unsigned int /uint=unsigned int typedef unsigned int u16; /int=u16 typedef unsigned char u8; /char=u8sbit k
8、1=P34; /定义 k1=p3.4sbit k2=P35; /定义 k2=p3.5sbit fmq=P23; /定义 fmg(蜂鸣器)=p2.3u8 flag=0; /char flag=0#define led P1 /定义 led=整个 P1 口4.1.2 子程序void delay(u16 i)while(i-); /延时程序,大约延时了 10us4.1.3 主程序void main()fmq=1; /蜂鸣器不工作while(k1=1) /判断 K1 是否为未接通led=0x00; /LED 全亮delay(50000); /延时 500msled=0xff; /LED 全灭delay
9、(50000); /延时 500ms /闪烁程序while(k1=0) /判断 K1 是否为接通 u8 i; led=0xfe; /最后一个 LED 亮delay(50000); /延时 500mswhile(1) /死循环for(i=0;i7;i+) /对 i 赋值 0,判断 i 是否小于 7,i+5while(!k2)fmq=0; /蜂鸣器工作if(i!=6) delay(50000); /延时 500mselse delay(300000); /延时 3S;暂停程序fmq=1; /蜂鸣器不工作led=_crol_(led,1); /左移delay(50000); /延时 500msfor
10、(i=0;i7;i+) /对 i 赋值 0,判断 i 是否小于 7,i+while(!k2)fmq=0; /蜂鸣器工作if(i!=6) delay(50000); /延时 500mselse delay(300000); /延时 3S;暂停程序 fmq=1; /蜂鸣器不工作led=_cror_(led,1); /右移delay(50000); /延时 500ms /流水灯程序 4.2 主程序设计4.2.1 流程图系统初始化开始6蜂NY NYN读取初始设定K1=0?fmq=1led=0x00led=0xfedelay(50000)1?i=0i7?i=i+1!k2?led=0xff7YYNNYNYfmq=0i!=6?delay(50000) delay(300000)fmq=1led=_crol_(led,1)delay(50000)i=0i7?i=i+1!k2?8YN图 41 流程图图 42 子程序流程图4.2.2 程序代码详见附录 A5.实验结果及分析fmq=0i!=6?delay(50000) delay(300000)fmq=1led=_cror_(led,1)delay(50000)开始int ii-