3366|6

74

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

内部晶振改为外部晶振,timer中断是好的,但是串口发出信息外边接收不到,高分求解 [复制链接]

void UART0Init(void)   
{   unsigned char SFRPAGE_SAVE = SFRPAGE;        // Save Current SFR page
    SFRPAGE = 0x00;   
    SSTA0 = 0x1a;      //  禁止波特率2分频,CLOCK OF UART0 IS TIMER3
    SCON0 = 0x50;      //  8 bit UART ,Enable receive            
    SFRPAGE = 0x01;
    TMR3CF = 0x08;     // sysclk as clk of Timer 3 ,up count
    TMR3CN = 0x00;     // auto-reload
        RCAP3 = -(int)(SYSCLK / BAUDRATE0 / 16);
    TMR3 = RCAP3;
        TR3 = 1;                //enable Timer 3 ,
        SFRPAGE = 0x00;
    RI0 = 0;
    TI0 = 0;
    SFRPAGE = SFRPAGE_SAVE;             // Restore SFR page
}
void UART1Init(void)
{
        unsigned char SFRPAGE_SAVE = SFRPAGE;// Save Current SFR page
        SFRPAGE = 0x01;
        SCON1   = 0x10;                     // 8 bit UART, enable receive
        SFRPAGE = 0x00;
        TMOD   &= 0x0F;
        TMOD   |=  0x20;                    // TMOD: timer 1, 8 bit auto-reload
        TCON = 0x40;                        //  enable Timer 1
        TH1 = -(SYSCLK / BAUDRATE1 / 2);
        CKCON |= 0x10;                   // T1M = 1; SCA1:0 = xx
        TL1 = TH1;                          // initialize Timer1
        TR1 = 1;                            // start Timer1
        SFRPAGE = 0x01;
        RI1 = 0;
        TI1 = 0;
        SFRPAGE = SFRPAGE_SAVE;             // Restore SFR page
}

void SysclkInit(void)
{  
        unsigned int idata Sci_time_temp;

        unsigned char SFRPAGE_SAVE = SFRPAGE;   // Save Current SFR page
        SFRPAGE = 0x0F;
        SysCalibrate(24500000);
        //OSCICN = 0xC3;                //Internal Oscillator Enabled,Internal Oscillator is divided by 1.
        //CLKSEL = 0x30;                //Output will be SYSCLK/8,
                                                //SYSCLK derived from the Internal Oscillator, and scaled as per the IFCN bits in OSCICN.
        //SFRPAGE = SFRPAGE_SAVE;                // Restore SFR page   


         Sci_time_temp=0x0FFFF;
        /************************************************************************
                                                                 OSCXCN:外部振荡器控制寄存器
        *          R           R/W           R/W                R/W         R/W  R/W   R/W          R/W         复位值
        *         XTLVLD  XOSCMD2  XOSCMD1  XOSCMD0        -        XFCN2  XFCN1 XFCN0        00000000
        *XTLVLD:晶体振荡器有效标志(只在XOSCMD=11x 时有效)
        *0:晶体振荡器未用或未稳定。
        *1:晶体振荡器正在运行并且工作稳定。
        *XOSCMD2-0:外部振荡器方式位
        *00x:关闭。XTAL1 引脚内部接地。
        *010:系统时钟为来自XTAL1 引脚的外部CMOS 时钟。
        *011:系统时钟为来自XTAL1 引脚的外部CMOS 时钟的二分频。
        *10x:RC/C 振荡器方式二分频。
        *110:晶体振荡器方式。
        *111:晶体振荡器方式二分频。
        *XFCN2-0:外部振荡器频率控制位
        *111: f > 6.7MHz
        ************************************************************************/
        OSCXCN=0x67;
         while(Sci_time_temp--);
         while(!(OSCXCN & 0x80));//等待XTLVLD为1
       
        /************************************************************************
                                                                OSCICN:内部振荡器控制寄存器
                R/W   R/W        R/W   R/W         R/W        R/W          R/W   R/W          复位值
          MSCLKE        -         -         IFRDY        CLKSL  IOSCEN        IFCN1  IFCN0 00010100
        *MSCLKE:时钟丢失检测器使能位
        *0:禁止时钟丢失检测器
        *1:使能时钟丢失检测器;检测到时钟丢失时间大于100微秒将触发复位.
        *IFRDY:内部振荡器频率准备好标志
        *0:内部振荡器不是按IFCN位指定的速度运行
        *1:内部振荡器按照IFCN位指定的速度运行
        *CLKSL:系统时钟源选择位
        *0: 选择内部振荡器作为系统时钟
        *1: 选择外部振荡器作为系统时钟
        *IOSCEN:内部振荡器使能位
        *0:内部振荡器禁止。
        *1:内部振荡器使能。
        *IFCN1-0:内部振荡器频率控制位
        *00:SYSCLK为内部振荡器2MHz。
        *01:SYSCLK为内部振荡器4MHz。
        *10:SYSCLK为内部振荡器8MHz。
        *11:SYSCLK为内部振荡器16MHz。
        ***********************************************************************/
        CLKSEL = 0x01;
         OSCICN=0X03;//OSCICN=0X88;
        SFRPAGE = SFRPAGE_SAVE;                // Restore SFR page   

}

最新回复

1、你确定是串口有数据发出来吗?最好用示波器量量晶体是否有起震,再量量你的串口是否有输出? 2、我感觉是你串口程序的问题。系统clk没有设置为外部晶体。一般这种问题,如果外接设备没问题的话,程序问题最大。 CLKSEL = 0x01;??是不是应该为0x09?  详情 回复 发表于 2009-10-1 08:51
点赞 关注

回复
举报

59

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
分数能改吗?解决了送100分,谢谢
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
按定时器设置计算出实际波特率,波特率误差不得大于3%
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

4
 
内部的是RC振荡器吧? 如果需要串口通讯,最好用晶体振荡器
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

5
 
除非不得已,不要将中端服务函数代码超过10行,指得是汇编的十行,c代码最好不超过5行。

建议只在中断服务函数中处理标志位,其余功能不要做,根据标志位,到主函数中处理其余功能。

再就是,串口通信开始之前,最好屏蔽中断,否则会对串口通信造成影响。
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

6
 
外部设备是什么啊?
内部RC看下用户手册上写的误差是多少
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

7
 
1、你确定是串口有数据发出来吗?最好用示波器量量晶体是否有起震,再量量你的串口是否有输出?
2、我感觉是你串口程序的问题。系统clk没有设置为外部晶体。一般这种问题,如果外接设备没问题的话,程序问题最大。
CLKSEL = 0x01;??是不是应该为0x09?
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表