找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于51单片机的智能抢答器程序

[复制链接]
跳转到指定楼层
楼主
ID:352412 发表于 2018-6-15 11:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
抢答器
  1. #include<reg52.h>
  2. #include<intrins.h>

  3. sbit RS = P2^0; //定义端口
  4. sbit RW = P2^1;
  5. sbit EN = P2^2;
  6. sbit s  = P2^7;
  7. sbit s0 = P1^0;
  8. sbit s1 = P1^1;
  9. sbit s2 = P1^2;
  10. sbit s3 = P1^3;
  11. sbit s4 = P1^4;
  12. sbit s5 = P1^5;
  13. sbit s6 = P1^6;
  14. sbit s7 = P1^7;
  15. sbit beep = P3^7;

  16. #define RS_CLR RS=0
  17. #define RS_SET RS=1
  18. #define RW_CLR RW=0
  19. #define RW_SET RW=1
  20. #define EN_CLR EN=0
  21. #define EN_SET EN=1
  22. #define DataPort P0

  23. unsigned char table[10] ={'0','1','2','3','4','5','6','7','8','9'};
  24. unsigned char shu,key,count=0;
  25. unsigned char flag=0;
  26. unsigned char DATA,num;

  27. //uS 延时函数
  28. void DelayUs2x(unsigned char t)
  29. {
  30.         while(--t);
  31. }

  32. //mS 延时函数
  33. void DelayMs(unsigned int t)
  34. {
  35.         while(t--)
  36. {
  37. //延时 1mS
  38. DelayUs2x(245);
  39. DelayUs2x(245);
  40. }
  41. }

  42. //判忙函数
  43. bit LCD_Check_Busy(void)
  44. {
  45.         DataPort= 0xFF;
  46.         RS_CLR;
  47.         RW_SET;
  48.         EN_CLR;
  49.         _nop_();
  50.         EN_SET;
  51.         return (bit)(DataPort & 0x80);
  52. }

  53. //写入命令函数
  54. void LCD_Write_Com(unsigned char com)
  55. {
  56.         while(LCD_Check_Busy()); // 忙则等待
  57.         RS_CLR;
  58.         RW_CLR;
  59.         EN_SET;
  60.         DataPort= com;
  61.         _nop_();
  62.         EN_CLR;
  63. }

  64. // 写入数据函数
  65. void LCD_Write_Data(unsigned char Data)
  66. {
  67.         while(LCD_Check_Busy()); // 忙则等待
  68.         RS_SET;
  69.         RW_CLR;
  70.         EN_SET;
  71.         DataPort= Data;
  72.         _nop_();
  73.         EN_CLR;
  74. }

  75. //清屏函数
  76. void LCD_Clear(void)
  77. {
  78.         LCD_Write_Com(0x01);
  79.         DelayMs(5);
  80. }

  81. //写入字符串函数
  82. void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
  83. {
  84.         if (y == 0)
  85.         {
  86.                 LCD_Write_Com(0x80 + x); //表示第一行
  87.         }
  88.         else
  89.         {
  90.                 LCD_Write_Com(0xC0 + x); //表示第二行
  91.         }
  92.         while (*s)
  93.         {                 
  94.                 LCD_Write_Data( *s);
  95.                 s ++;
  96.         }
  97. }

  98. //写入字符函数
  99. void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)
  100. {
  101.         if (y == 0)
  102.         {
  103.                 LCD_Write_Com(0x80 + x);
  104.         }
  105.         else
  106.         {
  107.                 LCD_Write_Com(0xC0 + x);
  108.         }
  109.                 LCD_Write_Data( Data);
  110. }

  111. //初始化函数
  112. void LCD_Init(void)
  113. {
  114.         LCD_Write_Com(0x38); //显示模式设置
  115.         DelayMs(5);         
  116.         LCD_Write_Com(0x38);
  117.         DelayMs(5);
  118.         LCD_Write_Com(0x38);
  119.         DelayMs(5);
  120.         LCD_Write_Com(0x38);
  121.         LCD_Write_Com(0x08); //显示关闭
  122.         LCD_Write_Com(0x01); //显示清屏
  123.         LCD_Write_Com(0x06); //显示光标移动设置
  124.         DelayMs(5);
  125.         LCD_Write_Com(0x0C); //显示开及光标设置
  126. }

  127. //定时器中断子程序
  128. void Timer0_isr(void)interrupt 1
  129. {
  130.         unsigned char temp,temp1,i,j=2;
  131.         TH0=(65536-50000)/256;// 重新赋值 50ms
  132.         TL0=(65536-50000)%256;
  133.         // beep=~beep;
  134.         // DelayMs(100);
  135.         i++;
  136.         if(i==20)
  137.         {
  138.                 i=0;
  139.                 DATA--;
  140.                 if(DATA>0)
  141.                 {
  142.                         DelayMs(50);
  143.                         temp=DATA/10;
  144.                         temp1=DATA%10;
  145.                         LCD_Write_Char(7,1,table[temp]);
  146.                         LCD_Write_Char(8,1,table[temp1]);
  147.                 }
  148.                 else if(DATA==0)
  149.                 {
  150.                         P1=0xFF;
  151.                         ET0=0;
  152.                         DelayMs(50);
  153.                         LCD_Write_Char(7,1,'0');
  154.                         LCD_Write_Char(8,1,'0');
  155.                         for(;j--;j>0)
  156.                         {                        
  157.                                 beep=0;
  158.                                 DelayMs(500);
  159.                                 beep=1;
  160.                         }
  161.                 }
  162.         }
  163. }

  164. void beepon(void)
  165. {
  166.         unsigned char i;
  167.         for(i=0;i<10;i++)
  168.         {
  169.                 beep=0;
  170.                 DelayMs(50);
  171.                 beep=1;
  172.         }
  173. }

  174. unsigned char keyscan(void)
  175. {
  176.         unsigned char scan1;
  177.         scan1=P1;
  178.         if(scan1!=0xff)
  179.         {
  180.                 DelayMs(30);
  181.                 if(scan1==P1)
  182.                 {
  183.                         switch(scan1)
  184.                         {
  185.                                 case 0xff:
  186.                                 scan1 = 0;
  187.                                 break;
  188.                                 case 0xfe:
  189.                                 scan1 = 1;
  190.                                 break;
  191.                                 case 0xfd:
  192.                                 scan1 = 2;
  193.                                 break;
  194.                                 case 0xfb:
  195.                                 scan1 = 3;
  196.                                 break;
  197.                                 case 0xf7:
  198.                                 scan1 = 4;
  199.                                 break;
  200.                                 case 0xef:
  201.                                 scan1 = 5;
  202.                                 break;
  203.                                 case 0xdf:
  204.                                 scan1 = 6;
  205.                                 break;
  206.                                 case 0xbf:
  207.                                 scan1 = 7;
  208.                                 break;
  209.                                 case 0x7f:
  210.                                 scan1 = 8;
  211.                                 break;
  212.                         }
  213.                 }
  214.         }
  215.         else
  216.         scan1=0;
  217.         return(scan1);
  218. }

  219. void display(void)
  220. {
  221.         unsigned char a,b;
  222.         key=keyscan();
  223.         if(key!=0 & flag==0 )
  224.         {
  225.                 ET0=0;
  226.                 count++;
  227.                 DelayMs(200);         
  228.                 LCD_Write_Char(10,0,table[key]);
  229.                 flag=1;
  230.                 a=(shu-DATA)/10;
  231.                 b=(shu-DATA)%10;
  232.                 LCD_Write_Char(7,1,table[a]);
  233.                 LCD_Write_Char(8,1,table[b]);
  234.         }
  235. }

  236. void main(void)
  237. {
  238.         unsigned char k;
  239.         unsigned a,b;
  240.         LCD_Init(); //初始化液晶
  241.         DelayMs(20); //延时有助于稳定
  242.         LCD_Clear(); //清屏
  243.         LCD_Write_String(0,1,"time");
  244.         LCD_Write_String(0,0,"xuanshou");
  245.         //Init_Timer0(); //定时器 0 初始化
  246.         while(count==0)
  247.         {         
  248.                 if(s0==0)
  249.                 {
  250.                         DelayMs(10);
  251.                         if(s0==0)
  252.                         {
  253.                                 count++;
  254.                                 while(count==1)
  255.                                 {
  256.                                         if(s==0)
  257.                                         {
  258.                                                 DelayMs(10);
  259.                                                 if(s==0)
  260.                                                 {
  261.                                                         while(!s);
  262.                                                         count++;
  263.                                                 }
  264.                                         }
  265.                         if(s1==0)
  266.                         {
  267.                                 DelayMs(10);
  268.                                 if(s1==0)
  269.                                 {
  270.                                         while(!s1);
  271.                                         {
  272.                                                 DATA++;
  273.                                                 shu=DATA;
  274.                                                 if (DATA==31) {DATA=0;count=0;}
  275.                                                 a=DATA/10;         
  276.                                                 b=DATA%10;
  277.                                                 LCD_Write_Char(7,1,table[a]);
  278.                                                 LCD_Write_Char(8,1,table[b]);
  279.                                         }
  280.                                 }
  281.                         }
  282. }
  283.         while(count==2)
  284.         {
  285. TMOD |= 0x01; //使用模式 1,16 位定时器,使用 "|"符号可以在 使用多个定时器时不受影响
  286. TH0=(65536-50000)/256;// 重新赋值 50ms
  287. TL0=(65536-50000)%256;
  288. EA=1; //总中断打开
  289. ET0=1; //定时器中断打开
  290. TR0=1; //定时器开关
  291.         
  292. }
  293.         }
  294. }
  295.                 }
  296.         }
复制代码


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

使用道具 举报

沙发
ID:975218 发表于 2021-10-26 20:56 | 只看该作者
大佬,有proteus原理图吗?
回复

使用道具 举报

板凳
ID:262 发表于 2021-10-26 23:12 | 只看该作者
电子专业新人 发表于 2021-10-26 20:56
大佬,有proteus原理图吗?

仿真可以参考这个:http://www.51hei.com/bbs/dpj-123579-1.html
或者找其他的 论坛里面有上百个
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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