打印

关于STC12C4052串口通讯

[复制链接]
6099|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
狂风.沙|  楼主 | 2008-4-30 09:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
兄弟们帮忙看看:关于STC12C4052串口通讯:stc12c4052ad从串口收到一个数然后从串口发
出去。不管我发什么16进制数(如0X05,0X55等),我用串口调试助手收到的全是00。
但我将程序移植到STC89C52RC上就一切正常,难道STC89C52RD与STC12C4052AD串口有区
别??请大虾们赐教!
程序如下:
#include <REG2051.H>
#define uchar unsigned char
#define uint unsigned int
//sfr P3M0  = 0xb1;//
//sfr P3M1  = 0xb2;//声明STC12c4052AD的I/O口工作方式寄存器
uchar id;//id号变量
uchar flag;//标记
void init();//初始化函数
void delay1ms(uint chi);//延时函数


void main()
{
    init();//初始化
    while(1)
    {
        if(flag==1)//当收到0x05编码时
        {
            ES=0;//关串口中断
            flag=0;//清除标记
            SBUF=id;//将收到的数据发出
              while(!TI);//等待发送完
            TI=0;//将发送完成标志清0
            ES=1;//开串口中断
        }
    }
}


void ser() interrupt 4//串口中断服务程序
{
    RI=0;//清RI标志
    id=SBUF;//将串口收到的值赋给变量ID
    flag=1;//接收到数据标记
}


void init()
{
    //P3M0=0;//
    //P3M1=0X80;//P3_7强推挽出
    //P3_7=0;//开机先将P3_7拉低
    TMOD=0x20;//设置定时器1为工作方式2
    TH1=0xfd;//
    TL1=0xfd;//定时器1赋初值,波特率9600 (晶振11.0592MHZ)
    TR1=1;//启动定时器1
    REN=1;//串口接收允许
    SM0=0;//
    SM1=1;//串口工作在方式1
    EA=1;//开总中断
    ES=1;//开串口中断
}


相关帖子

沙发
jjg| | 2008-4-30 14:58 | 只看该作者

STC12C系列是1T的MCU,STC89C52RC是12T的MCU。

使用特权

评论回复
板凳
walnutcy| | 2008-4-30 20:48 | 只看该作者

STC12C4052AD的6.5D版是没有多少问题的,

使用特权

评论回复
地板
seawave03| | 2011-10-19 11:35 | 只看该作者
/*------------------------------------------------------------------*/
/* --- STC MCU International Limited -------------------------------*/
/* --- STC 1T Series MCU RC Demo -----------------------------------*/
/* --- Mobile: (86)13922805190 -------------------------------------*/
/* --- Fax: 86-755-82944243 ----------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------*/
/* --- Web: www.**.com -----------------------------------------*/
/* If you want to use the program or the program referenced in the  */
/* article, please specify in which data and procedures from STC    */
/*------------------------------------------------------------------*/

/*
        ²âÊÔ·½·¨£º
        ¸ù¾ÝÄúµÄÖ÷ʱÖӺͲ¨ÌØÂÊÐÞ¸ÄÏÂÃæµÄÏà¹Ø¶¨Ò壬±àÒëºóÏÂÔص½MCU¡£
        ͨ¹ý´®¿ÚÖúÊÖÏòMCU·¢ËÍÊý¾Ý£¬MCUÊÕµ½ºóÔ­Ñù·µ»Ø¡£
*/

#include        <reg51.h>

sfr        AUXR = 0x8E;
sfr BRT   = 0x9C;

#define                BUF_LENTH        64                //¶¨Òå´®¿Ú½ÓÊÕ»º³å³¤¶È
unsigned char         idata RX0_Buffer[BUF_LENTH];        //½ÓÊÕ»º³å
unsigned char         uart0_wr;                //дָÕë
unsigned char         uart0_rd;                //¶ÁÖ¸Õë
bit                B_TI;

void        uart0_init(void);



/*************** Óû§¶¨Òå²ÎÊý *****************************/

//#define MAIN_Fosc                18432000L        // define main clock
#define MAIN_Fosc                22118400L        // define main clock
//#define MAIN_Fosc                11059200L        // define main clock
#define Baudrate0                9600                // define the baudrate,
                                                                        // 12T mode: 600~115200 for 22.1184MHZ, 300~57600 for 11.0592MHZ
                                                                        // 1T  mode: 7200~1382400 for 22.1184MHZ, 3600~691200 for 11.0592MHZ
#define        T1_1T_Mode                0                        // 1: Timer1 set as 1T mode,        0: Timer1 set as 12T mode

/**********************************************************/


/****************** ±àÒëÆ÷×Ô¶¯Éú³É£¬Óû§ÇëÎðÐÞ¸Ä ************************************/

#if (T1_1T_Mode > 0)
        #define T1_TimerReload                (256 - MAIN_Fosc / 64 / Baudrate0)                //Calculate the timer1 reload value ar 1T mode
#else
        #define T1_TimerReload        (256 - MAIN_Fosc / 192 / Baudrate0)                //Calculate the timer1 reload value        at 12T mode
#endif


/**********************************************************/


void        main(void)
{
        uart0_init();
       
        while(1)
        {
                if(uart0_rd != uart0_wr)        //´®¿Úת·¢
                {
                        B_TI = 0;
                        SBUF = RX0_Buffer[uart0_rd];
                        if(++uart0_rd >= BUF_LENTH)                uart0_rd = 0;
                        while(!B_TI)        ;
                        B_TI = 0;
                }
        }
}



void        uart0_init(void)
{
        PCON |= 0x80;                //UART0 Double Rate Enable
        SCON = 0x50;                //UART0 set as 10bit , UART0 RX enable

        TMOD &= ~(1<<6);                //Timer1 Set as Timer, defalul 12T
        TMOD = (TMOD & ~0x30) | 0x20;        //Timer1 set as 8 bits auto relaod
#if (T1_1T_Mode > 0)
        AUXR |=  (1<<6);                //Timer1 set as 1T mode
#endif
        TH1 = T1_TimerReload;                //Load the timer
        TR1  = 1;

        ES  = 1;
        EA = 1;
}


/**********************************************/
void UART0_RCV (void) interrupt 4
{
        if(RI)
        {
                RI = 0;
                RX0_Buffer[uart0_wr] = SBUF;
                if(++uart0_wr >= BUF_LENTH)        uart0_wr = 0;
        }

        if(TI)
        {
                TI = 0;
                B_TI = 1;
        }
}
/*STC12C4052AD 内部RC*/

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

2

帖子

0

粉丝