单片机四位抽奖机_第1页
单片机四位抽奖机_第2页
单片机四位抽奖机_第3页
单片机四位抽奖机_第4页
单片机四位抽奖机_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1 / 29 下载文档可编辑 漳州师范学院 电子时钟及抽奖机 姓 名: 学 号: 系 别: 物理与电子信息工程系 专 业: 电子科学与技术 年 级: 09 级 指导教师: 白炳良 2012 年 5 月 目录目录 1摘要摘要:4 2关键字关键字:5 3设计任务设计任务5 3.1 两种抽奖方式.5 3.2 扩展功能扩展功能.5 4设计方案设计方案5 4.1 设计思路设计思路.5 4.2 方案比较与论证方案比较与论证.5 4.3 系统结构框图系统结构框图.6 5各功能模块设计 6 5.1 显示模块原理显示模块原理.6 5.2 参数计算参数计算.7 5.3 独立式按键模块独立式按键模块.7 5.4 总

2、系统原理图总系统原理图.8 6软件设计9 6.1 I/OI/O 口分配口分配 .9 6.2 随机数算法随机数算法.10 6.3 秒产生算法秒产生算法.10 2 / 29 下载文档可编辑 6.4 按键扫描按键扫描.10 6.5 显示扫描显示扫描.10 7流程图流程图10 .10 8程序清单程序清单14 9调试要点29 9.1 硬件调试.29 9.2 软件调试.29 9.3 结果分析及设计工作总结.29 10参考文献及附件参考文献及附件 30 10.1 参考文献 .30 10.2 元器件清单 .30 11PCBPCB 版图版图 30 .31 1摘要摘要: 本设计由单片机 AT89S52 芯片和 L

3、ED 共阳数码管为核心, 辅以必要的电路,构成了一个由单片机控制的四位显示设计, 设计制作同步和单步抽奖机,在模式键、启动键,停止键的控制 下实现设计集成了时钟、秒表、四位抽奖三种功能于一体。 2关键字关键字: AT89S52 动态显示 四位抽奖 按键扫描 随机数 秒表 3设计任务设计任务 3.1两种抽奖方式 3.1.1按抽奖启动键时,四位数码管以不同的随机数快速滚 动显示,按抽奖停止键时,四位随机数停止滚动显示在 数码管上。 3.1.2按抽奖启动键时,个位数码管以随机数快速滚动显 示,按抽奖停止键时,个位随机数停止滚动显示在数 码管上;用同样的方法来确定十位、百位、千位的随 机数。 3 /

4、29 下载文档可编辑 3.2扩展功能扩展功能 电子时钟:电子钟以 99 时 59 分 59 秒为一个计数周期,在 显示分秒,时分模块化之间切换。 4设计方案设计方案 4.1设计思路设计思路 本设计需要实现两种方式的抽奖(即四位同时抽和逐位抽奖) , 因此重点在于由软件产生随机数;而硬件则需由数码管来显示中奖 结果以及按键来控制抽奖模式和启动、停止抽奖。系统以 AT89S52 为核心,主要有显示模块、按键模块和单片机软件控制模块构成。 4.2方案比较与论证方案比较与论证 数码管显示模块: 方案一:单片机输出数据经译码芯片 CD4511 进行译码后 直接驱动数码管,数码管公共端接 9012 三极管

5、扩流,并通过 单片机 I/O 口控制三极管的选通,实现动态显示。 方案二:有单片机的 I/O 口直接驱动数码管的段码,数码 管的公共端接 9012 三极管,通过灌电流的方式点亮数码管, 也需通过单片机 I/O 口控制三极管的选通,实现动态显示。 由于所需 I/O 口由 AT98S52 可直接提供,无须因为 I/O 口不够 而用 CD4511 来节省 I/O 口,方案二又较方案一更容易实惠, 所以,我选择方案二。 4.3 系统结构框图系统结构框图 AT89S52 单片机在模式键、启动键和停止键的控制下,由 P1 口 4 / 29 下载文档可编辑 输出数据,通过 P2.0 、P2.1、P2.2、P

6、2.4 进行选通,有数码管显 示信息。 系统框图: 图 2-3 系统总框图 5各功能模块设计 5.1显示模块显示模块原理原理 由单片机(AT89S52)的引脚 P1 口输出中奖号码、时间等数据信息, 通过片选信号 P2.0 、P2.1、P2.2、P2.4 就可在相应的数码管进行 显示。当位选信号 P2.0 为低电平时,P1 口送出数据也为低电平就 点亮数码管,电流灌进单片机。多位 LED 显示,为了简化电路,降 低成本,将所有位的段选线并联在一起,由一个 8 位 I/O 口控制。 而共阳极公共端分别接一个 9012,由相应的 I/O 口线控制 9012,实 现各位数码管的分时选通。段选码,位选

7、码每送入一次后延时 10MS,因人的视觉暂留时间为 0.1S(100MS) ,所以每位显示的时间 不能超过 20MS,并保持延时一段时间,以造成视觉暂留效果,给人 看上去每个数码管总在亮。这种方式称为软件扫描方式。电路如 (图 3-1)所示。 由于采用的是共阳极数码管,所以要让段码点亮需把 I/O 口置 5 / 29 下载文档可编辑 0,例如:段码 a 到 g 对应的 I/O 口是 P1.0 到 P1.6,则要让数码管 显示 0 到 6 对应的 16 进值如图所示 a 7 b 6 c 4 d 2 e 1 f 9 g 10 dt 5 com 3 com 8 SEG 3 LE D8 a 7 b 6

8、 c 4 d 2 e 1 f 9 g 10 dt 5 com 3 com 8 SEG 1 LE D8 a 7 b 6 c 4 d 2 e 1 f 9 g 10 dt 5 com 3 com 8 SEG 2 LE D8 T1 901 2 T2 901 2 T3 901 2 T4 901 2 a 7 b 6 c 4 d 2 e 1 f 9 g 10 dt 5 com 3 com 8 SEG 4 LE D8 R1 RE S2 R2 RE S2 R3 RE S2 R4 RE S2 +5V+5V+5V+5V h g f e d c b a d g f e d c a b h g f e d c a b

9、h g f e d c a b a b c d e f g h P2.0P2.1P2.4P2.7 R14 RE S R13 RE S R12 RE S R11 RE S R10 RE S R9 RE S R8 RE S R7 RE S 图 3-1 显示电路 图 3-2 码表 P1.6P1.5P1.4P1.3P1.2P1.1P1.0 16 进 制 010000000C0H 111110010F9H 201001000A4H 301100000B0H 4001100199H 5001001092H 6000001082H 6 / 29 下载文档可编辑 5.2参数计算参数计算 由于 I/O 口高电平

10、约等于 5V,使用灌电流的方式驱动数码管, 故选用 PNP 型三极管 9012;数码管能正常工作的段电流为 3mA-10 mA,压降为 1.7V,三极管发射极和集电极的压降为 0.3V,因此限流 电阻的压降为 3.0V,所以选用限流电阻的阻值 R=470500 10 5 mA V R 欧. 5.3独立式按键模块独立式按键模块 独立式按键是直接用 I/O 口线构成的单个按键电路,其特点是 每个按键单独占用一根 I/O 口线,每个按键的工作不会影响其它 I/O 口线的状态。独立式按键的典型应用如(图 3-3)所示。 独立式按键电路配置灵活,软件结构简单,但每个按键必须占 用一根 I/O 口线,因此

11、,在按键较多时,I/O 口线浪费较大,但本 设计只用到三个按键,顾采用独立式按键电路。 S2 S3 S4 P3 .4 P3 .0 P3 .7 图 3-3 独立式按键电路 5.4总系统原理图总系统原理图 单片机(AT89S52)9 脚为复位输入端。上电复位,只要 RST 引脚 上有大于二个机器周期以上的高电平,单片机(AT89C2051)即复位。 按键从单片机(AT89S52)的 P2.0、P2.1、P2.2、P2.4 口接入,当 按键被按下时,相应的输入口就会输入低电平 0。 7 / 29 下载文档可编辑 单片机(AT89S52)的 XTAL1 脚、XTAL2 脚接一个由 12M 晶振和 10

12、pf 组成的振荡电路。为单片机提供相应的时序。 10p F C10 10p F C11 XT 1 12M HZ a 7 b 6 c 4 d 2 e 1 f 9 g 10 dt 5 com 3 com 8 SEG 3 LE D8 a 7 b 6 c 4 d 2 e 1 f 9 g 10 dt 5 com 3 com 8 SEG 1 LE D8 a 7 b 6 c 4 d 2 e 1 f 9 g 10 dt 5 com 3 com 8 SEG 2 LE D8 S2 S1 RE SET S3 S4 T1 901 2 T2 901 2 T3 901 2 T4 901 2 a 7 b 6 c 4 d 2

13、 e 1 f 9 g 10 dt 5 com 3 com 8 SEG 4 LE D8 R1 RE S2 R23 4K 7 R2 RE S2 R3 RE S2 R4 RE S2 R22 +5V+5V+5V+5V C12 104 +5V h g f e d c b a P3.4 P3.0 P3.7 d g f e d c a b h g f e d c a b h g f e d c a b a b c d e f g h P2.0P2.1P2.4P2.7 a b c d c g P07 C2 104 D2 D4 D3 D1 13 2 IC1 780 5 C1 470 uF C4 220 uF C

14、3 104 ISP1 P1.5 RST P1.6 P1.7 +5V +5V +5v EA/VP 31 X1 19 X2 18 RESET 9 RD 17 WR 16 INT0 12 INT1 13 T0 14 T1 15 P10/T 1 P11/T 2 P12 3 P13 4 P14 5 P15 6 P16 7 P17 8 P00 39 P01 38 P02 37 P03 36 P04 35 P05 34 P06 33 P07 32 P20 21 P21 22 P22 23 P23 24 P24 25 P25 26 P26 27 P27 28 PSEN 29 ALE/P 30 TXD 11 R

15、XD 10 U1 89s 52 f RST RST P1.5 P1.6 P1.7 P2.0 P2.1 P2.4 P2.7 R14 RE S R13 RE S R12 RE S R11 RE S R10 RE S R9 RE S R8 RE S R7 RE S Port Port 220 5 6软件设计 主程序主要起到一个导向和决策功能,控制程序的走向。本 系统在主程序中运用模块化结构,所有控制量集中处理,提高了处 理效率,并在 RAM 建立各控制量的映射,方便各功能模块的编程及 修改。运用散转结构,可实现无扰动重入。本设计主要有以下几个 8 / 29 下载文档可编辑 模块:时钟模块、四位抽奖模

16、块、逐位抽奖模块。 操作说明:上电复位后进入数码初显示模块;按 SW0 启动,四位数 码管产生四位随机数,按 SW0 四位随机数停止(操作可重复) ;按 SW1 一次进入抽奖 2 模块;按 SW0 启动,四位数码管最低位产生随 机数,按 SW1 最低位停止高位启动按 4 次 SW1 后四位数码管均产 生随机数,按 SW0 键停止抽奖(操作可重复) ;按 SW1 一次进入时间 模块(可循环) 。按 RET 键单片机复位。 6.1I/OI/O 口分配口分配 1、P2.0、P2.1、P2.2、P2.4 作为个位、十位、百位、千位 数码管片选。 2、P3.0、P3.4、P3.7 作为按键接口。 3、P

17、1.0 到 P1.6 作为段码 a 到 g 的输出口。 6.2随机数算法随机数算法 在随机数模式下,调用库函数 stdlib.h ,用 dis_bufi =dis_dmrand()%10 返回随机数值 6.3秒产生算法秒产生算法 将定时器 0 定时 5mS,每计数 200 次为 1S。 6.4按键扫描按键扫描 直接判断按键的按下与放开,不采用标志位判断。 6.5显示扫描显示扫描 显示扫描采用高、低两位分开显示;这样,在进行时钟显 示及秒表显示时易于处 9 / 29 下载文档可编辑 7流程图流程图 5ms 到? 重新对计数器赋值 调用按键扫描程序 调用显示子程序 调用闪烁子程序 500ms 到?

18、 F300cnt=0 取反闪烁标志位 根据 msta 的值进行散转 数码显示初值 四位数同时抽奖 四位数逐位抽奖 时钟显示分秒 时钟显示时分 Msta=1 Msta=2 Msta=3 Msta=0 Y YN Msta=0初始化 N 10 / 29 下载文档可编辑 数码显示初值数码显示初值 Esw9? Esw0? Esw9? Msta=1 Msta=2 Msta=3 返回 Msta=1:四位同时抽奖 Esw0? cj!=cj Cj=1? 据 rand()产生随机 数 Esw1? ESW2?四位数码管闪烁 返回 Msta=2 Y Y Y Y N N N N Y Y Y N N N Msta=0:

19、11 / 29 下载文档可编辑 Msta=2:逐位产生随机数: Esw2=1? Msta=3 据 pointer 转模块 Pointer=0 Esw0?Jc!=cjCj=1? 产生个位随机数Esw1?Pointer=1 Y Y Y 返回 N N N 返回 N Y Pointer=1 Esw0? Jc!=cjCj=1? 产生个位随机数 Esw1? Pointer=2 Y Y Y N N N 返回 Pointer=2 Esw0? Jc!=cjCj=1? 产生个位随机数 Esw1? Pointer=3 Y Y Y N N 返回 N 12 / 29 下载文档可编辑 N 返回 Pointer=3 Esw

20、0?Jc!=cj Cj=1? 产生个位随机数 Esw1? Pointer=3 Y Y Y N N 返回 1s 到? F200cnt=200 F200cnt- Msta=3: +a 秒个位 a 送显 a9? 10s 到? a=0, +b N Y N 秒十位 b 送显 b5? 1 分到? b=0, +c N Y 分个位 d 送显 c9? 10 分到? N Y c=0, +d 分十位 d 送显 d5? 1 时到? N Y d=0, +e 时个位 e 送显 e9? 10 时到? N Y e=0, +g 时十位 g 送显 g9? 99 时到? N Y g=0 Y esw1? Msta=0 按下 esw0

21、,转到 msta=4,显示小时、分钟 13 / 29 下载文档可编辑 8程序清单程序清单 /*- 名称:四位抽奖机 编写:张小叶 日期:2012.5.4 平台:AT89S52 -*/ #include #include #include #define uint unsigned int/宏定义 #define uchar unsigned char/宏定义 #define nop _nop_() /*- 端口定义 -*/ #define disport P0 / 数据端口 sbit cs0=P20; sbit cs1=P21; sbit cs2=P24; sbit cs3=P22; sbit

22、 sw0=P30;/独立按键端口 14 / 29 下载文档可编辑 sbit sw1=P34; sbit sw2=P37; /*- 定义变量 -*/ uchar data key; / 定义键值寄存器 uchar bdata ekey; / 定义键沿寄存器 uchar bdata lastkey; sbit esw0=ekey0; sbit esw1=ekey4; sbit esw2=ekey7; bit flaflag; / 定义闪烁标志 bit f300flag; bit cj=1; uchar f300cnt, f200cnt=200,f100cnt; / 闪烁标 志 uchar msta

23、,ck=0; uchar flasta=5; uchar a,b,c,d,e,g,h; uchar code dis_dm=0 xC0,0 xF9,0 xA4,0 xB0,0 x99,0 x92,0 x82,0 xF8,0 x80,0 x90,0 xff,0 xfc,0 x00,0 xf0,0 x0f;/显示段码值 15 / 29 下载文档可编辑 uchar dis_buf=0 xC0,0 xC0,0 xC0,0 xC0,0 xff;/显示缓冲 uchar dis_pointer,pointer;/定义显示指针 /*- 函数声明 -*/ void Disply(); / 显示函数 void F

24、laply(); /闪烁函数 void KeyScan(); /读键函数 void Init_timer0(); / 定时器初始化 void choujiang_2(); /抽奖方式 2 void dianzishizhong(); /电子时钟 void dianzishizhongxiaoshi(); /*- 主函数 -*/ void main() uint i; TMOD=0 x11;/定时器 0 工作方式 1 SCON=0 x00; TH0=0 xec; TL0=0 x78; TR0=1; 16 / 29 下载文档可编辑 while(1) while(!TF0); /5ms? TF0=0

25、; TH0=0 xec; /定时器初值重设 TL0=0 x78; KeyScan(); /调用键扫描函数,显示函数 Disply(); Flaply(); /if(f300cnt+=100) /f300cnt=0; / f300flag=!f300flag; if(f100cnt+=600) f100cnt=0; ck=1; switch(msta) case 0: dis_buf0=0 x90;/数码显示初值 dis_buf1=0 xC0; dis_buf2=0 xA4; 17 / 29 下载文档可编辑 dis_buf3=0 xA4; if(esw0) msta=1; if(esw1) ms

26、ta=2; if(esw2) msta=3; break; case 1: if(esw0) cj=!cj; if(cj) for(i=0;i9) a=0;+b; if(b5) b=0;+c; if(c9) c=0;+d; if(d5) d=0;+e; if(e9) e=0;+g; if(g9) g=0; dis_buf0=dis_dmc; dis_buf1=dis_dmd; 20 / 29 下载文档可编辑 dis_buf2=dis_dme; dis_buf3=dis_dmg; f200cnt=200; break; default:msta=0; /*- 抽奖方式 2 逐位抽奖 -*/ vo

27、id choujiang_2() switch(pointer) case 0: if(esw0) cj=!cj; if(cj) dis_buf0=dis_dmrand()%10; if(esw1) pointer=1; 21 / 29 下载文档可编辑 break; case 1: if(esw0) cj=!cj; if(cj) dis_buf1=dis_dmrand()%10; if(esw1) pointer=2; break; case 2: if(esw0) cj=!cj; if(cj) dis_buf2=dis_dmrand()%10; if(esw1) pointer=3; bre

28、ak; case 3: if(esw0) cj=!cj; if(cj) dis_buf3=dis_dmrand()%10; 22 / 29 下载文档可编辑 if(esw1) pointer=0; break; default:break; /*- 电子时钟 分秒 -*/ void dianzishizhong() +a; if(a9) a=0;+b; if(b5) b=0;+c; if(c9) c=0;+d; if(d5) d=0;+e; dis_buf0=dis_dma; dis_buf1=dis_dmb; 23 / 29 下载文档可编辑 dis_buf2=dis_dmc; dis_buf3

29、=dis_dmd; /*- 定时器 0 初始化函数 -*/ void Init_Timer0(void) TMOD = 0 x11; /定时器 0 工作在方式 1 TH0=0 xec; TL0=0 x78; /定时器 5ms 初值 TR0= 1; /开定时器 0 /*- 键扫描函数 -*/ void KeyScan() uchar kbuf,keycnt; P2=0XFF; P3=P3|0X91; / 读独立按建 kbuf=P3; 24 / 29 下载文档可编辑 kbuf=(kbuf lastkey=kbuf; if(lastkey!=key) / 键有变化?key 为电平, lastkey

30、为前沿 if(keycnt-!=0) /键有变,计数到? lastkey=key; /放弃不稳定的键 else keycnt=0X05; / 重赋去抖值 ekey=(keylastkey) /键前沿提取 key=lastkey; /*- 显示函数 -*/ void Disply() disport=0 xff; P2=0 xff; switch(dis_pointer) / 根据显示指针,转 相应显示位 25 / 29 下载文档可编辑 case 0: cs0=0; / 点亮第零位数码管 disport=dis_buf0; dis_pointer=1; if(flaflag) Flaply();

31、 break; / 点亮第一位数码管 case 1: cs1=0; disport=dis_buf1; dis_pointer=2; if(flaflag) Flaply(); break; / 点亮第二位数码管 case 2: cs2=0; disport=dis_buf2; dis_pointer=3; if(flaflag) Flaply(); break; case 3: cs3=0; / 点亮第三位数码 管 disport=dis_buf3; dis_pointer=0; 26 / 29 下载文档可编辑 if(flaflag) Flaply(); break; default:break; /*- 闪烁函数 -*/ void Flaply() switch(flasta)/ 据闪烁状态转相应位 case 0: if(f300flag) / 300ms 到,关显示 cs0=1; break; case 1: if(f300flag) cs1=1; break; case 2: if(f300flag) cs2=

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论