(二)设计要求
1.随机产生抽奖号码。
2.可以随时启动和停止抽奖
3.实时显示抽奖结果
(三)设计方法
本设计由三部分组成:CPU处理模块,按键抽奖控制模块,抽奖信息显示模块。其中CPU处理模块控制所有的电路,当抽奖启动键按下后,CPU识别到按键按下,开始持续产生随机数(抽奖号码),当抽奖停止键按下后,CPU识别到按键按下,立刻停止随机数的产生,并在显示模块显示出当前随机数(抽奖号码)。
二 硬件设计
(一)硬件设计方案
本设计使用AT89C51芯片作为主芯片,使用两个独立按键作为抽奖的启动键和停止键,以及四位共阴数码管作为抽奖号码的显示模块。硬件设计结构简单可靠,不需要额外的电路部分节省了制造生产成本。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
(三)按键电路设计
本设计按键部分使用两个独立按键,一个作为抽奖的启动键,一端与接芯片P1.0口相接,一端与地线相接。一个作为抽奖的停止键,一端与接芯片的P1.4口相接,一端与地线相接。按键按下即可送出低电平信号。如图三所示。
图三(按键电路)
(四)数码管显示部分
本设计的显示部分采用7SEG-MPX4-CC,即四位共阴极数码管,该数码管刚好可以满足稍复杂的4位抽奖号,既确保了有足够的抽奖号数量同时又方便记录和查看。数码管的A,B,C,D,E,F,G,DP分别与芯片的P2.0至P2.7相连,以控制数码管所显示的内容,而数码管的1,2,3,4分别与芯片的P3.0至P3.3相连,用于控制数码管所显示数字的位置。如图四所示。
程序开始后,进入while循环等待按键K1的按下,待K1按下后定时器开始计时,将TL0,TH0的值分别赋给sum1和sum2,sum1和sum2进行除以10取余10和直接取余10后得到不同的个位数,再以此为数组下标分别从数组led[ ]中取数码管的数值显示,在条件循环while(counter==1)里循环等待按键K2的按下,若K2按下,则跳出while(counter==1)循环,停止随机数的产生,将当前随机数一直显示在数码管上,完成一次抽奖。
(二)各部分代码分析
1.主函数
void main()
{
TMOD=0x01;
TH0=0x00;
TL0=0x00;
EA=1;
ET0=1;
TR0=1;
key();
}
主函数,设定了定时器的工作方式,定时器初值,调用了key函数。
2.按键逻辑函数
void key()
{
while(1)
{
if(k1==0)
{
counter=1;
while(counter==1)
{
sum1=TL0;
sum2=TH0;
display();
delay(35);
TR0=1;
if(k2==0)
{break;}
}
}
if(k2==0)
{
P2=0x00;
P3=0x00;
sum1=TL0;
sum2=TH0;
TR0=0;
if(k1==0)
{break;}
}
display();
}
}
按键函数中设定了按键控制随机数的产生和显示逻辑,只有K1按下后才会产生随机数,K2按下后会停止并显示当前随机数。
3.显示函数
void display()
{
P2=led[sum1%10];
P3=0xfe;
delay(2);
P3=0xff;
P2=led[sum1/10%10];
P3=0xfd;
delay(2);
P3=0xff;
P2=led[sum2%10];
P3=0xfb;
delay(2);
P3=0xff;
P2=led[sum2/10%10];
P3=0xf7;
delay(2);
P3=0xff;
}
显示函数通过对sum1和sum2的运算得到个位数,并以此为下标在数组内找到对应数字从P3口送出。
全部资料51hei下载地址(Proteus仿真+源程序):
基于51单片机的电子抽奖.zip
(64.41 KB, 下载次数: 52)
|