找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 11402|回复: 12
收起左侧

我的单片机课设四路抢答器—含代码,报告,仿真

  [复制链接]
ID:208940 发表于 2017-6-7 20:08 | 显示全部楼层 |阅读模式
这是我上个月的课设——四路抢答器
参考许多意见,
里面有课程设计报告,源代码,multisim仿真图和实物图。
  1. //独立键盘
  2. #include<reg52.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char

  5. sbit dula=P2^6;
  6. sbit wela=P2^7;
  7. sbit D1=P1^0;
  8. sbit D2=P1^1;
  9. sbit D3=P1^2;
  10. sbit D4=P1^3;
  11. sbit beep=P2^3;
  12. uchar code table[]={
  13. 0x3f,0x06,0x5b,0x4f,
  14. 0x66,0x6d,0x7d,0x07,
  15. 0x7f,0x6f,0x77,0x7c,
  16. 0x39,0x5e,0x79,0x71,0};

  17. uchar key,temp,daojishi=0x1e,x1=0,x2=0,x3=0,x4=0;
  18. bit begin,end,clear;
  19. unsigned int pp,qq;
  20. uchar a0=0;b0=0;c0=0;d0=0;e0=0;f0=3;

  21. void delay(uint z)
  22. {
  23.         uint x,y;
  24.         for(x=z;x>0;x--)
  25.                  for(y=110;y>0;y--);
  26. }

  27. void display(uchar a,uchar b,uchar c,uchar d,uchar e,uchar f)
  28. {
  29.    dula=1;
  30.    P0=table[a];
  31.    dula=0;
  32.    P0=0xff;
  33.    wela=1;
  34.    P0=0xfe;
  35.    wela=0;
  36.    delay(5);
  37. /////////////   
  38.    dula=1;
  39.    P0=table[b];
  40.    dula=0;
  41.    P0=0xff;
  42.    wela=1;  
  43.    P0=0xfd;
  44.    wela=0;
  45.    delay(5);
  46. /////////////////
  47.    dula=1;  
  48.    P0=table[c];
  49.    dula=0;
  50.    P0=0xff;
  51.    wela=1;   
  52.    P0=0xfb;
  53.    wela=0;
  54.    delay(5);
  55. /////////////
  56.    dula=1;  
  57.    P0=table[d];
  58.    dula=0;
  59.    P0=0xff;
  60.    wela=1;   
  61.    P0=0xf7;
  62.    wela=0;
  63.    delay(5);
  64. // //////////////
  65.    dula=1;
  66.    P0=table[e];
  67.    dula=0;
  68.    P0=0xff;
  69.    wela=1;   
  70.    P0=0xef;
  71.    wela=0;
  72.    delay(5);
  73. /////////////  
  74.    dula=1;
  75.    P0=table[f];
  76.    dula=0;
  77.    P0=0xff;
  78.    wela=1;   
  79.    P0=0xdf;
  80.    wela=0;
  81.    delay(5);
  82. }
  83. void keyscan()
  84. {
  85.         //P3^0口按下,矩阵第一行,P3^0        
  86.                 P3=0xfe;
  87.                 temp=P3;
  88.                 temp=temp&0xf0;//如果按下了,那么肯定就和0xf0不相等了
  89.                 while(temp!=0xf0)//有键按下了,此时为真,进入循环
  90.                 {
  91.                         delay(5);//延时后,消除抖动;确认确实是有开关键按下了
  92.                         temp=P3;//重新让temp读取P3口
  93.                         temp=temp&0xf0;
  94.                         D1=1;D2=1;D3=1;D4=1;
  95.                         while(temp!=0xf0)
  96.                         {
  97.                                 temp=P3;//如果没有这条语句,此时的temp值是与0xf0与完后的值。而下面case中是为了给对应的数码管口显示
  98.                                 switch(temp)
  99.                                 {
  100.                                         case 0xee:D1=0;key=1;x1++;      //0xee=11101110  看第一行的哪一列被按下去
  101.                                                 break;//检测到是第一个按键被按下,就跳出这个while循环
  102.                                         case 0xde: D2=0; key=2;x2++; //11011110即第一行第二个按键按下之后显示2;
  103.                                                 break;
  104.                                         case 0xbe:D3=0;key=3;x3++;
  105.                                                 break;
  106.                                         case 0x7e: D4=0;key=4; x4++;
  107.                                                 break;
  108.                                 }
  109.                                 //松手检测
  110.                                 while(temp!=0xf0)//检测是否松手,如果松手两者相等,while条件为假,不执行。但是若是因为抖动,那么就让temp重新与0xf0 AND
  111.                                {         
  112.                                          temp=P3;
  113.                                         temp=temp&0xf0;
  114.                                          beep=0;
  115.                                 }
  116.                                 // beep=1;//按键按下发出响声,松开响声停止
  117.                         }
  118.                 }
  119.                 P3=0xf7;//第四行
  120.                 temp=P3;
  121.                 temp=temp&0xf0;        
  122.                 while(temp!=0xf0)
  123.                 {
  124.                         delay(5);//确认确实有键按下去了
  125.                         temp=P3;
  126.                         temp=temp&0xf0;
  127.                         while(temp!=0xf0)
  128.                         {
  129.                                 temp=P3;
  130.                                 switch(temp)
  131.                                 {
  132.                                         case 0xe7:begin=1;
  133.                                                 break;
  134.                                         case 0xd7: clear=1;
  135.                                                 break;
  136.                                 
  137.                                 }
  138.                                 while(temp!=0xf0)
  139.                             {
  140.                                         temp=P3;
  141.                                         temp=temp&0xf0;
  142.                                          beep=0;
  143.                                 }
  144.                                 // beep=1;
  145.                         }
  146.                 }        
  147. }
  148. void main()
  149. {
  150.         TMOD=0x01;//设置定时器0为工作方式1
  151.         TH0=(65536-46080)/256;// 由于晶振为11.0592,故所记次数应为46080,计时器每隔50000微秒发起一次中断。
  152.         TL0=(65536-46080)%256;//46080的来历,为50000*11.0592/12
  153.         EA=1;//开总中断
  154.         ET0=1;//开定时器0中断
  155.         TR0=1;//启动定时器        
  156.         
  157.         while(1)
  158.         {
  159.                 keyscan();
  160.                 if(key!=0&&key<5)
  161.                 {         
  162.                         if(!end)
  163.                          {
  164.                                 if(key)
  165.                                 {
  166.                                         end=1;
  167.                                         TR0=0;
  168.                                         pp=0;                                
  169.                                 }               
  170.                         }
  171.                         if(key!=0)        
  172.                         {
  173.                                 TR0=1;
  174.                                 if(pp==20)
  175.                                 {
  176.                                         pp=0;
  177.                                         daojishi--;                                       
  178.                                 }
  179.                                 e0=daojishi/10;
  180.                                 f0=daojishi%10;        
  181.                         }        
  182.                         if(!daojishi)               
  183.                                 key=0;
  184.                 }
  185.                 if(begin)
  186.                 switch(key)
  187.                         {
  188.                                 case 1:a0=x1;  if(x1>9) a0=9; break;//
  189.                                 case 2:b0=x2;  if(x2>9) b0=9; break;
  190.                                 case 3:c0=x3;  if(x3>9) c0=9; break;
  191.                                 case 4:d0=x4;  if(x4>9) d0=9; break;
  192.                         }  
  193.                         begin=0;         
  194.                 if(clear)
  195.                         {
  196.                         key=0;end=0;beep=1;
  197.                         daojishi=0x1e;clear=0;         
  198.                         e0=3;f0=0;P1=0xff;
  199.                         a0=x1;c0=x3;b0=x2;d0=x4;
  200.                         }
  201.                         display(a0,b0,c0,d0,e0,f0);                  
  202.         }
  203. }

  204. void time0() interrupt 1
  205. {        TH0=(65536-46080)/256;
  206.         TL0=(65536-46080)%256;
  207.         pp++;
  208. }
复制代码


都是自己原创的,希望大家多多指教。
有意见欢迎交流。

电子技术程设计报告.docx

1.7 MB, 下载次数: 332, 下载积分: 黑币 -5

四路抢答器报告

评分

参与人数 1黑币 +8 收起 理由
叶非夜 + 8

查看全部评分

回复

使用道具 举报

ID:89286 发表于 2017-6-8 08:50 | 显示全部楼层
thanks for sharing
回复

使用道具 举报

ID:408531 发表于 2018-10-12 12:45 | 显示全部楼层

thanks for sharing
回复

使用道具 举报

ID:247623 发表于 2018-10-22 16:43 | 显示全部楼层
有没有计分功能
回复

使用道具 举报

ID:435004 发表于 2018-12-1 19:22 | 显示全部楼层
感谢分享
回复

使用道具 举报

ID:459449 发表于 2019-1-1 22:23 | 显示全部楼层
求仿真图画板
回复

使用道具 举报

ID:468252 发表于 2019-1-14 23:14 | 显示全部楼层

应该是Proteus吧
回复

使用道具 举报

ID:137350 发表于 2019-11-23 09:59 | 显示全部楼层
感谢分享
回复

使用道具 举报

ID:792387 发表于 2020-6-29 08:22 | 显示全部楼层
请问这个下载了源码到单片机中就可以运行吗
回复

使用道具 举报

ID:860900 发表于 2020-12-15 20:24 | 显示全部楼层
thansk sharing
回复

使用道具 举报

ID:783603 发表于 2020-12-16 08:59 | 显示全部楼层
thanks for sharing
回复

使用道具 举报

ID:992517 发表于 2021-12-15 04:51 | 显示全部楼层

thanks for sharing
回复

使用道具 举报

ID:1102312 发表于 2023-12-15 18:07 | 显示全部楼层
求问板载STC89C52单片机能实现代码功能不
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表