1、漳州师范学院电子时钟及抽奖机姓 名: 学 号: 系 别: 物理与电子信息工程系 专 业: 电子科学与技术 年 级: 09 级 指导教师: 白炳良 2012 年 5 月 目录1 摘要 : 42 关键字 : 53 设计任务 53.1 两种抽奖方式 .53.2 扩展功能 .54 设计方案 54.1 设计思路 .54.2 方案比较与论证 .54.3 系统结构框图 .65 各功能模块设计 65.1 显示模块原理 .65.2 参数计算 .75.3 独立式按键模块 .75.4 总系统原理图 .86 软件设计 96.1 I/O口分配 96.2 随机数算法 .106.3 秒产生算法 .106.4 按键扫描 .1
2、06.5 显示扫描 .107 流程图 10108 程序清单 149 调试要点 299.1 硬件调试 .299.2 软件调试 .299.3 结果分析及设计工作总结 .2910 参考文献及附件 3010.1 参考文献 .3010.2 元器件清单 .3011 PCB版图 30311 摘要:本设计由单片机 AT89S52 芯片和 LED 共阳数码管为核心,辅以必要的电路,构成了一个由单片机控制的四位显示设计,设计制作同步和单步抽奖机,在模式键、启动键,停止键的控制下实现设计集成了时钟、秒表、四位抽奖三种功能于一体。2 关键字:AT89S52 动态显示 四位抽奖 按键扫描 随机数 秒表 3 设计任务3.
3、1两种抽奖方式3.1.1 按抽奖启动键时,四位数码管以不同的随机数快速滚动显示,按抽奖停止键时,四位随机数停止滚动显示在数码管上。3.1.2 按抽奖启动键时,个位数码管以随机数快速滚动显示,按抽奖停止键时,个位随机数停止滚动显示在数码管上;用同样的方法来确定十位、百位、千位的随机数。3.2 扩展功能电子时钟:电子钟以 99 时 59 分 59 秒为一个计数周期,在显示分秒,时分模块化之间切换。4 设计方案4.1 设计思路本设计需要实现两种方式的抽奖(即四位同时抽和逐位抽奖) ,因此重点在于由软件产生随机数;而硬件则需由数码管来显示中奖结果以及按键来控制抽奖模式和启动、停止抽奖。系统以 AT89
4、S52 为核心,主要有显示模块、按键模块和单片机软件控制模块构成。4.2 方案比较与论证数码管显示模块:方案一:单片机输出数据经译码芯片 CD4511 进行译码后直接驱动数码管,数码管公共端接 9012 三极管扩流,并通过单片机 I/O 口控制三极管的选通,实现动态显示。方案二:有单片机的 I/O 口直接驱动数码管的段码,数码管的公共端接 9012 三极管,通过灌电流的方式点亮数码管,也需通过单片机 I/O 口控制三极管的选通,实现动态显示。由于所需 I/O 口由 AT98S52 可直接提供,无须因为 I/O 口不够而用 CD4511 来节省I/O 口,方案二又较方案一更容易实惠,所以,我选择
5、方案二。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 口控制。
6、而共阳极公共端分别接一个 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进值如图所示a7b6c4d2e1f9g10dt5com3com8SEG3LED
7、8a7b6c4d2e1f9g10dt5com3com8SEG1LED8a7b6c4d2e1f9g10dt5com3com8SEG2LED8T19012 T29012 T39012 T49012a7b6c4d2e1f9g10dt5com3com8SEG4LED8R1RES2 R2RES2R3RES2R4RES2+5V+5V+5V+5Vh 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 babcdefghP2.0P2.1P2.4P2.7R14RESR13RESR12RESR11RESR10RESR9RESR8RESR7RES图
8、 3-1 显示电路图 3-2 码表5.2 参数计算由于 I/O 口高电平约等于 5V,使用灌电流的方式驱动数码管,故选用 PNP 型三极管 9012;数码管能正常工作的段电流为 3mA-10 mA,压降为 1.7V,三极管发射极和集电极的压降为 0.3V,因此限流电阻的压降为 3.0V,所以选用限流电阻的阻值 R=470 欧.501mAVR5.3 独立式按键模块独立式按键是直接用 I/O 口线构成的单个按键电路,其特点是每个按键单独占用一根I/O 口线,每个按键的工作不会影响其它 I/O 口线的状态。独立式按键的典型应用如(图3-3)所示。独立式按键电路配置灵活,软件结构简单,但每个按键必须占
9、用一根 I/O 口线,因此,P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 P1.0 16 进制0 1 0 0 0 0 0 0 0C0H1 1 1 1 1 0 0 1 0F9H2 0 1 0 0 1 0 0 0A4H3 0 1 1 0 0 0 0 0B0H4 0 0 1 1 0 0 1 99H5 0 0 1 0 0 1 0 92H6 0 0 0 0 0 1 0 82H在按键较多时,I/O 口线浪费较大,但本设计只用到三个按键,顾采用独立式按键电路。S2S3S4P 3.4P 3.0P 3.7图 3-3 独立式按键电路5.4 总系统原理图单片机(AT89S52)9 脚为复位输入端。上电
10、复位,只要 RST 引脚上有大于二个机器周期以上的高电平,单片机(AT89C2051)即复位。按键从单片机(AT89S52)的 P2.0、P2.1、P2.2、P2.4 口接入,当按键被按下时,相应的输入口就会输入低电平 0。单片机(AT89S52)的 XTAL1 脚、XTAL2 脚接一个由 12M 晶振和 10pf 组成的振荡电路。为单片机提供相应的时序。10pFC1010pFC11XT112MHZa7b6c4d2e1f9g10dt5com3com8SEG3LED8a7b6c4d2e1f9g10dt5com3com8SEG1LED8a7b6c4d2e1f9g10dt5com3com8SEG2L
11、ED8S2S1RESETS3S4T19012 T29012 T39012 T49012a7b6c4d2e1f9g10dt5com3com8SEG4LED8R1RES2R234K7R2RES2R3RES2R4RES2R22+5V+5V+5V+5VC12104+5Vh g f e d c b aP3.4P3.0P3.7d g f e d c a b h g f e d c a b h g f e d c a babcdefghP2.0P2.1P2.4P2.7a b c d c g P07C2 104D2D4D3D1132IC17805C1470uFC4 220uFC3104ISP1P1.5RSTP
12、1.6P1.7+5V+5V+5vEA/VP31X119X218RESET9RD17WR16INT012INT113T014T115P10/T1P11/T2P123P134P145P156P167P178P0039P0138P0237P0336P0435P0534P0633P0732P2021P2122P2223P2324P2425P2526P2627P2728PSEN29ALE/P30TXD11RXD10U189s52fRSTRSTP1.5 P1.6 P1.7P2.0 P2.1 P2.4 P2.7R14RESR13RESR12RESR11RESR10RESR9RESR8RESR7RESPort
13、Port22056 软件设计主程序主要起到一个导向和决策功能,控制程序的走向。本系统在主程序中运用模块化结构,所有控制量集中处理,提高了处理效率,并在 RAM 建立各控制量的映射,方便各功能模块的编程及修改。运用散转结构,可实现无扰动重入。本设计主要有以下几个模块:时钟模块、四位抽奖模块、逐位抽奖模块。操作说明:上电复位后进入数码初显示模块;按 SW0 启动,四位数码管产生四位随机数,按 SW0 四位随机数停止(操作可重复) ;按 SW1 一次进入抽奖 2 模块;按 SW0 启动,四位数码管最低位产生随机数,按 SW1 最低位停止高位启动按 4 次 SW1 后四位数码管均产生随机数,按 SW0
14、 键停止抽奖(操作可重复) ;按 SW1 一次进入时间模块(可循环) 。按 RET 键单片机复位。6.1 I/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_bufi=dis_dmrand()%10 返回随机数值6.3 秒产生算法将定时器 0 定时 5mS,每计数 200 次为 1S。6.4 按键扫描直接判断按键的按下与放开,不采用标志位判断。6.5 显示扫描显示扫描
15、采用高、低两位分开显示;这样,在进行时钟显示及秒表显示时易于处7 流程图5ms 到?重新对计数器赋值调用按键扫描程序调用显示子程序调用闪烁子程序500ms到?F300cnt=0取反闪烁标志位根据 msta 的值进行散转数码显示初值四位数同时抽奖四位数逐位抽奖时钟显示分秒时钟显示时分Msta=1Msta=2Msta=3Msta=0YYNMsta=0 初始化N数码显示初值Esw9?Esw0?Esw9?Msta=1Msta=2Msta=3返回Msta=1:四位同时抽奖Esw0?cj!=cjCj=1?据 rand()产生随机数Esw1?ESW2? 四位数码管闪烁返回Msta=2YYYYNNNNYYYN
16、NNMsta=0:Msta=2:逐位产生随机数:Esw2=1? Msta=3据 pointer 转模块Pointer=0Esw0? Jc!=cj Cj=1?产生个位随机数Esw1?Pointer=1Y YY返回NNN返回NYPointer=1Esw0? Jc!=cj Cj=1?产生个位随机数Esw1?Pointer=2Y YYNNN返回Pointer=2 Esw0? Jc!=cj Cj=1?产生个位随机数Esw1?Pointer=3YY YNN返回NN返回Pointer=3 Esw0? Jc!=cj Cj=1?产生个位随机数Esw1?Pointer=3Y YYNN返回1s 到?F200cnt=
17、200F200cnt-Msta=3:+a秒个位a 送显a9?10s 到?a=0, +bNYN秒十位b 送显b5?1 分到?b=0, +cNY分个位d 送显c9?10 分到?NYc=0, +d分十位d 送显d5?1 时到?NYd=0, +e时个位e 送显e9?10 时到?NYe=0, +g时十位g 送显g9?99 时到?NYg=0Yesw1? Msta=0按下 esw0,转到 msta=4,显示小时、分钟8 程序清单/*-名称:四位抽奖机编写:张小叶日期:2012.5.4平台:AT89S52-*/#include#include#include#define uint unsigned int
18、/宏定义#define uchar unsigned char /宏定义#define nop _nop_()/*-端口定义-*/#define disport P0 / 数据端口sbit cs0=P20;sbit cs1=P21;sbit cs2=P24;sbit cs3=P22;sbit sw0=P30; /独立按键端口sbit sw1=P34;sbit sw2=P37;/*-定义变量-*/uchar data key; / 定义键值寄存器uchar bdata ekey; / 定义键沿寄存器uchar bdata lastkey; sbit esw0=ekey0;sbit esw1=ek
19、ey4; sbit esw2=ekey7;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=0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff,0xfc,0x00,0xf0,0x0f;/显示段码值uchar dis_buf=0xC0,0xC0,0xC0,0xC0,0xff;/显示缓冲
20、uchar dis_pointer,pointer;/定义显示指针/*-函数声明-*/void Disply(); / 显示函数void Flaply(); /闪烁函数void KeyScan(); /读键函数void Init_timer0(); / 定时器初始化void choujiang_2(); /抽奖方式 2void dianzishizhong(); /电子时钟void dianzishizhongxiaoshi();/*-主函数-*/void main() uint i;TMOD=0x11; /定时器 0 工作方式 1SCON=0x00;TH0=0xec;TL0=0x78;TR0
21、=1;while(1)while(!TF0); /5ms?TF0=0; TH0=0xec; /定时器初值重设TL0=0x78;KeyScan(); /调用键扫描函数,显示函数 Disply();Flaply();/if(f300cnt+=100)/f300cnt=0;/ f300flag=!f300flag;if(f100cnt+=600)f100cnt=0;ck=1; switch(msta)case 0: dis_buf0=0x90; /数码显示初值dis_buf1=0xC0;dis_buf2=0xA4;dis_buf3=0xA4;if(esw0) msta=1;if(esw1) msta
22、=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;dis_buf2=dis_dme; dis_buf3=dis_dmg; f200cnt=200; break; default:msta=0; /*-抽奖方式 2 逐位抽奖-*/ void choujiang_2() switch(pointer) case 0:
23、 if(esw0)cj=!cj;if(cj)dis_buf0=dis_dmrand()%10;if(esw1)pointer=1;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;break;case 3:if(esw0)cj=!cj;if(cj)dis_buf3=dis_dmrand()%10;if(esw1)pointer=0;br
24、eak;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; dis_buf2=dis_dmc; dis_buf3=dis_dmd; /*-定时器 0 初始化函数-*/ void Init_Timer0(void) TMOD = 0x11; /定时器 0 工作在方式 1TH0=0xec; TL0=0x78; /定时器 5ms 初值 TR0= 1; /开定时器 0 /*-
25、键扫描函数-*/void KeyScan()uchar kbuf,keycnt;P2=0XFF;P3=P3|0X91; / 读独立按建kbuf=P3;kbuf=(kbuflastkey=kbuf; if(lastkey!=key) / 键有变化?key 为电平,lastkey 为前沿if(keycnt-!=0) /键有变,计数到?lastkey=key; /放弃不稳定的键elsekeycnt=0X05; / 重赋去抖值ekey=(keylastkey) /键前沿提取key=lastkey; /*-显示函数-*/void Disply() disport=0xff;P2=0xff;switch(
26、dis_pointer) / 根据显示指针,转相应显示位case 0: cs0=0; / 点亮第零位数码管disport=dis_buf0;dis_pointer=1;if(flaflag)Flaply();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; / 点亮第三位数码
27、管disport=dis_buf3;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)cs2=1;break;case 3: if(f300flag)cs3=1;break;case 4: if(f300flag) / 300ms 到,关显示cs0
28、=1;if(f300flag)cs1=1;if(f300flag)cs2=1;if(f300flag)cs3=1;break;default:break;9 调试要点9.1 硬件调试1、硬件完成后,检查电路有无短路、断路或虚焊;2、电路板检查正常后,编一段简单的显示程序,检验显示电路是否正常;3、若显示电路正常后,则可开始进行程序调试;4、动态显示时要注意任一时刻只能一个数码管工作;5、按键对应的 I/O 口要置为 1。9.2 软件调试1、软件平台采用 WAVE6000;2、参考的子程序均用 WAVE6000 进行调试,确保结果正确;(参考的子程序有:二翻十进制转换、拆字)3、本设计要实现 3
29、 种功能:时钟、秒表及四位抽奖机;调试时哪个功能不正常,则直接找相应的模块进行调试。9.3 结果分析及设计工作总结1、实现功能:正常走时秒表及四位抽奖机。2、经验:通过本电路的设计使我更进一步了解了单片机 89S52 系列芯片的强大的功能,进一步熟悉 89S52 系列单片机的编程指令集的实际应用,再次增强了自己的动手、思考能力,同时也体现了实践和理论相结合的要求。为将来步入社会奠定了基础。10 参考文献及附件10.1参考文献10.1.1 倪云峰单片机原理与应用.西安电子科技大学出版.200910.1.2 张华林,周小方编著电子设计竞赛实训教程 北京:北京航空航天大学出版社,2007,10.2元器件清单器件名称 器件型号 数量 器件名称 器件型号 数量数码管 共阳 4 单片机 AT89S52 1电解电容 10pF 2 三极管 9012 4晶振 12MHZ 1 电阻 470 欧 9按键 按键 4 电阻 4K7 5电解电容 220uf 1 电解电容 220uf 17805 1 插槽 10 脚 1-XTAL1(反相器输入端):反相振荡器的放大器输入端和内部时钟工作电路的输入端。多与 XTAL2 引脚一起连接晶体震荡器使用。若采用外部时钟源驱动器件,XTAL2 应不接。-XTAL2(反相器输出端):反相振荡器的放大器输出端。11 PCB 版图