找回密码
 立即注册

QQ登录

只需一步,快速开始

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

stc15f2k60s2看了手册用了示例程序也无法使用串口通信

[复制链接]
跳转到指定楼层
楼主
ID:116278 发表于 2016-4-26 19:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include"C:\Keil\C51\INC\STC\STC15F2K60S2.H"
void SerialIni(){
    SCON &= 0x2E;  //先对需要设置的位进行清零 0010 1110 因为SCON所有位都是用于设置串行口1,所以这句可省略。
    SCON = 0x50;   /* SM0/FE | SM1 | SM2 | REN | TB8 | RB8 | TI | RI 设置串行口的工作方式1(SM0 SM1  0 1)即8位可变波特率方式;允许接收)*/
    AUXR &= 0xBE;  //先对需要设置的位进行清零 1011 1110
    AUXR |= 0x00;    /* T0x12 | T1x12 | UART_M0x6 | T2R | T2_C/T(T上画) | T2x12 | EXTRAM | S1ST2 定时器1时钟为Focs/12,即12T;串口1选择定时器1为波特率发生器。S1ST2:串行口1波特率发生器选择位。0:选择定时器1作为串行口1波特率发生器。 1:选择定时器2作为串行口1的波特率发生器,此时定时器1得到释放,可以作为独立的定时器使用。*/
    TMOD &= 0x0F;        //先清零定时器1的设置(高4位设置定时器1,低4位设置定时器0)
    TMOD |= 0x20;           /* GATE | C/T(T上画) | M1 | M0 | GATE | C/T(T上画) | M1 | M0 (定时器工作方式2)使用定时器1作为波特率发生器。*/
    TH1 = 0xfd;                 //8位自动重装方式,TH1用于重置TL1初值。2的SMOD次方/32*(定时器1的溢出率或定时器2的溢出率)
    TL1  = 0xfd;                 //晶振11.0592MHz,设置波特率为9600bps。SMOD属于PCON寄存器,为1时,波特率翻倍。
    TR1=1;                         //定时器1启动
    ES = 1;                         //开放串口中断
    EA = 1;                         //开放CPU中断
}

void main(void)
{
    SerialIni();                    //运行串口初始化函数
    while(1){
}                                //等待中断()
}

void Uart2(void) interrupt 4 using 1
{
    unsigned char mydata;
    if(RI)                           //如果是接收中断
    {
        RI=0;
        mydata = SBUF;    //将接收缓冲区的数据保存到mydata变量中
        SBUF = ~mydata; //将接收到的数据按位取反后发回
    }
    else                           //如果是发送中断,将TI清0
        TI = 0;
}



完全无效。串口接的3.0/3.1;
求大神教育

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

使用道具 举报

沙发
ID:7485 发表于 2016-4-26 20:28 | 只看该作者
电路呢?是和51通信还是PC?使用了232芯片还是转USB芯片?

评分

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

查看全部评分

回复

使用道具 举报

板凳
ID:116278 发表于 2016-4-26 20:43 | 只看该作者
ahshmj 发表于 2016-4-26 20:28
电路呢?是和51通信还是PC?使用了232芯片还是转USB芯片?

电路是最小系统,可以下程序。串口是usb芯片

评分

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

查看全部评分

回复

使用道具 举报

地板
ID:7485 发表于 2016-4-26 21:18 | 只看该作者
把P3.0和P3.1对调一下试一试。USB转换芯片的输出应对单片机的输入。

评分

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

查看全部评分

回复

使用道具 举报

5#
ID:116278 发表于 2016-4-26 21:33 | 只看该作者
#include"C:\Keil\C51\INC\STC\STC15F2K60S2.H"
#define uchar unsigned char
uchar x=0;
void SerialIni(){
PCON &= 0x7F;                //波特率不倍速
        SCON = 0x50;                //8位数据,可变波特率
        AUXR |= 0x40;                //定时器1时钟为Fosc,即1T
        AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
        TMOD &= 0x0F;                //清除定时器1模式位
        TMOD |= 0x20;                //设定定时器1为8位自动重装方式
        TL1 = 0xDC;                //设定定时初值
        TH1 = 0xDC;                //设定定时器重装值
        ET1 = 0;                //禁止定时器1中断
        TR1 = 1;                //启动定时器1                     //开放CPU中断
}

void main(void)                                  
{
    SerialIni();
       
        SBUF=21;                    //运行串口初始化函数
    while(1){
         if(TI)                           //如果是接收中断
    {
        TI=0;
       
                 }
         if(RI)
         {RI=0;
       
          ;
          ;
          ;
          ;

          ;
          SBUF=x;
         }
}
}
可以发送但不能接收执行,为什么

评分

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

查看全部评分

回复

使用道具 举报

6#
ID:116278 发表于 2016-4-26 22:42 | 只看该作者
ahshmj 发表于 2016-4-26 21:18
把P3.0和P3.1对调一下试一试。USB转换芯片的输出应对单片机的输入。

大神帮帮我
回复

使用道具 举报

7#
ID:97438 发表于 2016-4-27 09:39 | 只看该作者
建议楼主先看懂程序吧。。。
回复

使用道具 举报

8#
ID:116278 发表于 2016-4-27 13:04 | 只看该作者
luoluoluo136 发表于 2016-4-27 09:39
建议楼主先看懂程序吧。。。

谢谢,问题解决了,重启了电脑(ಥ_ಥ)
回复

使用道具 举报

9#
ID:116278 发表于 2016-4-27 13:06 | 只看该作者
谢谢,问题解决了,电脑串口程序有问题,重启了电脑就好了

评分

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

查看全部评分

回复

使用道具 举报

10#
ID:120672 发表于 2018-9-29 18:41 | 只看该作者
没开总中断EA和串口中断ES
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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