找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2446|回复: 1
打印 上一主题 下一主题
收起左侧

一个简单的抢答器仿真和单片机源代码

[复制链接]
跳转到指定楼层
楼主
一个简单实用的抢答器仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:

  1. #include <pic.h>
  2. __CONFIG(XT&WDTDIS);

  3. #define TIMER1 (65536-2000)

  4. unsigned char LED1=0;
  5. unsigned char LED2=0;
  6. unsigned char LED3=0;
  7. unsigned char LED4=0;
  8. unsigned char LED_L=0;
  9. unsigned int time=0;

  10. const unsigned char table[11]=
  11. {
  12. 0x3f,   //0
  13. 0x06,   //1
  14. 0x5b,        //2
  15. 0x4f,        //3
  16. 0x66,        //4
  17. 0x6d,        //5
  18. 0x7d,        //6
  19. 0x07,        //7
  20. 0x7f,        //8
  21. 0x6f,        //9
  22. 0x00,
  23. };
  24. void timer1init(void)//初始化
  25. {
  26.         T1CON=0X01; //打开定时器1
  27.         TMR1IF=0; //清除TMR1中断标志
  28.         TMR1IE=1; //TMR1中断允许
  29.         TMR1H=TIMER1>>8; //赋初值,以便TMR1每2MS左右中断一次
  30.         TMR1L=TIMER1;
  31.         PIR1=0; //清除所有中断标志
  32.         PEIE=1; //允许外围总中断 INTCON寄存器
  33.         GIE=1; //总中断开关打开 INTCON寄存器
  34.        
  35. }
  36. void interrupt T1(void)//中断处理
  37. {
  38.         if(TMR1IF==1)//如果是定时器1中断
  39.         {
  40.                 time++;//利用time的值来判断时间
  41.         TMR1IF=0;//清除定时器1中断标志
  42.         TMR1H=TIMER1>>8;//重新复初值
  43.         TMR1L=TIMER1;
  44.         switch(LED_L)
  45.         {
  46.                 case 0://点亮第一个数码管
  47.                 RE2=1;
  48.                 RE1=0;
  49.                 RE0=0;
  50.                 RA5=table[LED1];
  51.                 PORTB = table[LED1];
  52.                 LED_L = 1;
  53.                 break;
  54.                 case 1://点亮第二个数码管
  55.                 RE2=0;
  56.                 RE1=1;
  57.                 RE0=0;
  58.                 RA5=table[LED2];
  59.                 PORTB = table[LED2];
  60.                 LED_L = 2;
  61.                 break;
  62.                 case 2:
  63.                 RE2=1;
  64.                 RE1=1;
  65.                 RE0=0;
  66.                 RA5=table[LED3];
  67.                 PORTB = table[LED3];
  68.                 LED_L = 3;
  69.                 break;
  70.                 case 3:
  71.                 RE2=0;
  72.                 RE1=0;
  73.                 RE0=1;
  74.                 RA5=table[LED4];
  75.                 PORTB = table[LED4];
  76.                 LED_L = 0;
  77.                 break;
  78.                 default://语句d
  79.                 LED_L = 0;
  80.                 break;
  81.         }
  82.         }
  83. }


  84. delay(unsigned int n);
  85. void port_set();
  86. void ready();
  87. void check();
  88. void reset();

  89. main()                                //主函数开始
  90. {
  91.         port_set();
  92.         while(1)
  93.         {
  94.                 RD7=1;
  95.                 ready();
  96.                 RD7=0;
  97.                 delay(5);
  98.                 check();
  99.                 reset();       
  100.         }
  101. }                                        //主函数结束



  102. void port_set()//端口设置
  103. {
  104.         int a=1,b=0;
  105.         ADCON1=0X06;//初始化
  106.         TRISA5=0;
  107.         TRISA1=0;
  108.         TRISB=0;
  109.         TRISE=0;
  110.         TRISD=0X01;
  111.         PORTD=0XF0;
  112.         timer1init();//定时器1初始化
  113.         RA1=1;//使能138译码器
  114.         LED1=0;//数码管1显示
  115.         LED2=0;
  116.         LED3=0;
  117.         LED4=0;

  118. }

  119. void ready()//准备函数
  120. {
  121.         if(RD0==1)
  122.         {
  123.                 delay(10);
  124.                 if(RD0==1)
  125.                 {
  126.                         RD6=0;
  127.                         RD5=0;
  128.                         RD4=0;
  129.                         LED4=8;
  130.                         LED1=8;
  131.                         LED2=8;
  132.                         LED3=8;
  133.                 }
  134.                 while(RD0==1);
  135.         }
  136. }

  137. void check()//校对函数,查看抢答成功
  138. {
  139. if(LED4==8)
  140.                 {
  141.                         RD4=1;
  142.                         if(RD0==1)
  143.                         {
  144.                                 delay(10);       
  145.                                 if(RD0==1)
  146.                                 {
  147.                                         LED1=1;
  148.                                         LED4=1;
  149.                                         LED2=8;
  150.                                         LED3=8;
  151.                                 }
  152.                                 while(RD0==1);                       
  153.                         }
  154.                         RD4=0;
  155.                         delay(1);
  156.                         RD5=1;
  157.                         if(RD0==1)
  158.                         {
  159.                                 delay(10);       
  160.                                 if(RD0==1)
  161.                                 {

  162.                                         LED2=2;
  163.                                         LED4=2;
  164.                                         LED1=8;
  165.                                         LED3=8;
  166.                                 }
  167.                                 while(RD0==1);       
  168.                         }
  169.                         RD5=0;
  170.                         delay(1);
  171.                         RD6=1;
  172.                         if(RD0==1)
  173.                         {
  174.                                 delay(10);       
  175.                                 if(RD0==1)
  176.                                 {
  177.                                         LED3=3;
  178.                                         LED4=3;
  179.                                         LED1=8;
  180.                                         LED2=8;
  181.                                 }
  182.                                 while(RD0==1);       
  183.                         }
  184.                         RD6=0;
  185.                 }
  186. }

  187. void reset()//当一轮抢答结束后,长按1s后复位
  188. {
  189.         if(LED4==1|LED4==2|LED4==3)
  190.         {
  191.                 RD7=1;
  192.                 while(RD7=1)
  193. ……………………

  194. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
qiangdaqi.rar (139.81 KB, 下载次数: 8)




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:272898 发表于 2018-1-8 12:02 | 只看该作者
谢谢分享
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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