打印

高分求助定时器0的程序问题

[复制链接]
1743|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
smallred007|  楼主 | 2012-3-29 22:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 smallred007 于 2012-3-29 22:45 编辑

#include<p18cxxx.h>
/************给程序写配置字*****************/
/*******************************************/
#pragma config OSC=HS,OSCS=ON//设置晶振为高速模式12MHZ,禁用晶体振荡器
#pragma config BORV=45,PWRT=ON,BOR=ON//掉电复位电压设为4.5V,启用上电定时器,
#pragma config WDT=OFF//关闭看门狗
#pragma config DEBUG=OFF,LVP=OFF,STVR=OFF//关背景调试,禁用栈溢出复位,禁用低电压
/**********写main主程序***********************/
/*********************************************/
#define mybit PORTDbits.RD4
void msdelay(void);
void main(void)
{
TRISDbits.TRISD4=0;
mybit=0;
while(1)
{
  mybit=mybit^1;
  msdelay();
}
}
/*晶振选择12MHZ,选择预分频为64:1*/
void msdelay(void)
{
T0CON=0x85;
TMR0H=0xA4;
TMR0L=0x72;
T0CONbits.TMR0ON=1;
while(INTCONbits.TMR0IF==0);
T0CONbits.TMR0ON=0;
INTCONbits.TMR0IF=0;
}

我想用定时器0产生0.5s的定时,使用12M的晶振,采用1:64预分频。
程序编写软件用PICC-MCC18编译。
程序可以顺利通过,为什么运行后发现这二极管灯闪的很快呢?

但我用MPLAB自带的SIM模拟,发现程序msdelay()确实是延时了0.5s的时间。
有高手能指点一二吗?
沙发
caijun_2012| | 2012-3-29 23:07 | 只看该作者
用18F那款芯片啊????????????

使用特权

评论回复
板凳
yewuyi| | 2012-3-30 10:34 | 只看该作者
请勿使用delay等独占CPU的方式产生延时。

使用特权

评论回复
地板
kvdong| | 2012-3-30 16:43 | 只看该作者
本帖最后由 kvdong 于 2012-3-30 16:44 编辑

晶振设置正确吗?
另外你所谓的快是个什么概念呢?
也就是说闪烁频率大概在多少呢?

使用特权

评论回复
5
smallred007|  楼主 | 2012-3-30 18:00 | 只看该作者
我作用的单片机是PIC18F452。
原来考虑的是二极管闪烁500ms的时间,可是实际运行的结果是很快很快。

使用特权

评论回复
6
yewuyi| | 2012-3-31 08:44 | 只看该作者
设置晶振为高速模式12MHZ,禁用晶体振荡器?

这是什么意思?你的高速晶振12MHZ从何而来?你是不是设成了内部高速RC振荡了啊?

使用特权

评论回复
7
NE5532| | 2012-3-31 12:39 | 只看该作者
定时器时间到了不需要重新加载TMR0H=0xA4;
TMR0L=0x72;


??


另外楼主这种死等定时器中断的方法是最笨的程序方法哈。

使用特权

评论回复
8
smallred007|  楼主 | 2012-3-31 17:43 | 只看该作者
我是在测试方法,刚刚学到定时计数器。
其它的方法目前还不会啊。

使用特权

评论回复
9
smallred007|  楼主 | 2012-3-31 18:36 | 只看该作者
#include<p18cxxx.h>
/************给程序写配置字*****************/
/*******************************************/
#pragma config OSC=HS,OSCS=OFF//设置晶振为12MHZ外部晶振,禁用晶体振荡器
#pragma config BORV=45,PWRT=ON,BOR=ON//掉电复位电压设为4.5V,启用上电定时器,
#pragma config WDT=OFF//关闭看门狗
#pragma config DEBUG=OFF,LVP=OFF,STVR=OFF//关背景调试,禁用栈溢出复位,禁用低电压

/**********写main主程序***********************/
/*********************************************/
#define mybit PORTDbits.RD4
void msdelay(void);
void main(void)
{
        TRISDbits.TRISD4=0;//变成位运算
        T0CON=0x85;
        while(1)
        {
                mybit=mybit^1;//变成位运算
                msdelay();                               
        }
}

/*晶振选择12MHZ,选择预分频为1:64*/
void msdelay(void)
{
        TMR0H=0xA4;
        TMR0L=0x72;       
        T0CONbits.TMR0ON=1;
        while(INTCONbits.TMR0IF==0);
        T0CONbits.TMR0ON=0;
        INTCONbits.TMR0IF=0;
}
郁闷,变成位运算效果就有了。

使用特权

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

本版积分规则

0

主题

21

帖子

1

粉丝