找回密码
 立即注册

QQ登录

只需一步,快速开始

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

请高手指教,串口问题,谢谢。

  [复制链接]
跳转到指定楼层
楼主
ID:119239 发表于 2016-5-8 11:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STC12C5A60S2单片机
用串口2,为何在KEI 中调不通,串口1可以
例程是官方的STC-ISP的范例都一样,求解。串口1 的例程可以在串口窗中观察到STC12C5A60S2\r\nUart2 Test !,串口2则不能,为何。

/*------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------------------------------------*/
/* --- STC12C5Axx Series MCU UART2 (8-bit/9-bit)Demo ---------------*/
/* --- Mobile: (86)13922805190 -------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ---------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966----------------------*/

/* If you want to use the program or the program referenced in the  */
/* article, please specify in which data and procedures from STC    */
/*------------------------------------------------------------------*/
#include "reg51.h"
#include "intrins.h"
typedef unsigned char BYTE;
typedef unsigned int WORD;
#define FOSC 11059200L      //System frequency
#define BAUD 115200         //UART baudrate
/*Define UART parity mode*/
#define NONE_PARITY     0   //None parity
#define ODD_PARITY      1   //Odd parity
#define EVEN_PARITY     2   //Even parity
#define MARK_PARITY     3   //Mark parity
#define SPACE_PARITY    4   //Space parity
#define PARITYBIT EVEN_PARITY   //Testing even parity
/*Declare SFR associated with the UART2 */
sfr AUXR  = 0x8e;           //Auxiliary register
sfr S2CON = 0x9a;           //UART2 control register
sfr S2BUF = 0x9b;           //UART2 data buffer
sfr BRT   = 0x9c;           //Baudrate generator
sfr IE2   = 0xaf;           //Interrupt control 2
#define S2RI  0x01          //S2CON.0
#define S2TI  0x02          //S2CON.1
#define S2RB8 0x04          //S2CON.2
#define S2TB8 0x08          //S2CON.3
bit busy;
void SendData(BYTE dat);
void SendString(char *s);
void main()
{
#if (PARITYBIT == NONE_PARITY)
    S2CON = 0x50;           //8-bit variable UART
#elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY)
    S2CON = 0xda;           //9-bit variable UART, parity bit initial to 1
#elif (PARITYBIT == SPACE_PARITY)
    S2CON = 0xd2;           //9-bit variable UART, parity bit initial to 0
#endif
    BRT = -(FOSC/32/BAUD);  //Set auto-reload vaule of baudrate generator
    AUXR = 0x14;            //Baudrate generator work in 1T mode
    IE2 = 0x01;             //Enable UART2 interrupt
    EA = 1;                 //Open master interrupt switch
    SendString("STC12C5A60S2\r\nUart2 Test !\r\n");
    while(1);
}
/*----------------------------
UART2 interrupt service routine
----------------------------*/
void Uart2() interrupt 8 using 1
{
    if (S2CON & S2RI)
    {
        S2CON &= ~S2RI;     //Clear receive interrupt flag
        P0 = S2BUF;         //P0 show UART data
        P2 = (S2CON & S2RB8);//P2.2 show parity bit
    }
    if (S2CON & S2TI)
    {
        S2CON &= ~S2TI;     //Clear transmit interrupt flag
        busy = 0;           //Clear transmit busy flag
    }
}
/*----------------------------
Send a byte data to UART
Input: dat (data to be sent)
Output:None
----------------------------*/
void SendData(BYTE dat)
{
    while (busy);           //Wait for the completion of the previous data is sent
    ACC = dat;              //Calculate the even parity bit P (PSW.0)
    if (P)                  //Set the parity bit according to P
    {
#if (PARITYBIT == ODD_PARITY)
        S2CON &= ~S2TB8;    //Set parity bit to 0
#elif (PARITYBIT == EVEN_PARITY)
        S2CON |= S2TB8;     //Set parity bit to 1
#endif
    }
    else
    {
#if (PARITYBIT == ODD_PARITY)
        S2CON |= S2TB8;     //Set parity bit to 1
#elif (PARITYBIT == EVEN_PARITY)
        S2CON &= ~S2TB8;    //Set parity bit to 0
#endif
    }
    busy = 1;
    S2BUF = ACC;            //Send data to UART2 buffer
}
/*----------------------------
Send a string to UART
Input: s (address of string)
Output:None
----------------------------*/
void SendString(char *s)
{
    while (*s)              //Check the end of the string
    {
        SendData(*s++);     //Send current char and increment string ptr
    }
}

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

使用道具 举报

沙发
ID:119239 发表于 2016-5-8 23:11 | 只看该作者
请各位大虾帮忙试一下把程序拷贝编译运行,从串口2观察窗能否看到输出STC12C5A60S2\r\nUart2 Test !,谢谢,我试了几天都是不行。
回复

使用道具 举报

板凳
ID:119239 发表于 2016-5-8 23:13 | 只看该作者
请各位大虾帮忙,谢谢。
回复

使用道具 举报

地板
ID:119403 发表于 2016-5-8 23:40 | 只看该作者
是不是中断优先级的问题
回复

使用道具 举报

5#
ID:119409 发表于 2016-5-9 00:31 | 只看该作者
839246275 发表于 2016-5-8 23:40
是不是中断优先级的问题

建议重新考虑一下中断优先级
回复

使用道具 举报

6#
ID:119239 发表于 2016-5-9 16:21 | 只看该作者
谢谢回复,我已把串口2设为最高优先级了(IP=0x01;   IPH2=0x01;),还是不行,是否有另外的原因?另外STC也太不严紧了,中断优先级寄存器名称究竟是IPH2还是IP2H,PDF资料写的是IP2H,但头件为IPH2,究竟是哪一个对?

评分

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

查看全部评分

回复

使用道具 举报

7#
ID:119573 发表于 2016-5-9 17:32 | 只看该作者
看看硬件?
回复

使用道具 举报

8#
ID:119239 发表于 2016-5-9 20:36 | 只看该作者
谢谢回复,软件都调不通,就不要想硬件了,增加优先级(IP2=0x01;IP2H=0x01;)时发现STC资料和STC-ISP今天给STC打过电话,

评分

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

查看全部评分

回复

使用道具 举报

9#
ID:119239 发表于 2016-5-9 20:56 | 只看该作者
谢谢回复,软件都调不通,不要指望硬件可以,我想用串口2控制GSM模块。增加优先级(IP2=0x01;IP2H=0x01;)时发现STC-ISP头文件与PDF文档不符,一个写IPH2,一个写IP2H,今天给STC打过电话,客服人员说查证后会更正,至于技术问题则无法回复。各位大虾是否可帮忙试一下STC-ISP的串口2例程拷到Keil中编译后运行,从串口2窗中观察到输出“STC12C5A60S2”字符串,我试了N次都是程序进入死循环,串口1例程运行后则可从串口1窗中观察到输出的字行串,不知何解,请各位帮忙,先谢了。

评分

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

查看全部评分

回复

使用道具 举报

10#
ID:147831 发表于 2016-11-14 17:25 | 只看该作者
楼主,请问问题你解决了吗,我也遇到跟你一样的问题,用串口调试助手看,串口2完全没输出,串口1能正常工作输出。不知道什么问题,求帮助。。
回复

使用道具 举报

11#
ID:147993 发表于 2016-11-15 13:12 | 只看该作者
可以把TXD,RXD短接看看有没有数据收到
回复

使用道具 举报

12#
ID:148033 发表于 2016-11-15 14:32 来自手机 | 只看该作者
txrx短接的方法比较好
回复

使用道具 举报

13#
ID:147831 发表于 2016-11-16 09:01 | 只看该作者
宇105 发表于 2016-11-15 14:32
txrx短接的方法比较好

大神,你好,什么意思?是P3.0跟p3.1短接?还是P1.2跟P1.3短接?我两个都试过了,还是没输出
回复

使用道具 举报

14#
ID:148202 发表于 2016-11-16 10:27 | 只看该作者
先试试自发自收能不能行
回复

使用道具 举报

15#
ID:148069 发表于 2016-11-16 14:07 | 只看该作者
不懂诶
回复

使用道具 举报

16#
ID:147831 发表于 2016-11-19 21:46 | 只看该作者
wjsxht 发表于 2016-11-16 10:27
先试试自发自收能不能行

自发自收都不行,串口2完全没输出。
回复

使用道具 举报

17#
ID:154834 发表于 2016-12-14 21:21 | 只看该作者
我用STC12控制GPRS模块,给模块发送AT指令,始终无法收到GPRS的返回数据。单片机的TXD和RXT短接,能正确收到发送的数据,GPRS模块测试也没问题,但是单片机和GPRS之间就是无法通信,这个问题困扰我三天了,求大神帮忙!
回复

使用道具 举报

18#
ID:154568 发表于 2016-12-15 20:39 | 只看该作者
认真思考,搜索一下
回复

使用道具 举报

19#
ID:97424 发表于 2016-12-15 21:25 | 只看该作者
真是难题呀,换COM口了么
回复

使用道具 举报

20#
ID:153199 发表于 2016-12-16 16:21 | 只看该作者
你用什么编译的
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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