找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STC15与STC12单片机串口通信不成功,但是仿真可以

[复制链接]
跳转到指定楼层
楼主
在proteus上可以仿真成功,主机是stc15w4k32s4单片机,主机程序,是按下一个按键然后顺序调用四个串口,分别发送一个数据到四个从机,每个从机检测到接收的数据后P20=0;现在proteus上无法进行4串口的仿真,只连接一个从机的情况下仿真是成功的,但是分别烧进开发板后,按键之后从机无反应,用电流表测试主机TXD按键时可以正常触发,但是从机P20无反应,请各位大神看图和程序 先是主机,有一些定义的函数暂时没有调用,大家别误会。

单片机源程序如下:
  1. #include<STC15.H>
  2. #include<intrins.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char
  5.         uchar good;
  6.                                 sbit key1=P2^0;
  7.                                 sbit key2=P2^1;
  8.                                 sbit key3=P2^2;
  9.                                 sbit key4=P2^3;
  10.                                 sbit key5=P2^4;
  11.                                 sbit key6=P2^5;
  12.                                 sbit key7=P2^6;
  13.                                 sbit key8=P2^7;
  14.                                 sbit key9=P1^0;
  15.                                 sbit key10=P1^1;
  16.                                 sbit key11=P1^2;
  17.                                 sbit key12=P3^5;
  18.                                 sbit key13=P1^4;
  19.                                 sbit key14=P1^5;
  20.                                 sbit key15=P1^6;
  21.                                 sbit key16=P1^7;
  22.                                 sbit key17=P3^6;
  23.                                 sbit key18=P3^7;
  24. void Uart1Init(void)                //9600bps@11.0592MHz//波特率设置串口初始化
  25. {
  26.         SCON = 0x50;                //8位数据,可变波特率
  27.         AUXR |= 0x40;                //定时器1时钟1T
  28.         AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
  29.         TMOD &= 0x0F;                //设定定时器1为16位自动重装填模式
  30.   TL1 = 0xC7;           
  31.         TH1 = 0xFE;              
  32.         ET1 = 0;                //禁止定时器1中断
  33.         TR1 = 1;        //启动定时器1
  34.         ES=1;    //启动串口中断
  35. }
  36. void Uart2Init(void)            
  37. {
  38.         S2CON = 0x50;            
  39.         AUXR |= 0x04;               
  40.   T2L = 0xC7;               
  41.         T2H = 0xFE;           
  42.         AUXR |= 0x10;              
  43.         ES=1;
  44. }
  45. void Uart3Init(void)         
  46. {
  47.   S3CON = 0x10;      
  48.         S3CON |= 0x40;   
  49.         T4T3M |= 0x02;           
  50.         T3L = 0xC7;               
  51.         T3H = 0xFE;            
  52.         T4T3M |= 0x08;         
  53.         ES=1;
  54. }
  55. void Uart4Init(void)               
  56. {
  57.         
  58.         S4CON = 0x10;            
  59.         S4CON |= 0x40;              
  60.         T4T3M |= 0x20;           
  61.         T4L = 0xC7;              
  62.         T4H = 0xFE;        
  63.         T4T3M |= 0x80;           
  64.         ES=1;
  65. }


  66. void Delay1ms()                //@11.0592MHz//1毫秒延时函数
  67. {
  68.         unsigned char i, j;

  69.         _nop_();
  70.         _nop_();
  71.         _nop_();
  72.         i = 11;
  73.         j = 190;
  74.         do
  75.         {
  76.                 while (--j);
  77.         } while (--i);
  78. }
  79. void Delay10ms()                //@11.0592MHz//10毫秒延时函数
  80. {
  81.         unsigned char i, j;

  82.         i = 108;
  83.         j = 145;
  84.         do
  85.         {
  86.                 while (--j);
  87.         } while (--i);
  88. }
  89. void trans1()//发送函数
  90. {
  91.         SBUF=0x01;
  92.         while(TI==0);
  93.                 TI=0;
  94. }
  95. void trans2()//发送函数
  96. {
  97.         SBUF=0x02;
  98.         while(TI==0);
  99.                 TI=0;
  100. }
  101. void trans3()//发送函数
  102. {
  103.         SBUF=0x03;
  104.         while(TI==0);
  105.                 TI=0;
  106. }
  107. void trans4()//发送函数
  108. {
  109.         SBUF=0x04;
  110.         while(TI==0);
  111.                 TI=0;
  112. }
  113. void trans5()//发送函数
  114. {
  115.         SBUF=0x05;
  116.         while(TI==0);
  117.                 TI=0;
  118. }
  119. void trans6()//发送函数
  120. {
  121.         SBUF=0x06;
  122.         while(TI==0);
  123.                 TI=0;
  124. }
  125. void trans7()//发送函数
  126. {
  127.         SBUF=0x07;
  128.         while(TI==0);
  129.                 TI=0;
  130. }
  131. void trans8()//发送函数
  132. {
  133.         SBUF=0x08;
  134.         while(TI==0);
  135.                 TI=0;
  136. }
  137. void trans9()//发送函数
  138. {
  139.         SBUF=0x09;
  140.         while(TI==0);
  141.                 TI=0;
  142. }
  143. void trans10()//发送函数
  144. {
  145.         SBUF=0x0a;
  146.         while(TI==0);
  147.                 TI=0;
  148. }
  149. void trans11()//发送函数
  150. {
  151.         SBUF=0x0b;
  152.         while(TI==0);
  153.                 TI=0;
  154. }
  155. void trans12()//发送函数
  156. {
  157.         SBUF=0x0c;
  158.         while(TI==0);
  159.                 TI=0;
  160. }
  161. void trans13()//发送函数
  162. {
  163.         SBUF=0x0d;
  164.         while(TI==0);
  165.                 TI=0;
  166. }
  167. void trans14()//发送函数
  168. {
  169.         SBUF=0x0e;
  170.         while(TI==0);
  171.                 TI=0;
  172. }
  173. void trans15()//发送函数
  174. {
  175.         SBUF=0x0f;
  176.         while(TI==0);
  177.                 TI=0;
  178. }
  179. void trans16()//发送函数
  180. {
  181.         SBUF=0x10;
  182.         while(TI==0);
  183.                 TI=0;
  184. }
  185. void trans17()//发送函数
  186. {
  187.         SBUF=0x11;
  188.         while(TI==0);
  189.                 TI=0;
  190. }
  191. void trans18()//发送函数
  192. {
  193.         SBUF=0x12;
  194.         while(TI==0);
  195.                 TI=0;
  196. }
  197. void main()        //主程序
  198. {
  199.         
  200.         
  201.   if(key12==0)      //消抖程序
  202.          {
  203.                  Uart1Init();
  204.                  trans1();
  205.                  Uart2Init();
  206.                  trans1();
  207.                  Uart3Init();
  208.                  trans1();
  209.                  Uart4Init();
  210.                  trans1();
  211.                  

  212.                  }                 
  213.          }
复制代码

所有资料51hei提供下载:
stc串口通信.rar (22.12 KB, 下载次数: 12)


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

使用道具 举报

沙发
ID:170589 发表于 2019-4-8 17:51 | 只看该作者
一年了,并没有人管我
回复

使用道具 举报

板凳
ID:346434 发表于 2020-3-29 15:38 | 只看该作者
怎能不用STC15仿真?
回复

使用道具 举报

地板
ID:606493 发表于 2020-3-30 17:41 | 只看该作者
你仿真用的是两个51单片机,实物如果用一个51一个12的话他们的机器周期好像不太一样所以定时器要改一下
回复

使用道具 举报

5#
ID:201555 发表于 2020-4-1 22:11 | 只看该作者
两个单片机串行通讯:1)只有两个单片机的串口波特率设置一样,接口物理协议设置一样(如n,8,1);2)单片机1的txd->单片机2的rxd,单片机1的rxd->单片机2的txd;3)stc15单片机串口的引脚可通过软件设置,要把所用的串口映射到实际物理连接的引脚上。只有这3点对,两个单片机串行通讯没有问题。

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

6#
ID:201555 发表于 2020-4-1 22:21 | 只看该作者
stc15单片机可使用内部晶振,晶振频率也可设置,stc12好像只能用外部晶振,简单点,将stc15的主时钟设成与stc12的外部晶振频率,串行通讯晶振频率选11.0592MHz,最容易,2400、4800、9600、…,可支持多个波特率。
回复

使用道具 举报

7#
ID:170589 发表于 2022-5-24 12:23 | 只看该作者
多年过去了,当时我给解决了,你们猜最后什么原因,是因为STC15虽然有四串口,但是官方没有给出4串口同时开启的配置,按例程配置的定时计数器是错的,无法实现4串口同时用,例程给的是轮流用,很麻烦,最后我费好大劲找出了四串口的正确配置
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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