找回密码
 立即注册

QQ登录

只需一步,快速开始

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

Proteus仿真51单片机串口通讯主机+从机代码

[复制链接]
跳转到指定楼层
楼主
分主从机代码
主机代码实现:
1.LCD1602的驱动并显示字符串
2.串口通讯发送功能
3.按键识别功能
从机代码实现:
1.数码管的显示(根据按键次数递增)
2.串口通讯接收功能

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下(主机代码):
  1. #include <reg51.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. unsigned char key_s, key_v, tmp, n;
  6. unsigned char code name[]={"successful"};
  7. sbit lcden=P2^4;
  8. sbit lcdrs=P2^5;
  9. void Init(void);                                        //初始化
  10. bit        key_scan();                                                //按键扫描
  11. void key_event();                                        //按键事件
  12. void delayms(unsigned char ms);                //延迟
  13. void send_data(unsigned char txd);        //数据发送
  14. void write_com(uchar com);
  15. void set_pos(uchar x, uchar y);
  16. void write_data(uchar date);
  17. void LCD_init();
  18. void print();
  19. sbit        K1 = P1^4;
  20. //主程序
  21. main()
  22. {
  23.     Init();
  24.         TR1 = 1;                                    //启动定时器1
  25.         n=0x00;
  26.         LCD_init();                                                //初始化
  27.         print();                                                //lcd显示
  28.         while(1)
  29.         {
  30.                 if(key_scan())                    //扫描按键
  31.                 {
  32.                         delayms(10);                        //延时去抖动
  33.                         if(key_scan())                        //再次扫描
  34.                         {
  35.                                 key_v = key_s;                //保存键值
  36.                                 key_event();                //键处理
  37.                                 if(n==0x0a) n=0x00;        //归零
  38.                         }
  39.                 }
  40.         }

  41. }





  42. //子程序
  43. void Init(void)
  44. {   
  45.         TMOD = 0x20;                        // 定时器1工作于8位自动重载模式, 用于产生波特率
  46.         TH1 = 0xF3;                                // 波特率2400
  47.         TL1 = 0xF3;
  48.         SCON = 0x50;                        // 设定串行口工作方式
  49.         PCON&= 0xef;                        // 波特率不倍增
  50.                

  51.         IE = 0x0;                                // 禁止任何中断
  52. }
  53. bit key_scan()                                     
  54. {
  55.         key_s = 0x00;
  56.         key_s |= K1;
  57.         return(key_s ^ key_v);       
  58. }

  59. void key_event()
  60. {
  61.         if((key_v & 0x01) == 0)
  62.         {                       
  63.                 send_data(n++);                       
  64.         }
  65. }
  66. void send_data(unsigned char txd)
  67. {
  68.         SBUF = txd;
  69.         while(!TI);                               
  70.         TI = 0;                                       
  71. }
  72. void delayms(unsigned char ms)       
  73. {                                               
  74.         unsigned char i;
  75.         while(ms--)
  76.         {
  77.                 for(i = 0; i < 120; i++);
  78.         }
  79. }
  80. void write_com(uchar com)
  81. {
  82.         lcdrs=0;
  83.         P0=com;
  84.         delayms(5);
  85.         lcden=1;
  86.         delayms(5);
  87.         lcden=0;
  88. }
  89. void set_pos(uchar x, uchar y)
  90. {
  91.         uchar addr;       
  92.         if (y == 1)
  93.                 addr = 0x00 + x;
  94.         else
  95.                 addr = 0x40 + x;
  96.         write_com(addr | 0x80);
  97. }
  98. void write_data(uchar date)
  99. {
  100.         lcdrs=1;
  101.         P0=date;
  102.         delayms(5);
  103.         lcden=1;
  104.         delayms(5);
  105.         lcden=0;
  106. }
  107. void LCD_init()
  108. {
  109.         lcden=0;
  110.         write_com(0x38);
  111.         write_com(0x0c);
  112.         write_com(0x06);
  113.         write_com(0x01);
  114. }
  115. void print()
  116. {
  117.         int i;
  118.         for(i=0;i<10;i++)                                
  119.     {
  120.       uchar c=0;
  121.           c=name[i];
  122.           set_pos(i,1);                             
  123.       write_data(c);                           
  124.     }
  125. }
复制代码

所有资料51hei提供下载:
串口通讯.rar (81.87 KB, 下载次数: 82)

评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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