找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机多机串口通讯实验LCD1602显示 Proteus仿真程序

[复制链接]
跳转到指定楼层
楼主
串口通讯实验,设计一个甲、乙多机通信实验,甲机发送数据给乙机,乙机收到后反馈一个内容给甲机,,从一个单片机发送5个给另一个单片机,另一个单片机接收到后完成数据相加,并通过数码管显示出来,要求所有数据为十进制格式。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. /** 功能描述: 甲机发数据!”**/
  2. #include <reg52.h>
  3. #include <intrins.h>
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. #define lcd_out P0

  7. /***********端口定义********************************/
  8. sbit rs=P2^0;
  9. sbit rw=P2^1;
  10. sbit e=P2^2;

  11. sbit p10=P1^0;
  12. sbit p11=P1^1;
  13. sbit p12=P1^2;
  14. sbit p13=P1^3;
  15. sbit p14=P1^4;
  16. sbit p15=P1^5;
  17. sbit p16=P1^6;
  18. sbit p17=P1^7;

  19. sbit led=P3^7;
  20. /***********函数申明***********************************/
  21. void UART_Init(void);
  22. void UART_SendData(uchar dat);
  23. void UART_SendString(uchar *p);
  24. void delay(uint j);

  25. void check_busy(void);
  26. void write_command(uchar com);
  27. void write_data(uchar dat);
  28. void LCD_initial(void);
  29. void dis_char(uchar ad, uchar input);


  30. void shaomiao(void);
  31. void panduan(void);
  32. void display1(void);
  33. void display2(void);
  34. /***********变量定义********************************/
  35. uchar address=0x00;   //显示地址

  36. uchar sting[]="0123456";

  37. unsigned char code str[]="0123456789";

  38. uchar code temp[]="0123456789";
  39. uchar  temp1[8],mm[4],temp2[8];
  40. float q;
  41. uchar num,num1,k,r=0,n,h,d,w;
  42. float  sum;
  43. long uu;


  44. void main(void)
  45. {
  46.     LCD_initial();                             //LCD1602 初始化
  47.           UART_Init();                 //串口初始化
  48.                 led=0;
  49.                 while(1)
  50.                 {
  51.                         shaomiao();
  52.                         panduan();
  53. //                        UART_SendString(sting);           //发送字符串
  54. //                        address=0x00;   //发送完数据 地址就归零 从头再来
  55. //                        delay(1000);
  56. //                        write_command(0x01);  //发送完一帧数据 清屏         
  57.     }
  58. }

  59. //串口初始化
  60. void UART_Init(void)
  61. {
  62.         SCON=0x50;
  63.   TMOD=0x20;
  64.         PCON=0x00;
  65.   TH1 =0xf4;
  66.         TL1 =0xf4;  //预置初值,设波特率为2400
  67.         TR1 =1;        
  68. }

  69. //串口发送一个字节的数据
  70. void UART_SendData(uchar dat)
  71. {
  72.         SBUF=dat;      //发送数据
  73.         while(!TI);  //判断是否发送完
  74.         TI=0;    //软件清0
  75.         delay(100);
  76.         dis_char(address++,dat);  //发送完一个数据 显示一个数据
  77.         if(address==0x10) address=0x40;//显示完第一行 就显示第二行
  78.         if(address==0x50){
  79.      write_command(0x01);
  80.            address=0x00;//显示完第二行  清屏后又显示第一行
  81.          }
  82. }

  83. //串口发送多字节数据
  84. void UART_SendString(uchar *p)
  85. {
  86.   while(*p!='\0')
  87.   {
  88.    UART_SendData(*p);
  89.    p++;
  90.   }
  91. }

  92. //1ms延时程序
  93. void delay(uint j)
  94. {
  95.         uchar i=250;
  96.         for(;j>0;j--)
  97.         {
  98.                 while(--i);
  99.                 i=249;
  100.                 while(--i);
  101.                 i=250;
  102.         }
  103. }
  104. ////查忙程序
  105. //void check_busy(void)
  106. //{
  107. //        uchar dt;
  108. //        do
  109. //        {
  110. //                dt=0xff;
  111. //                e=0;
  112. //                rs=0;        
  113. //                rw=1;
  114. //                e=1;
  115. //                dt=lcd_out;
  116. //        }while(dt&0x80);
  117. //        e=0;
  118. //}        
  119. //写控制指令
  120. void write_command(uchar com)
  121. {
  122.         //check_busy();
  123.         e=0;
  124.         rs=0;
  125.         rw=0;
  126.         lcd_out=com;
  127.         e=1;
  128.         _nop_();
  129.         e=0;
  130.         delay(1);
  131. }
  132. //写数据指令
  133. void write_data(uchar dat)
  134. {
  135.         //check_busy();
  136.         e=0;
  137.         rs=1;
  138.         rw=0;
  139.         lcd_out=dat;
  140.         e=1;
  141.         _nop_();
  142.         e=0;
  143.         delay(1);        
  144. }
  145. //液晶屏初始化
  146. void LCD_initial(void)
  147. {
  148.         write_command(0x38);//8位总线,双行显示,5X7的点阵字符
  149.         write_command(0x0C);//开整体显示,光标关,无黑块
  150.         write_command(0x06);//光标右移
  151.         write_command(0x01);//清屏
  152.         delay(1);
  153. }

  154. // 输出字符

  155. void dis_char(uchar ad, uchar input)

  156. {
  157.         write_command(ad+0x80);//ad是显示位置信息
  158.         write_data(input);
  159.         delay(10);

  160. }

  161. void shaomiao()
  162. {
  163.   uchar i,s;
  164.   for (i=0,s=0xfe;i<4;i++)
  165.      {
  166.            P1=s;
  167.            if(p14==0|p15==0|p16==0|p17==0)
  168.              {
  169.                    delay(10);
  170.                    if(p14==0|p15==0|p16==0|p17==0)
  171.                      {
  172.             if(p14==0)
  173.                                   {
  174.                                     if(p10==0)
  175.                                                 {        num=7;
  176.                                                         UART_SendData(str[7]);
  177.                                                 }
  178.                                           if(p11==0)
  179.                                           {        num=4;
  180.                                                         UART_SendData(str[4]);}
  181.                                           if(p12==0)
  182.                                           {        num=1;
  183.                                                         UART_SendData(str[1]);
  184.                                                 }
  185.                                           if(p13==0)
  186.                                           num=10;
  187.                                   }                        
  188.                                 if(p15==0)
  189.                                   {
  190.                                     if(p10==0)
  191.                                           {        num=8;
  192.                                                         UART_SendData(str[8]);
  193.                                                 }
  194.                                           if(p11==0)
  195.                                           {        num=5;
  196.                                                         UART_SendData(str[5]);
  197.                                                 }
  198.                                           if(p12==0)
  199.                                           {        num=2;
  200.                                                         UART_SendData(str[2]);
  201.                                                 }
  202.                                           if(p13==0)
  203.                                           {        num=0;
  204.                                                         UART_SendData(str[0]);
  205.                                                 }
  206.                                   }        
  207.                                 if(p16==0)
  208.                                   {
  209.                                     if(p10==0)
  210.                                           {        num=9;
  211.                                                         UART_SendData(str[9]);
  212.                                                 }
  213.                                           if(p11==0)
  214.                                           {        num=6;
  215.                                                         UART_SendData(str[6]);
  216.                                                 }
  217.                                           if(p12==0)
  218.                                           {        num=3;
  219.                                                         UART_SendData(str[3]);
  220.                                                 }
  221.                                           if(p13==0)
  222.                                           num=11;
  223.                                   }
  224.                                 if(p17==0)
  225.                                   {
  226.                                     if(p10==0)
  227.                                           num=15;
  228.                                           if(p11==0)
  229.                                           num=14;
  230.                                           if(p12==0)
  231.                                           num=13;
  232.                                           if(p13==0)
  233.                                           num=12;
  234.                                   }
  235.                          while(p14==0|p15==0|p16==0|p17==0);                  
  236.                          }
  237.                  if(num<10)
  238.                   {
  239.                                         k++;
  240.           w=0;
  241.                   }                  

  242.            if(d==1)
  243.                  {
  244.                          d=0;
  245.                         sum=-sum;
  246.                  
  247.                  }
  248.                   
  249.   }
  250.    
  251.    s=s<<1|0x01;
  252.    s=s|0xf0;         
  253. }  
  254. }

  255. void display1()
  256. {

  257.          uchar i;
  258.          uu=(long)(sum);
  259.          temp1[7]=uu/10000000;
  260.          temp1[6]=uu%10000000/1000000;
  261.          temp1[5]=uu%10000000%1000000/100000;
  262.          temp1[4]=uu%10000000%1000000%100000/10000;
  263.          temp1[3]=uu%10000000%1000000%100000%10000/1000;
  264.          temp1[2]=uu%10000000%1000000%100000%10000%1000/100;
  265.          temp1[1]=uu%10000000%1000000%100000%10000%1000%100/10;
  266.          temp1[0]=uu%10;
  267.   
  268.           if(h==1)
  269.                    {
  270.                      h=2;
  271.                             write_command(0x80+15-k);
  272.                            write_data(0x2d);
  273.                    }
  274.           if(r==0)
  275.                         write_command(0x80+15);
  276.           if(r==1)
  277.                         write_command(0xc0+15);
  278.                         write_command(0x04);
  279.          for (i=0;i<k;i++)
  280.                  {  
  281.                    write_data(temp[temp1[i]]);
  282.                    delay(5);
  283.                  }
  284.    
  285. }
  286. void display2()
  287. {
  288.          uchar i;
  289.          temp2[7]=uu%10000000/1000000;
  290.          temp2[6]=uu%10000000%1000000/100000;
  291.          temp2[5]=uu%10000000%1000000%100000/10000;
  292.          temp2[4]=uu%10000000%1000000%100000%10000/1000;
  293.          temp2[2]=uu%10000000%1000000%100000%10000%1000/100;
  294.          temp2[1]=uu%10000000%1000000%100000%10000%1000%100/10;
  295.          temp2[0]=uu%10;
  296.   
  297.   
  298.           if(h==1)
  299.                    {
  300.                      h=2;
  301.                             write_command(0x80+15-k-4);
  302.                                  write_data(0x2d);
  303.                    }
  304.           if(r==0)
  305.                         write_command(0x80+15);
  306.           if(r==1)
  307.                         write_command(0xc0+15);
  308.                         write_command(0x04);
  309.                 for (i=0;i<k+4;i++)
  310.                          {  
  311.                                  
  312.                                                 if(i==3)
  313.                                          {
  314.                                          write_data(0x2e);
  315.                                          i++;
  316.                                          }        
  317.                                          write_data(temp[temp2[i]]);
  318.                                          delay(5);
  319.                          }         
  320. }

  321. void panduan()
  322. {
  323.    
  324.     if(n==1&num==0)
  325.      {
  326.       write_command(0x01);
  327.                         write_command(0x80+15);
  328.                         write_data(temp[0]);
  329.                         k=0;
  330.                         n=0;

  331.      }
  332.         if(num==10)
  333.                  {
  334.                    write_command(0x01);
  335.                    k=0;
  336.                    n=0;
  337.                    r=0;               
  338.                  }
  339.         if(n==1&num>=1&num<10)
  340.                  {
  341.                    write_command(0x01);
  342.                    k=1;
  343.                    n=0;
  344.                    r=0;
  345.                  }  
  346.    if(num<10&k==1)
  347.          {
  348.                sum=num;
  349.                mm[0]=num;
  350.                if(num==0)
  351.                k=0;
  352.          }
  353.    if(num<10&k==2)
  354.              {
  355.                sum=mm[0]*10+num;
  356.                mm[1]=num;         
  357.              }  
  358.    if(num<10&k==3)
  359.              {
  360.                sum=mm[0]*100+mm[1]*10+num;
  361.                mm[2]=num;
  362.              }
  363.    if(num<10&k==4)
  364.              {
  365.                sum=mm[0]*1000+mm[1]*100+mm[2]*10+num;
  366.                mm[3]=num;
  367.              }
  368.    if(num<10&k==5)
  369.              {
  370.                   
  371.                         num=10;
  372.              }
  373.    
  374.    if (num>=12&num<16)
  375.          {
  376.                   
  377.                 r=1;
  378.                k=0;
  379.                q=sum;
  380.                     
  381.                 if(num==12)
  382.                     {
  383.                           write_command(0xc0);
  384.                           write_data(0x2b);
  385.                          }
  386.           if(num==13)
  387.                      {
  388.                           write_command(0xc0);
  389.                           write_data(0x2d);
  390.                          }
  391.                 if(num==14)
  392.                      {
  393.                           write_command(0xc0);
  394.                           write_data(0x2a);
  395.                          }
  396.                 if(num==15)
  397.                      {
  398.                           write_command(0xc0);
  399.                           write_data(0xfd);
  400.                          }
  401.                     num1=num;
  402.                                 n=0;
  403.        }

  404.    if(num==11&w==0)
  405.         {
  406.                         w=1;
  407.                         n=1;
  408.                         r=0;         
  409.                         num=16;  
  410.                         write_command(0x01);
  411.                         if(num1==12)            
  412.                         sum=q+sum;
  413.                         if(num1==13)                 
  414.                                  sum=q-sum;         
  415.                         if(num1==14)
  416.                         sum=q*sum;
  417.                         if(num1==15)
  418.                                 sum=q/sum;           
  419.                         
  420.                         if(sum>=0)
  421.                                 h=0;
  422.                         else
  423.                          {
  424.                          h=1;
  425.                          sum=-sum;
  426.                          d=1;
  427.                          }
  428.                                 if(sum<100000000)
  429.                          k=8;
  430.                         if(sum<10000000)
  431.                          k=7;
  432.                         if(sum<1000000)
  433.                          k=6;
  434.                         if(sum<100000)
  435.                          k=5;
  436.                         if(sum<10000)
  437.                          k=4;
  438.                         if(sum<1000)
  439.                          k=3;
  440.                         if(sum<100)
  441.                          k=2;  
  442.                         if(sum<10)
  443.                          k=1;
  444.         
  445.         if(sum!=(long)(sum))
  446.           {
  447.                   uu=sum*10000;
  448.          
  449.             display2();
  450.                  
  451.           }

  452.   }   
  453. if(sum==(long)(sum))
  454.           display1();         
  455.                           
  456. }                 
复制代码
  1. 乙机见附件
复制代码
Keil代码与Proteus仿真下载:
实验30.7z (99.44 KB, 下载次数: 44)



评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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