|
本帖最后由 1979759100Ls 于 2022-5-20 02:40 编辑
原创!!!全网没有找到,所以自己做了一个51单片机七人多数表决器!!
规定的要求如下:
用时两天,创作不易,请留下点赞,myQ制作736142345,纯粹个人兴趣,现在分享给大家,还参考别人的文档做了一个WORD说明书(文档),也一并上传了,在附件里,自取。文件全部放在附件中了,自行下载,包含仿真、程序+详细注释,原理图和PCB,非常详细。实际测试仿真是完全没问题的,实物没来的及做,数码管显示可能会出现驱动不足的问题,增加控制端口的驱动即可,猜测是这样,感兴趣的可以试一试!欢迎积极留言讨论。
- 单片机源程序如下:
- #include<reg51.h>
- #include<intrins.h>
- sbit smg1=P2^0; //定义数码管第一位
- sbit smg2=P2^1; //定义数码管第二位
- sbit smg3=P2^2; //定义数码管第三位
- sbit smg4=P2^3; //定义数码管第四位
- sbit smg5=P2^4; //定义数码管第五位
- sbit smg6=P2^5; //定义数码管第六位
- sbit keyks=P3^7; //定义开始按键
- sbit spk=P3^2; //定义蜂鸣器
- int djs,js=0; //djs和js是初始倒计时时间
- int buzzbiaozhi=1; //10S倒计时结束后蜂鸣器响一下的标志位
- //int buzzbiaozhi1=1; //开始投票按键按下标志位//矩阵
- int flag1=0,flag2=0,flag3=0,flag4=0,flag5=0,flag6=0,flag7=0,flag8=0,flag9=0,
- flag10=0,flag11=0,flag12=0,flag13=0,flag14=0,flagD=0,bjs=0;bjs1;bjs2;
- //flag1~14用来保证在同意和反对的唯一性 , flagD用来控制是否显示倒计时, bjs表决总计数,bjs1同意计数,bjs2反对计数
- unsigned char key_num; //按键键值返回值
- int table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x77,0x5c,0X73,0X71}; /// 共阴 cc 数码管段码
- // // 0 1 2 3 4 5 6 7 8 9 - A o P f ///
- //******延时程序****//
- void delayms(unsigned z)
- {
- unsigned x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- ////****矩阵按键判键程序*****///
- unsigned char key_scan() //有返回值
- {
- unsigned char key_temp0,key_temp1;
- unsigned char key_num=0;
- P1=0x0f;
- key_temp0=P1; //读取P1端口的值
- if(key_temp0!=0x0f)
- {
- delayms(5); //延时去抖动
- key_temp0=P1; //再次读取P1端口的值
- if(key_temp0!=0x0f)
- {
- P1=0xf0;
- key_temp1=P1;
- if(key_temp0==0x0e) //判断第一行
- {
- switch(key_temp1)
- {
- case 0xe0: key_num=4;break; //检测到第一行第四个键按下
- case 0xd0: key_num=3;break; //检测到第一行第三个键按下
- case 0xb0: key_num=2;break; //检测到第一行第二个键按下
- case 0x70: key_num=1;break; //检测到第一行第一个键按下
- default:key_num=0;break;
- }
- }
- else if(key_temp0==0x0d) //判断第二行
- {
- switch(key_temp1)
- {
- case 0xe0: key_num=8;break; //检测到第二行第四个键按下
- case 0xd0: key_num=7;break; //检测到第二行第三个键按下
- case 0xb0: key_num=6;break; //检测到第二行第二个键按下
- case 0x70: key_num=5;break; //检测到第二行第一个键按下
- default:key_num=0;break;
- }
- }
- else if(key_temp0==0x0b) //判断第三行
- {
- switch(key_temp1)
- {
- case 0xe0: key_num=12;break; //检测到第三行第四个键按下
- case 0xd0: key_num=11;break; //检测到第三行第三个键按下
- case 0xb0: key_num=10;break; //检测到第三行第二个键按下
- case 0x70: key_num=9;break; //检测到第三行第一个键按下
- default:key_num=0;break;
- }
- }
- else if(key_temp0==0x07) //判断第四行
- {
- switch(key_temp1)
- {
- case 0xe0: key_num=16;break; //检测到第四行第四个键按下
- case 0xd0: key_num=15;break; //检测到第四行第三个键按下
- case 0xb0: key_num=14;break; //检测到第四行第二个键按下
- case 0x70: key_num=13;break; //检测到第四行第一个键按下
- default:key_num=0;break;
- }
- }
- }
- }
- return key_num;
- }
- void Timer0_init() //定时器0初始化
- {
- js=0;
- TMOD=0x01; //设置定时器0为工作方式1(M1M0为01)
- TH0=(65536-50000)/256; //装初值12M晶振定时50ms数为50000,1US是1000初始值,所以50ms是5万
- TL0=(65536-50000)%256;
- ET0=1; //开定时器0中断
- EA=1; //开总中断
- }
- void timer0() interrupt 1 using 1 //定时器0中断服务函数
- {
- TH0=(65536-50000)/256; //装初值12M晶振定时50ms数为50000
- TL0=(65536-50000)%256;
- js++; //叠加20次
- if(js==20)
- {
- js=0; //清空
- djs--; //产生1s的倒计时
- }
- }
- ///倒计时函数////
- void djsxs() //第一位,第二位显示倒计时函数
- {
- int b1,b2;
- b1=djs/10;
- b2=djs%10; //将倒计时时间分成高低位
- P0=table[b1];
- smg1=0; //第1位显示十位
- delayms(3);
- smg1=1; //显示十位数字
- P0=table[b2];
- smg2=0; //第2位显示各位
- delayms(3); //显示个位数字
- smg2=1;
- }
- //**显示P通过,显示F没通过**//
- void djsxs01() //第一位数码管显示 P表示通过
- {
- P0=0X73; //第一位数码管显示P
- smg1=0;
- delayms(3);
- smg1=1;
- }
- void djsxs10() //第一位数码管显示F 表示没通过
- {
- P0=0X71; //第一位数码管显示F
- smg1=0;
- delayms(3);
- smg1=1;
- }
- //**第三位显示A,第五位显示0**//
- void djsxs20() //第三位数码管显示 A
- {
- P0=0X77; //第三位数码管显示A
- smg3=0;
- delayms(3);
- smg3=1;
- }
- void djsxs30() //第五位数码管显示 -
- {
- P0=0x5c; //第五位数码管显示0
- smg5=0;
- delayms(3);
- smg5=1;
- }
- ////*****计数显示,第四位显示同意人数 *********///////
- void djsxs0() //第四位数码管显示0
- {
- P0=table[0];
- smg4=0;
- delayms(3);
- smg4=1; //第四位数码管显示0
- }
- void djsxs1() //第四位数码管显示1
- {
- P0=table[1]; //第四位数码管显示1
- smg4=0;
- delayms(3);
- smg4=1;
- }
- void djsxs2() //第四位数码管显示2
- {
- P0=table[2];
- smg4=0;
- delayms(3);
- smg4=1; //第四位数码管显示2
- }
- void djsxs3() //第四位数码管显示3
- {
- P0=table[3];
- smg4=0;
- delayms(3);
- smg4=1; //第四位数码管显示3
- }
- void djsxs4() //第四位数码管显示4
- {
- P0=table[4];
- smg4=0;
- delayms(3);
- smg4=1; //第四位数码管显示4
- }
- void djsxs5() //第四位数码管显示5
- {
- P0=table[5];
- smg4=0;
- delayms(3);
- smg4=1; //第四位数码管显示5
- }
- void djsxs6() //第四位数码管显示6
- {
- P0=table[6];
- smg4=0;
- delayms(3);
- smg4=1; //第四位数码管显示6
- }
- void djsxs7() //第四位数码管显示7
- {
- P0=table[7];
- smg4=0;
- delayms(3);
- smg4=1; //第四位数码管显示7
- }
- ////*****计数显示,第六位显示不同意人数 *********///////
- void djsxs00() //第六位数码管显示0
- {
- P0=table[0];
- smg6=0;
- delayms(3);
- smg6=1; //第六位数码管显示0
- }
- void djsxs11() //第六位数码管显示1
- {
- P0=table[1]; //第六位数码管显示1
- smg6=0;
- delayms(3);
- smg6=1;
- }
- void djsxs22() //第六位数码管显示2
- {
- P0=table[2];
- smg6=0;
- delayms(3);
- smg6=1; //第六位数码管显示2
- }
- void djsxs33() //第六位数码管显示3
- {
- P0=table[3];
- smg6=0;
- delayms(3);
- smg6=1; //第六位数码管显示3
- }
- void djsxs44() //第六位数码管显示4
- {
- P0=table[4];
- smg6=0;
- delayms(3);
- smg6=1; //第六位数码管显示4
- }
- void djsxs55() //第六位数码管显示5
- {
- P0=table[5];
- smg6=0;
- delayms(3);
- smg6=1; //第六位数码管显示5
- }
- void djsxs66() //第六位数码管显示6
- {
- P0=table[6];
- smg6=0;
- delayms(3);
- smg6=1; //第六位数码管显示6
- }
- void djsxs77() //第六位数码管显示7
- {
- P0=table[7];
- smg6=0;
- delayms(3);
- smg6=1; //第六位数码管显示7
- }
- void main()
- {
- //buzzbiaozhi1=0; //开始按键标志位//矩阵
- bjs=0; //总表决计数
- bjs1=0; //同意票数统计
- bjs2=0; //反对票数统计
- djs=10; //修改倒计时初始值
- Timer0_init(); //初始化定时器中断
- while(1)
- {
- key_num=key_scan();
- ////// if(key_num==16) ///测试按键位置 横着按键排布为1 2 3 4第二排5 6 7 8,顺延9 10 11 12,13 14 15 16//
- ////// { djsxs0();
- ////// }
- ////////////////////////////////////////////////////////////////////////////////////////////////
- if(djs<=0) //倒计时10s时间到
- {
- // buzzbiaozhi1=0;
- flagD=0; //不再显示时间
- TR0=0; //关闭定时器
- flag1=0,flag2=0,flag3=0,flag4=0,flag5=0,flag6=0,flag7=0;flag8=0,flag9=0,flag10=0,flag11=0,flag12=0,flag13=0,flag14=0; //关闭选手的按键
- // switch(bjs) //显示结果,此处显示 1或0(通不通过) -- 同意人数
- // {
- // case 0: djsxs10();break;
- // case 1: djsxs10();break;
- // case 2: djsxs10();break; //老方法太麻烦那
- // case 3: djsxs10();break;
- // case 4: djsxs11();break;
- // case 5: djsxs11();break;
- // case 6: djsxs11();break;
- // case 7: djsxs11();break;
- // default: ;
- // }
- /////*****判断是否通过******/////// //新方法好用
- if(bjs1>=4) djsxs01();
- if(bjs1<4) djsxs10(); //大于四票显示通过,P代表通过 ,否则不通过 ,F表示
- 附件里下载哈
复制代码
|
-
%C(1WJ}V[U77240T}2QU5}N.png
(24.07 KB, 下载次数: 72)
原理图
-
_~V9I[DR{FVS{WV([T)G0L2.png
(49.59 KB, 下载次数: 72)
PCB
-
0O66Q3~28H]IHXK51WR54R6.png
(70.21 KB, 下载次数: 134)
主流程图
-
WJ84](1LIAQF73`1D0@E1UE.png
(180.96 KB, 下载次数: 148)
Proteus仿真效果图
-
-
表决器程序 注释.rar
42.85 KB, 下载次数: 48, 下载积分: 黑币 -5
程序
-
-
7人多数表决器设计嘿嘿嘿.docx
1.74 MB, 下载次数: 27, 下载积分: 黑币 -5
文档
-
-
表决器仿真.rar
172.45 KB, 下载次数: 36, 下载积分: 黑币 -5
仿真
-
-
biaojueqi-yuanlitu -原理图-模块化.rar
3.57 MB, 下载次数: 15, 下载积分: 黑币 -5
pcb+原理图
评分
-
查看全部评分
|