找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机主从机通讯叫号系统protues仿真与源码

[复制链接]
跳转到指定楼层
楼主
基于51单片机的叫号系统仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)其实就是一个单片机控制的主从机通讯系统


单片机源程序如下:
  1. /*-----------------------------------------------
  2.   名称:LCD1602
  3.   修改:无
  4.   内容:
  5.   引脚定义如下:1-VSS 2-VDD 3-V0 4-RS 5-R/W 6-E 7-14 DB0-DB7 15-BLA 16-BLK
  6. ------------------------------------------------*/
  7. /*------------------------------------------------
  8.               写入字符函数
  9. ------------------------------------------------*/
  10. /* void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)
  11. {     
  12. if (y == 0)
  13.          {     
  14.          LCD_Write_Com(0x80 + x);     
  15.          }   
  16. else
  17.          {     
  18.          LCD_Write_Com(0xC0 + x);     
  19.          }        
  20. LCD_Write_Data( Data);  
  21. }*/
  22. /*------------------------------------------------
  23.               初始化函数
  24. ------------------------------------------------*/
  25. #include<reg52.h>
  26. #include<intrins.h>
  27. #include<stdio.h>

  28. #define CHECK_BUSY

  29. sbit RS = P2^4;   //定义端口
  30. sbit RW = P2^5;
  31. sbit EN = P2^6;
  32. sbit key1=P1^0; //VIP 按键
  33. sbit key2=P1^1; //普通按键
  34. sbit key3=P1^2; //对公按键
  35. sbit key4=P1^3; //业务选择按键

  36. float num0,num1,num2;
  37. int num3;                        
  38.            
  39. #define RS_CLR RS=0
  40. #define RS_SET RS=1

  41. #define RW_CLR RW=0
  42. #define RW_SET RW=1

  43. #define EN_CLR EN=0
  44. #define EN_SET EN=1

  45. #define DataPort P0


  46. void DelayUs2x(unsigned char t)
  47. {   
  48. while(--t);
  49. }
  50. /*------------------------------------------------
  51. mS延时函数,含有输入参数 unsigned char t,无返回值
  52. unsigned char 是定义无符号字符变量,其值的范围是
  53. 0~255 这里使用晶振12M,精确延时请使用汇编
  54. ------------------------------------------------*/
  55. void DelayMs(unsigned char t)
  56. {
  57.      
  58. while(t--)
  59. {
  60.      //大致延时1mS
  61.      DelayUs2x(245);
  62.          DelayUs2x(245);
  63. }
  64. }


  65. /*------------------------------------------------
  66.               判忙函数
  67. ------------------------------------------------*/

  68. bit LCD_Check_Busy(void)
  69. {
  70. #ifdef CHECK_BUSY
  71. DataPort= 0xFF;
  72. RS_CLR;
  73. RW_SET;
  74. EN_CLR;
  75. _nop_();
  76. EN_SET;
  77. return (bit)(DataPort & 0x80);
  78. #else
  79. return 0;
  80. #endif
  81. }
  82. /*------------------------------------------------
  83.               写入命令函数
  84. ------------------------------------------------*/
  85. void LCD_Write_Com(unsigned char com)
  86. {  
  87. // while(LCD_Check_Busy()); //忙则等待
  88. DelayMs(5);
  89. RS_CLR;
  90. RW_CLR;
  91. EN_SET;
  92. DataPort= com;
  93. _nop_();
  94. EN_CLR;
  95. }
  96. /*------------------------------------------------
  97.               写入数据函数
  98. ------------------------------------------------*/
  99. void LCD_Write_Data(unsigned char Data)
  100. {
  101. //while(LCD_Check_Busy()); //忙则等待
  102. DelayMs(5);
  103. RS_SET;
  104. RW_CLR;
  105. EN_SET;
  106. DataPort= Data;
  107. _nop_();
  108. EN_CLR;
  109. }


  110. /*------------------------------------------------
  111.                 清屏函数
  112. ------------------------------------------------*/
  113. void LCD_Clear(void)
  114. {
  115. LCD_Write_Com(0x01);
  116. DelayMs(5);
  117. }
  118. /*------------------------------------------------
  119.               写入字符串函数
  120. ------------------------------------------------*/
  121. void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
  122. {     
  123. if (y == 0)
  124.          {     
  125.          LCD_Write_Com(0x80 + x);     //表示第一行
  126.          }
  127. else
  128.          {      
  129.          LCD_Write_Com(0xC0 + x);      //表示第二行
  130.          }        
  131. while (*s)
  132.          {     
  133. LCD_Write_Data( *s);     
  134. s ++;     
  135.          }
  136. }

  137. void LCD_Init(void)
  138. {
  139.    LCD_Write_Com(0x38);    /*显示模式设置*/
  140.    DelayMs(5);
  141.    LCD_Write_Com(0x38);
  142.    DelayMs(5);
  143.    LCD_Write_Com(0x38);
  144.    DelayMs(5);
  145.    LCD_Write_Com(0x38);  
  146.    LCD_Write_Com(0x08);    /*显示关闭*/
  147.    LCD_Write_Com(0x01);    /*显示清屏*/
  148.    LCD_Write_Com(0x06);    /*显示光标移动设置*/
  149.    DelayMs(5);
  150.    LCD_Write_Com(0x0C);    /*显示开及光标设置*/
  151.    }



  152. void VIPdisplay()


  153. {
  154.    char displaytemp[16];//定义显示区域临时存储数组
  155.       if(key1==0)
  156.                                 {
  157.                                         DelayMs(20);
  158.                                         if(key1==0)
  159.                                         {
  160.                                                 
  161.                                                 num0=num0+1;
  162.        LCD_Write_String(0,0,"window1");
  163.        sprintf(displaytemp,"VIP  % 7.0f ",num0);//打印数值
  164.        LCD_Write_String(0,1,displaytemp);//显示第二行
  165.                         }
  166.         if(num0==100)
  167.         {                                       
  168.             LCD_Write_String(0,0,"Please wait!");
  169.              num0=0;
  170.      }
  171.                    while(!key1);
  172.                                   DelayMs(20);
  173.                                         while(!key1);
  174.                                        
  175. }

  176. }

  177. void PUdisplay()


  178. {
  179.    char displaytemp[16];//定义显示区域临时存储数组
  180.       if(key2==0)
  181.                                 {
  182.                                         DelayMs(20);
  183.                                         if(key2==0)
  184.                                         {
  185.                                                 
  186.                                                 num1=num1+1;
  187.        LCD_Write_String(0,0,"window2");
  188.        sprintf(displaytemp,"general  % 7.0f",num1);//打印数值
  189.        LCD_Write_String(0,1,displaytemp);//显示第二行
  190.                         }
  191.         if(num1==100)
  192.         {                                       
  193.             LCD_Write_String(0,0,"Please wait!");
  194.              num1=0;
  195.      }
  196.                    while(!key2);
  197.                                   DelayMs(20);
  198.                                         while(!key2);
  199.                                        
  200. }

  201. }

  202. void Dgdisplay()


  203. {
  204.    char displaytemp[16];//定义显示区域临时存储数组
  205.       if(key3==0)
  206.                                 {
  207.                                         DelayMs(20);
  208.                                         if(key3==0)
  209.                                         {
  210.                                                 
  211.                                                 num2=num2+1;
  212.        LCD_Write_String(0,0,"window3");
  213.        sprintf(displaytemp,"public  % 7.0f",num2);//打印数值
  214.        LCD_Write_String(0,1,displaytemp);//显示第二行
  215.                         }
  216.         if(num2==100)
  217.         {                                       
  218.             LCD_Write_String(0,0,"Please wait!");
  219.              num2=0;
  220.      }
  221.                    while(!key3);
  222.                                   DelayMs(20);
  223.                                         while(!key3);
  224. ……………………

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

所有资料51hei提供下载:
protues仿真.zip (88.74 KB, 下载次数: 89)



评分

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

查看全部评分

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

使用道具 举报

沙发
ID:340513 发表于 2018-6-1 13:17 | 只看该作者
这个能做成一个主机带多个从机吗
回复

使用道具 举报

板凳
ID:303383 发表于 2018-6-1 16:30 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

地板
ID:247623 发表于 2019-7-2 15:32 | 只看该作者
仿真有问题,无法实现功能
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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