仿真版本:Proteus8.6及以上版本
程序编译:Keil5 C51
编程语言:C语言
设计编号:【X04】
1.? 简介
? 本文提出了一种基于51单片机的7人表决器设计。本系统由AT89C51单片机为控制核心,要求其具有指示表决开始、指示表决结束、显示表决人数、显示表决结果、显示表决倒计时时间、结束指示等功能。
2.? 主要功能
a.支持数码管显示表决结果,表决通过显示“1”,不通过显示“0”。
b.支持按键实现开始、暂停、复位等操作。
c.在主持人控制下,10秒内表决有效。
d.支持表决的人,对应的LED灯发光。
3.? 源程序(Keil5)
本设计采用keil5 C51软件(内附安装包)实现程序设计。如需用keil4打开程序,可自行通过.c和.h文件新建工程即可。
sbit smg1=P2^4; //定义数码管第一位
sbit smg2=P2^6; //定义数码管第二位
sbit smg3=P2^7; //定义数码管第三位
sbit smg4=P2^5; //定义数码管第四位
sbit keyks=P2^2; //定义开始按键
sbit keyqc=P2^0; //定义复位按键
sbit key1=P1^0; //定义1号表决人
sbit key2=P1^1; //定义2号表决人
sbit key3=P1^2; //定义3号表决人
sbit key4=P1^3; //定义4号表决人
sbit key5=P1^4; //定义5号表决人
sbit key6=P1^5; //定义6号表决人
sbit key7=P1^6; //定义7号表决人
sbit l1=P3^0; //定义第1灯
sbit l2=P3^1; //定义第2灯
sbit l3=P3^2; //定义第3灯
sbit l4=P3^3; //定义第4灯
sbit l5=P3^4; //定义第5灯
sbit l6=P3^5; //定义第6灯
sbit l7=P3^6; //定义第7灯
sbit zt=P2^1; //定义暂停
sbit spk=P1^7; //定义蜂鸣器
int djs,js=0; //djs和bt是初始倒计时时间
//flag1~7用来保证在未开始表决之前误按 flagD用来控制是否显示倒计时 bjs表决计数
int flag1=0,flag2=0,flag3=0,flag4=0,flag5=0,flag6=0,flag7=0,flagD=0,bjs=0;
int table[]={0x5f,0x44,0x9d,0xd5,0xc6,0xd3,0xdb,0x45,0xdf,0xd7,0x80,0x9b};
// 0 1 2 3 4 5 6 7 8 9 E
void delayms(unsigned z)
{
unsigned x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void Timer0_init() //定时器0初始化
{
js=0;
TMOD=0x01; //设置定时器0为工作方式1(M1M0为01)
TH0=(65536-45872)/256; //装初值11.0592M晶振定时50ms数为45872
TL0=(65536-45872)%256;
ET0=1; //开定时器0中断
EA=1; //开总中断
}
void timer0() interrupt 1 using 1 //定时器0中断服务函数
{
TH0=(65536-45872)/256; //装初值11.0592M晶振定时50ms数为45872
TL0=(65536-45872)%256;
js++; //叠加20次
if(js==20)
{
js=0; //清空
djs--; //产生1s的倒计时
}
}
void djsxs() //显示倒计时函数
{
int b1,b2;
b1=djs/10;
b2=djs%10; //将倒计时时间分成高低位
P0=table[b1];
smg2=0;
delayms(3);
smg2=1; //显示十位数字
P0=table[b2];
smg3=0;
delayms(3); //显示个位数字
smg3=1;
}
void djsxs10() //第一位数码管显示 0
{
P0=0x5f; //第一位数码管显示0
smg1=0;
delayms(3);
smg1=1;
}
void djsxs11() //第一位数码管显示1
{
P0=0x44; //第一位数码管显示1
smg1=0;
delayms(3);
smg1=1;
}
void djsxs20() //第二位数码管显示 -
{
P0=0x80; //第二位数码管显示-
smg4=0;
delayms(3);
smg4=1;
}
void djsxs30() //第三位数码管显示 -
{
P0=0x80; //第三位数码管显示-
smg2=0;
delayms(3);
smg2=1;
}
void djsxs0() //第四位数码管显示0
{
P0=table[0];
smg3=0;
delayms(3);
smg3=1; //第四位数码管显示0
}
void djsxs1() //第四位数码管显示1
{
P0=table[1]; //第四位数码管显示1
smg3=0;
delayms(3);
smg3=1;
}
void djsxs2() //第四位数码管显示2
{
P0=table[2];
smg3=0;
delayms(3);
smg3=1; //第四位数码管显示2
}
void djsxs3() //第四位数码管显示3
{
P0=table[3];
smg3=0;
delayms(3);
smg3=1; //第四位数码管显示3
}
void djsxs4() //第四位数码管显示4
{
P0=table[4];
smg3=0;
delayms(3);
smg3=1; //第四位数码管显示4
}
void djsxs5() //第四位数码管显示5
{
P0=table[5];
smg3=0;
delayms(3);
smg3=1; //第四位数码管显示5
}
void djsxs6() //第四位数码管显示6
{
P0=table[6];
smg3=0;
delayms(3);
smg3=1; //第四位数码管显示6
}
void djsxs7() //第四位数码管显示7
{
P0=table[7];
smg3=0;
delayms(3);
smg3=1; //第四位数码管显示7
}
4.? 仿真proteus8.6
? 本设计采用proteus8.6软件(内附安装包)实现仿真设计,如下图所示。proteus软件一般存在高低版本兼容问题,该仿真是通过proteus8.6导出的,所以请尽量使用proteus8.6打开文件,低于proteus8.6的版本不能够正常使用,高于proteus8.6的版本除了proteus8.8/8.9理论上可以正常使用。
表决通过:
表决失败:
5.? 设计报告
设计报告主要包括硬件电路、软件设计、仿真调试等等,仅供参考。
6.? 资料清单
设计资料主要包括C程序+仿真+设计报告+使用说明+元件清单+操作视频等。
7.? 资料获取链接
百度网盘下载链接:【X04】百度网盘下载链接
更多单片机仿真设计合集:单片机仿真设计合集
981