找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于At89c51的病房呼叫系统Proteus仿真+程序

  [复制链接]
ID:449536 发表于 2019-2-21 12:27 | 显示全部楼层 |阅读模式
基于At89c51的病房呼叫系统仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png

单片机源程序如下:
  1. #include <reg52.h>                 //调用单片机头文件
  2. #define uchar unsigned char  //无符号字符型 宏定义        变量范围0~255
  3. #define uint  unsigned int         //无符号整型 宏定义        变量范围0~65535

  4. uchar code table_num[]="0123456789abcdefg";

  5. sbit rs=P2^5;         //寄存器选择信号 H:数据寄存器          L:指令寄存器
  6. sbit rw=P2^6;         //寄存器选择信号 H:数据寄存器          L:指令寄存器
  7. sbit e =P2^7;         //片选信号   下降沿触发

  8. sbit beep = P2^4;

  9. sbit key_quan = P2^0;         

  10. sbit key_quxiao = P2^1;          //取消键


  11. uchar flag_en;
  12. uchar i;

  13. bit flag_300ms ;    //300ms的标志位

  14. sbit led1 = P1^0;   //第1号病房指示灯
  15. sbit led2 = P1^1;   //第2号病房指示灯
  16. sbit led3 = P1^2;   //第3号病房指示灯
  17. sbit led4 = P1^3;   //第4号病房指示灯
  18. sbit led5 = P1^4;   //第5号病房指示灯
  19. sbit led6 = P1^5;   //第6号病房指示灯
  20. sbit led7 = P1^6;   //第7号病房指示灯
  21. sbit led8 = P1^7;   //第8号病房指示灯


  22. sbit k1=P2^2;
  23. sbit k2=P2^3;
  24. sbit k3=P3^2;
  25. sbit k4=P3^3;
  26. sbit k5=P3^4;
  27. sbit k6=P3^5;
  28. sbit k7=P3^6;
  29. sbit k8=P3^7;



  30. uchar dis_lcd[8];   //8个病房数据显示的缓冲区
  31. uchar br_geshu;     //报警病人数
  32. uchar key_new;
  33. uchar key_new1;

  34. /********************************************************************
  35. * 名称 : delay_1ms()
  36. * 功能 : 延时1ms函数
  37. * 输入 : q
  38. * 输出 : 无
  39. ***********************************************************************/
  40. void delay_1ms(uint q)
  41. {
  42.         uint i,j;
  43.         for(i=0;i<q;i++)
  44.                 for(j=0;j<120;j++);
  45. }

  46. /***********************延时函数************************/
  47. void delay_uint(uint q)
  48. {
  49.         while(q--);
  50. }

  51. /***********************lcd1602写命令函数************************/
  52. void write_com(uchar com)
  53. {
  54.         e=0;
  55.         rs=0;
  56.         rw=0;
  57.         P0=com;
  58.         delay_uint(3);
  59.         e=1;
  60.         delay_uint(25);
  61.         e=0;
  62. }

  63. /***********************lcd1602写数据函数************************/
  64. void write_data(uchar dat)
  65. {
  66.         e=0;
  67.         rs=1;
  68.         rw=0;
  69.         P0=dat;
  70.         delay_uint(3);
  71.         e=1;
  72.         delay_uint(25);
  73.         e=0;        
  74. }


  75. /***********************lcd1602上显示这字符函数************************/
  76. void write_string(uchar hang,uchar add,uchar *p)
  77. {
  78.         if(hang==1)   
  79.                 write_com(0x80+add);
  80.         else
  81.                 write_com(0x80+0x40+add);
  82.                 while(1)                                                                                                                 
  83.                 {
  84.                         if(*p == '\0')  break;
  85.                         write_data(*p);
  86.                         p++;
  87.                 }        
  88. }
  89. /***********************lcd1602上显示这字符函数************************/
  90. void write_string_ge(uchar hang,uchar add,uchar *p,uchar ge)
  91. {
  92.         if(hang==1)   
  93.                 write_com(0x80+add);
  94.         else
  95.                 write_com(0x80+0x40+add);
  96.         for(i=0;i<ge;i++)
  97.                 write_data(*p++);        
  98. }

  99. /***********************lcd1602初始化设置************************/
  100. void init_1602()         //lcd1602初始化设置
  101. {
  102.         write_com(0x38);        //
  103.         write_com(0x0c);
  104.         write_com(0x06);
  105.         delay_uint(1000);
  106.         write_string(1,0," bingfang hujiao ");               
  107.         write_string(2,0,"  wu bingren    ");        
  108. }



  109. /*********************定时器0初始化******************/
  110. void time0_init()         
  111. {                                         
  112.         EA  = 1;                   //开总中断
  113.         TMOD = 0X01;          //定时器0、工作方式1
  114.         ET0 = 1;                  //开定时器0中断
  115.         TR0 = 1;                  //允许定时器0定时
  116. }

  117. /********************独立按键程序*****************/
  118. uchar key_can;         //按键值

  119. void key()         //独立按键程序
  120. {

  121.         
  122.         if(k1== 0)   key_can = 1;  //得到按键值
  123.         if(k2== 0)   key_can = 2;          //得到按键值
  124.         if(k3== 0)   key_can = 3;   //得到按键值
  125.         if(k4== 0)   key_can = 4;   //得到按键值
  126.         if(k5== 0)   key_can = 5;   //得到按键值
  127.         if(k6== 0)   key_can = 6;           //得到按键值
  128.         if(k7== 0)   key_can = 7;           //得到按键值
  129.         if(k8== 0)   key_can = 8;           //得到按键值        
  130.         
  131. }
  132.         
  133. void key_qx()         //取消按键程序
  134. {

  135.         key_quxiao = 1;                     //对应的按键IO口输出为1
  136.         if(key_quxiao == 0)                //按键按下
  137.         {
  138.                 delay_1ms(1);                     //按键消抖动
  139.                 if(key_quxiao == 0)
  140.                 {                                                //确认是按键按下
  141.                         key_can = 9;
  142.                                 while(key_quxiao == 0);
  143.                 }                        
  144.         }

  145.         
  146.         
  147.         if(key_quan == 0)                //按键按下
  148.         {
  149.                 delay_1ms(1);                     //按键消抖动
  150.                 if((key_quan == 0))
  151.                 {                                                //确认是按键按下
  152.                         key_can = 10;
  153.                         while(key_quan == 0);
  154.                 }                        
  155.         }

  156.                
  157.         

  158. }        


  159. /**********************按键处理函数************************/
  160. void key_with()
  161. {
  162.         uchar i;
  163.         if(key_can <= 8)
  164.         {
  165.                 if(key_can == 1)
  166.                         led1 = 1;          //1号病房灯亮
  167.                 if(key_can == 2)
  168.                         led2 = 1;          //2号病房灯亮
  169.                 if(key_can == 3)
  170.                         led3 = 1;          //3号病房灯亮
  171.                 if(key_can == 4)
  172.                         led4 = 1;          //4号病房灯亮
  173.                 if(key_can == 5)
  174.                         led5 = 1;          //5号病房灯亮
  175.                 if(key_can == 6)
  176.                         led6 = 1;          //6号病房灯亮
  177.                 if(key_can == 7)
  178.                         led7 = 1;          //7号病房灯亮
  179.                 if(key_can == 8)
  180.                         led8 = 1;          //8号病房灯亮
  181.                 flag_en = 1;
  182.                 for(i=0;i<8;i++)
  183.                 {
  184.                         if(dis_lcd[i] == table_num[key_can])
  185.                         {
  186.                                 flag_en = 0;      //说明这个病人已经按下过了
  187.                         }                                
  188.                 }
  189.                 if(br_geshu < 8)
  190.                 {
  191.                 if(flag_en == 1)        //能进入到这里说明是第一次按下呼叫按键
  192.                 {
  193.                         if(br_geshu == 0)         //第一次清除显示屏
  194.                                 write_string(2,0,"               ");               
  195.                          br_geshu ++;                           //呼叫病人的人数加1
  196.         
  197.                         //if(key_can!=1)
  198.                         {
  199.                          for(i=7;i>0;i--)
  200.                                 dis_lcd[i] = dis_lcd[i-1] ;     //把病人的数据向后移一位
  201.                                 dis_lcd[0] = table_num[key_can] ;        //把病人的号码保存起来
  202.                                 }

  203.                         //if(key_can==1)
  204.                         {
  205.                                 //dis_lcd[br_geshu-1] =table_num[key_can];

  206.                         }

  207.                   write_string_ge(2,0,dis_lcd,br_geshu);         //显示出来
  208.                  }
  209.                 }
  210.         }
  211.         if(key_can == 9)   //取消键的处理
  212.         {
  213.                 if(br_geshu > 0)
  214.                 {
  215.                         if(dis_lcd[br_geshu-1] == '1')
  216.                                 led1 = 0;          //1号病房灯灭
  217.                         if(dis_lcd[br_geshu-1] == '2')
  218.                                 led2 = 0;          //2号病房灯灭
  219.                         if(dis_lcd[br_geshu-1] == '3')
  220.                                 led3 = 0;          //3号病房灯灭
  221.                         if(dis_lcd[br_geshu-1] == '4')
  222.                                 led4 = 0;          //4号病房灯灭
  223.                         if(dis_lcd[br_geshu-1] == '5')
  224.                                 led5 = 0;          //5号病房灯灭
  225.                         if(dis_lcd[br_geshu-1] == '6')
  226.                                 led6 = 0;          //6号病房灯灭
  227.                         if(dis_lcd[br_geshu-1] == '7')
  228.                                 led7 = 0;          //7号病房灯灭
  229.                         if(dis_lcd[br_geshu-1] == '8')
  230.                                 led8 = 0;          //8号病房灯灭
  231.                         dis_lcd[br_geshu-1] = ' ';                                       
  232.                         br_geshu --;                           //呼叫病人的人数减1
  233.                     write_string(2,0,"          ");                  //清显示
  234.                     write_string_ge(2,0,dis_lcd,br_geshu);
  235.                         if(br_geshu == 0)         //取消到最后一次清显示屏
  236.                         {
  237.                                 write_string(2,0,"  wu bingren    ");        
  238.                                 P1 = 0x00;  
  239.                         }                        
  240.                 }                 
  241.         }
  242.         

  243.         if(key_can == 10)   //取消键的处理
  244.         {
  245.                    for(i=0;i<8;i++)
  246.                          dis_lcd[i] = ' ';               

  247.                         br_geshu=0;                           //呼叫病人的人数减1
  248.                
  249.                         if(br_geshu == 0)         //取消到最后一次清显示屏
  250.                         {
  251.                                 write_string(2,0,"  wu bingren    ");        
  252.                                 P1 = 0x00;  
  253.                         }                        
  254.                 }                 

  255.         
  256. }


  257. /*****************主函数********************/
  258. void main()
  259. ……………………

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

所有资料51hei提供下载:
新病房呼叫仿真.zip (27.11 KB, 下载次数: 210)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:641228 发表于 2019-11-14 09:50 | 显示全部楼层
作者我想问下 这个程序实现了什么功能呢,能不能具体点
回复

使用道具 举报

ID:641228 发表于 2019-11-14 13:14 | 显示全部楼层
我将程序跟电路都已画出,发现仿真时,只有铃声跟按键响应,液晶显示屏保持常亮,并未显示出任何字样?这是怎么一回事?求帮助
回复

使用道具 举报

ID:589352 发表于 2019-12-19 16:34 | 显示全部楼层
优先级怎么实现
回复

使用道具 举报

ID:720087 发表于 2020-4-3 10:57 | 显示全部楼层
请问一下rp1上接的八个电阻和电压实现了什么意思
回复

使用道具 举报

ID:720087 发表于 2020-4-3 10:58 | 显示全部楼层
你好,我想请问作者rp1上接的八个电阻和电压在整个电路中实现了什么功能
回复

使用道具 举报

ID:735166 发表于 2020-4-24 13:14 来自手机 | 显示全部楼层
优先级怎么显示???
回复

使用道具 举报

ID:381903 发表于 2020-4-30 22:46 | 显示全部楼层
8.6版本的proteus不能打开仿真文件,.c文件看了,程序里是没有右边的通信部分的,程序就是通过按键判别,然后相应灯亮而已
回复

使用道具 举报

ID:824096 发表于 2020-9-28 09:22 | 显示全部楼层
优先级怎么显示?
回复

使用道具 举报

ID:829127 发表于 2020-10-13 09:20 | 显示全部楼层
图怎么打开
回复

使用道具 举报

ID:824472 发表于 2020-12-3 10:19 | 显示全部楼层

请问一下rp1上接的八个电阻和电压实现了什么意思
回复

使用道具 举报

ID:841486 发表于 2020-12-16 11:17 | 显示全部楼层
怎么可以循环显示病房呼叫数呀?
回复

使用道具 举报

ID:841486 发表于 2020-12-16 11:42 | 显示全部楼层
您好,请问仿真后灯全亮,按键没有作用是键盘扫描函数出错了嘛?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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