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

下载本文档

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

文档简介

漳州师范学院漳州师范学院 电子时钟及抽奖机 姓 名 学 号 系 别 物理与电子信息工程系 专 业 电子科学与技术 年 级 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总系统原理图总系统原理图 8 6软件设计 9 6 1I OI O 口分配口分配 9 6 2随机数算法随机数算法 10 6 3秒产生算法秒产生算法 10 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 芯片和 LED 共阳数码管为核心 辅以必要的电路 构成了一个由单片机控制的四位显示设计 设计制作同步和单步抽奖机 在模式键 启动键 停止键的控制 下实现设计集成了时钟 秒表 四位抽奖三种功能于一体 2关键字关键字 AT89S52 动态显示 四位抽奖 按键扫描 随机数 秒表 3设计任务设计任务 3 1两种抽奖方式 3 1 1按抽奖启动键时 四位数码管以不同的随机数快速滚动显示 按抽奖停止键时 四位随机数停止滚动显示在数码管上 3 1 2按抽奖启动键时 个位数码管以随机数快速滚动显示 按 抽奖停止键时 个位随机数停止滚动显示在数码管上 用同样 的方法来确定十位 百位 千位的随机数 3 2扩展功能扩展功能 电子时钟 电子钟以 99 时 59 分 59 秒为一个计数周期 在显示分秒 时分模块化之间切换 4设计方案设计方案 4 1设计思路设计思路 本设计需要实现两种方式的抽奖 即四位同时抽和逐位抽奖 因此重点在于由软件产 生随机数 而硬件则需由数码管来显示中奖结果以及按键来控制抽奖模式和启动 停止抽 奖 系统以AT89S52为核心 主要有显示模块 按键模块和单片机软件控制模块构成 4 2方案比较与论证方案比较与论证 数码管显示模块 方案一 单片机输出数据经译码芯片 CD4511 进行译码后直接驱动 数码管 数码管公共端接 9012 三极管扩流 并通过单片机 I O 口控制三 极管的选通 实现动态显示 方案二 有单片机的 I O 口直接驱动数码管的段码 数码管的公共端 接 9012 三极管 通过灌电流的方式点亮数码管 也需通过单片机 I O 口 控制三极管的选通 实现动态显示 由于所需 I O 口由 AT98S52 可直接提供 无须因为 I O 口不够而用 CD4511 来节省 I O 口 方案二又较方案一更容易实惠 所以 我选择方案二 4 3 系统结构框图系统结构框图 AT89S52 单片机在模式键 启动键和停止键的控制下 由 P1 口输出数据 通过 P2 0 P2 1 P2 2 P2 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 实现各位数码管的分时选通 段选码 位选码每送入一次后延时 10MS 因人的视觉暂留时间为 0 1S 100MS 所以每位显示的时间不能超过 20MS 并保持延时一段时间 以造成视觉暂留效果 给人看上去每个数码管总 在亮 这种方式称为软件扫描方式 电路如 图 3 1 所示 由于采用的是共阳极数码管 所以要让段码点亮需把 I O 口置 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 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 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 码表 5 2参数计算参数计算 由于I O 口高电平约等于 5V 使用灌电流的方式驱动数码管 故选用 PNP 型 三极管 9012 数码管能正常工作的段电流为 3mA 10 mA 压降为 1 7V 三极 管发射极和集电极的压降为 0 3V 因此限流电阻的压降为 3 0V 所以选用限流电阻的阻值 R 470 欧 500 10 5 mA V R 5 3独立式按键模块独立式按键模块 独立式按键是直接用 I O 口线构成的单个按键电路 其特点是每个按键单独占用一根 I O 口线 每个按键的工作不会影响其它 I O 口线的状态 独立式按键的典型应用如 图 3 3 所示 独立式按键电路配置灵活 软件结构简单 但每个按键必须占用一根 I O 口线 因此 P1 6P1 5P1 4P1 3P1 2P1 1P1 016 进 制 010000000C0H 111110010F9H 201001000A4H 301100000B0H 4001100199H 5001001092H 6000001082H 在按键较多时 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 单片机 AT89S52 的 XTAL1 脚 XTAL2 脚接一个由 12M 晶振和 10pf 组成的振 荡电路 为单片机提供相应的时序 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 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 C3 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 RXD 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 建立 各控制量的映射 方便各功能模块的编程及修改 运用散转结构 可实现无扰 动重入 本设计主要有以下几个模块 时钟模块 四位抽奖模块 逐位抽奖模 块 操作说明 上电复位后进入数码初显示模块 按 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 P1 0 到 P1 6 作为段码 a 到 g 的输出口 6 2随机数算法随机数算法 在随机数模式下 调用库函数 stdlib h 用 dis buf i dis dm rand 10 返回随机数值 6 3秒产生算法秒产生算法 将定时器 0 定时 5mS 每计数 200 次为 1S 6 4按键扫描按键扫描 直接判断按键的按下与放开 不采用标志位判断 6 5显示扫描显示扫描 显示扫描采用高 低两位分开显示 这样 在进行时钟显示及秒表显示时易于处 7流程图流程图 5ms 到 重新对计数器赋值 调用按键扫描程序 调用显示子程序 调用闪烁子程序 500ms 到 F300cnt 0 取反闪烁标志位 根据 msta 的值进行散转 数码显示初值 四位数同时抽奖 四位数逐位抽奖 时钟显示分秒 时钟显示时分 Msta 1 Msta 2 Msta 3 Msta 0 Y YN Msta 0初始化 N 数码显示初值数码显示初值 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 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 N 返回 Pointer 3 Esw0 Jc cj Cj 1 产生个位随机数 Esw1 Pointer 3 Y Y Y N N 返回 1s 到 F200cnt 200 F200cnt Msta 3 a 秒个位 a 送显 a 9 10s 到 a 0 b N Y N 秒十位 b 送显 b 5 1 分到 b 0 c N Y 分个位 d 送显 c 9 10 分到 N Y c 0 d 分十位 d 送显 d 5 1 时到 N Y d 0 e 时个位 e 送显 e 9 10 时到 N Y e 0 g 时十位 g 送显 g 9 99 时到 N Y g 0 Y esw1 Msta 0 按下 esw0 转到 msta 4 显示小时 分钟 8程序清单程序清单 名称 四位抽奖机 编写 张小叶 日期 2012 5 4 平台 AT89S52 include include include define uint unsigned int 宏定义 define uchar unsigned char 宏定义 define nop nop 端口定义 define disport P0 数据端口 sbit cs0 P2 0 sbit cs1 P2 1 sbit cs2 P2 4 sbit cs3 P2 2 sbit sw0 P3 0 独立按键端口 sbit sw1 P3 4 sbit sw2 P3 7 定义变量 uchar data key 定义键值寄存器 uchar bdata ekey 定义键沿寄存器 uchar bdata lastkey sbit esw0 ekey 0 sbit esw1 ekey 4 sbit esw2 ekey 7 bit flaflag 定义闪烁标志 bit f300flag bit cj 1 uchar f300cnt f200cnt 200 f100cnt 闪烁标 志 uchar msta 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 显示段码值 uchar dis buf 0 xC0 0 xC0 0 xC0 0 xC0 0 xff 显示缓冲 uchar dis pointer pointer 定义显示指针 函数声明 void Disply 显示函数 void Flaply 闪烁函数 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 while 1 while TF0 5ms TF0 0 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 buf 0 0 x90 数码显示初值 dis buf 1 0 xC0 dis buf 2 0 xA4 dis buf 3 0 xA4 if esw0 msta 1 if esw1 msta 2 if esw2 msta 3 break case 1 if esw0 cj cj if cj for i 0 i9 a 0 b if b 5 b 0 c if c 9 c 0 d if d 5 d 0 e if e 9 e 0 g if g 9 g 0 dis buf 0 dis dm c dis buf 1 dis dm d dis buf 2 dis dm e dis buf 3 dis dm g f200cnt 200 break default msta 0 抽奖方式 2 逐位抽奖 void choujiang 2 switch pointer case 0 if esw0 cj cj if cj dis buf 0 dis dm rand 10 if esw1 pointer 1 break case 1 if esw0 cj cj if cj dis buf 1 dis dm rand 10 if esw1 pointer 2 break case 2 if esw0 cj cj if cj dis buf 2 dis dm rand 10 if esw1 pointer 3 break case 3 if esw0 cj cj if cj dis buf 3 dis dm rand 10 if esw1 pointer 0 break default break 电子时钟 分秒 void dianzishizhong a if a 9 a 0 b if b 5 b 0 c if c 9 c 0 d if d 5 d 0 e dis buf 0 dis dm a dis buf 1 dis dm b dis buf 2 dis dm c dis buf 3 dis dm d 定时器 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 kbuf kbuf lastkey kbuf if lastkey key 键有变化 key 为电平 lastkey 为前沿 if keycnt 0 键有变 计数到 lastkey key 放弃不稳定的键 else keycnt 0X05 重赋去抖值 ekey key lastkey 键前沿提取 key lastkey 显示函数 void Disply disport 0 xff P2 0 xff switch dis pointer 根据显示指针 转 相应显示位 case 0 cs0 0 点亮第零位数码管 disport dis buf 0 dis pointer 1 if flaflag Flaply break 点亮第一位数码管 case 1 cs1 0 disport dis buf 1 dis pointer 2 if flaflag Flaply break 点亮第二位数码管 case 2 cs2 0 disport dis buf 2 dis pointer 3 if flaflag Flaply break case 3 cs3 0 点亮第三位数码 管 disport dis buf 3 dis pointer 0 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

温馨提示

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

评论

0/150

提交评论