找回密码
 立即注册

QQ登录

只需一步,快速开始

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

医院叫号系统单片机程序设计

[复制链接]
跳转到指定楼层
楼主
ID:291220 发表于 2019-6-25 14:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
主机通过按键完成叫号,数码管显示被叫的号,提醒顾客接受服务;
从机通过串行通信方式完成排队取号功能;
从机显示队列中排在其前面的顾客数;

单片机源程序如下:
  1. #include <reg52.h>

  2. #define LED P2
  3. #define KEY P1
  4. #define DIG P0
  5. unsigned char GetKey(void);
  6. void delay10ms(void);
  7. unsigned char val[16] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};


  8. void         initSer (void);          //串口初始化
  9. unsigned char  sendFlag = 0;     //未发送数据时
  10. unsigned char  receFlag =0;                //未接受到数据时
  11. unsigned char key=0;

  12. void sendChar(unsigned char sendValue);  //发送一字节数据

  13. void main(void)
  14. {
  15.         initSer();
  16.         LED=val[key];
  17.         while(1)
  18.         {
  19.           key = GetKey();
  20.                 while(key)                                //单片机串口收到任意数据后,开始向PC发送数据
  21.           {
  22.                     LED=val[key];
  23.                    sendChar(key);         //发送数据
  24.                         key=0;                                //发完了清标志        
  25.           }
  26.         }
  27. }

  28. void serInt() interrupt 4        //中断函数
  29. {
  30.         if(RI)                  //如果收到任意数据
  31.         {
  32.                 RI = 0;
  33.                 P1=SBUF;                //数据的变化让led灯直观反应出来
  34.                 receFlag=1;   //修改接受标志,便于主函数进入while中发数据
  35.         }
  36.         
  37.         if(TI)
  38.         {
  39.                 TI = 0;                    //发送完一个数据
  40.                 sendFlag = 0;        //清标志位
  41.         }
  42. }


  43. void sendChar(unsigned char Value)  //发送一个字节数据
  44. {
  45.          SBUF = Value;     
  46.          sendFlag = 1;       //设置发送标志位,发一字节就置位
  47.          while(sendFlag);         //直到发完数据,将sendFlag清零后,才退出sendChar函数
  48. }

  49. void initSer()                //初始化
  50. {
  51.     //注意:刚上电时,SCON是为0的
  52.         TMOD=TMOD|0x20; //T1定时器模式,工作方式2
  53.         TH1=0Xfd;                   // 256-(11059200/(32*12*9600))
  54.         TL1=0xfd;
  55.         SM0=0;                         //属于SCON寄存器
  56.         SM1=1;                         //串口工作方式1,10位异步,波特率可改
  57.         REN=1;                         //允许串口接收
  58.         ES=1;                         //开串口中断
  59.     EA=1;                         //开总中断
  60.         TR1=1;                 //启动定时器
  61. }

  62. unsigned char GetKey(void)
  63. {
  64. unsigned char hang = 0, lie = 0;
  65. unsigned char keyvalue = 0;
  66. // 第1回合第1步
  67. KEY = 0x0f; // 从IO口输出,写IO口
  68. if (KEY != 0x0f)// 从IO口输入,读IO口
  69. {
  70. // 读出的不是0x0f说明有按键被按下
  71. // 第1回合第2步:读出端口从读出值来判断是哪一行
  72. delay10ms();
  73. // 第一回合中算出行号
  74. switch (KEY)
  75. {
  76. case 0x0e:hang = 1; break;
  77. case 0x0d: hang = 2; break;
  78. case 0x0b: hang = 3; break;
  79. case 0x07: hang = 4; break;
  80. default: break;
  81. }
  82. // 第2回合第1步
  83. KEY = 0xf0;
  84. if (KEY != 0xf0)
  85. {
  86. switch (KEY)
  87. {
  88. case 0xe0:lie = 1; break;
  89. case 0xd0: lie = 2; break;
  90. case 0xb0: lie = 3; break;
  91. case 0x70: lie = 4; break;
  92. default: break;
  93. }
  94. // 经过2个回合后hang和lie都知道了,然后根据hang和lie去计算键值即可
  95. keyvalue = (hang - 1) * 4 + lie;
  96. return keyvalue;
  97. }
  98. }
  99. return 0;
  100. }

  101. void delay10ms(void)  //误差 0us
  102. {
  103. unsigned char a,b,c;
  104. for(c=5;c>0;c--)
  105.          for(b=4;b>0;b--)
  106.                  for(a=248;a>0;a--);
  107. }
复制代码

所有程序51hei提供下载:
kunkun.zip (58.49 KB, 下载次数: 27)



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

使用道具 举报

沙发
ID:247623 发表于 2019-7-1 16:29 | 只看该作者
里面只有程序吗?还是仿真加程序的
回复

使用道具 举报

板凳
ID:291220 发表于 2021-12-15 08:24 | 只看该作者
yilinghai 发表于 2019-7-1 16:29
里面只有程序吗?还是仿真加程序的

程序仿真都有
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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