打印
[51单片机]

请教一下这个程序,定时器和if函数冲突的

[复制链接]
1264|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
心印菩提|  楼主 | 2015-7-31 14:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 心印菩提 于 2015-7-31 14:26 编辑

各位前辈大家好我是个51新手
现在用C8051F040做实验
碰到下面这个问题

#include <c8051f040.h>                 // SFR declarations

sbit LED1    = P3^3;                   // LED1 ='1' means ON
sbit SW1     = P7^7;                   // SW1 ='0' means switch pressed



void Oscillator_Init();
void Timer_Init();      
void Oscillator_Init();   
void Port_IO_Init();
void Interrupts_Init();
void Init_Device(void);
void delay_ms(unsigned int t);


unsigned char count = 0 ;
void main (void)
{
        WDTCN = 0xde;                       // Disable watchdog timer
        WDTCN = 0xad;
   
        Init_Device();
    LED1 = 0;
               
  
   while (1)
   {
//   LED1 = 0;
//        delay_ms(5000);
//        LED1 = 1;
//        delay_ms(5000);
        
        if (SW1 == 0)                    //出问题的就是这一部分,这一部分不正确运行,一上电LED灯就亮了
    {                                          //而且不受按键控制
       LED1 = 1;                         //但是如果不初始化定时器,或者删除初始化函数中那句
    }                                        // SFRPAGE = TIMER01_PAGE,这一部分就可以正常运行
        else   
    {  
       LED1 = 0;                     // Else, turn it off
    }         
  }                                   // end of while(1)
              
}                                      // end of main()


void Timer_Init()
{
    SFRPAGE   = TIMER01_PAGE;                //这一句和while里面的if冲突,不知道为什么 ,如果不要这
    TMOD      = 0x01;                               //一句,if函数可以运行,但是我的定时器中断函数输出的P2
    TH0       = 0xF4;                                 //波形就没有了
        TL0       = 0x00;
        EA=1;                                                //总中断开
    TR0=1;                                                //定时方式
        ET0=1;

}

void Port_IO_Init()
{
    SFRPAGE   = CONFIG_PAGE;
    P3MDOUT   = 0xFF;
        P3                  = 0x08;
        P2MDOUT   = 0xFF;
        P2                  = 0x00;
        P6MDOUT   = 0xFF;

        P7MDOUT   = 0x00;
        P7        = 0xFF;
    XBR2      = 0x40;
}

void Oscillator_Init()
{
    int i = 0;
    SFRPAGE   = CONFIG_PAGE;
    OSCXCN    = 0x67;
    for (i = 0; i < 3000; i++);  // Wait 1ms for initialization
    while ((OSCXCN & 0x80) == 0);
    CLKSEL    = 0x01;                  
    OSCICN    = 0x00;
}

void Interrupts_Init()
{
    IE        = 0x02;
    IP        = 0xC2;
}


void Init_Device(void)
{
   
        Oscillator_Init();
    Port_IO_Init();
    Interrupts_Init();
        Timer_Init();
}

void delay_ms(unsigned int t)
{
        unsigned int i,j;
        for(i = t; i > 0; i--)
                for(j = 110; j > 0; j--);
}


void Timer0_ISR(void) interrupt 1
{
           TH0       = 0xF4;
        TL0       = 0x00;

        switch(count)
        {
                case 0:
                        P2 = 0x01;
                        break;
                case 1:
                        P2 = 0x03;
                        break;
                case 2:
                        P2 = 0x07;
                        break;
                case 3:
                        P2 = 0x06;
                        break;
                case 4:
                        P2 = 0x04;
                        break;
                case 5:
                        P2 = 0x00;
                        break;
                default:
                        break;
        }
        count++;
        if(count == 6)
                count = 0;

}

另外还有一个问题,我明明在IO初始化函数里面设置了P6为推挽,但我无法在程序中改变P6的值,事实上P4-P7我都无法改变它的值,请问这是为什么?
非常感谢

相关帖子

沙发
ayb_ice| | 2015-7-31 16:35 | 只看该作者
可能是寄存器页乱了

使用特权

评论回复
板凳
心印菩提|  楼主 | 2015-7-31 20:47 | 只看该作者
ayb_ice 发表于 2015-7-31 16:35
可能是寄存器页乱了

请问您乱是指的什么呢?
怎么引起的呢?
有没有解决办法呢?

使用特权

评论回复
地板
ayb_ice| | 2015-8-1 10:21 | 只看该作者
心印菩提 发表于 2015-7-31 20:47
请问您乱是指的什么呢?
怎么引起的呢?
有没有解决办法呢?

一般中断里要保存页,退出时恢复

使用特权

评论回复
5
oldzhang| | 2015-8-1 10:25 | 只看该作者
本帖最后由 oldzhang 于 2015-8-1 10:36 编辑

在if (SW1 == 0)前面
加一句   
SFRPAGE   = CONFIG_PAGE;
试试
P4-P7使用前都要加这句
在T0的中断函数最前面也要加
SFRPAGE   = TIMER01_PAGE;


总之,使用SFR寄存器,都要指明它页面
页面00,01,02,03,0F共5个页面


没用过C8051F040,只是根据PDF分析的

使用特权

评论回复
6
心印菩提|  楼主 | 2015-8-1 21:46 | 只看该作者
oldzhang 发表于 2015-8-1 10:25
在if (SW1 == 0)前面
加一句   
SFRPAGE   = CONFIG_PAGE;

非常感谢
我周一上班试试
:lol

使用特权

评论回复
7
心印菩提|  楼主 | 2015-8-1 21:47 | 只看该作者
ayb_ice 发表于 2015-8-1 10:21
一般中断里要保存页,退出时恢复

谢谢哈
我试过以后告诉您结果

使用特权

评论回复
8
心印菩提|  楼主 | 2015-8-3 09:33 | 只看该作者
本帖最后由 心印菩提 于 2015-8-3 09:40 编辑

.....

使用特权

评论回复
9
心印菩提|  楼主 | 2015-8-3 09:40 | 只看该作者
心印菩提 发表于 2015-8-1 21:46
非常感谢
我周一上班试试

SFRPAGE = CONFIG_PAGE;   //增加这一句
  if (SW1 == 0)                  
    {                                       
       LED1 = 1;         
     .....

void Timer0_ISR(void) interrupt 1
{
        TH0       = 0xF4;
        TL0       = 0x00;
        SFRPAGE = CONFIG_PAGE;     //这里增加这一句
        switch(count)
        {
                case 0:
                        P6 = 0x01;
                        break;
                case 1:
       .....
              
非常感谢您的指导,加了这样一句以后问题都解决了,可以使用P6,IF后面的按键也OK了
同时再请教几个问题:
1.发现这样的个问题
      void Timer0_ISR(void) interrupt 1
{
//     SFRPAGE = CONFIG_PAGE;     如果在这里写,我P6的输出频率就变了,本来设置的是100Hz,变成了2.33Hz
        TH0       = 0xF4;
        TL0       = 0x00;
//     SFRPAGE = CONFIG_PAGE;     而写在这里,是正确的
请问这是为什么
2.为什么P0-P3操作不需要操作SFRPAGE呢
3.请问您是在PDF的哪部分看的这个操作的呢,我看的翻译过来那个版本描述得并不具体,英文版和中文版的手册里都没有提到比如CONFIG_PAGE和TIMER01_PAGE这些东西,只是在C8051F040.H的头文件里能找到这个宏定义,您能讲讲这个SFRPAGE具体使用的方法吗?
非常感谢

使用特权

评论回复
10
oldzhang| | 2015-8-3 22:24 | 只看该作者
我没用过C8051F040,只是根据PDF文档分析的。
给你PDF文档,P0-P3是哪个页面都行,P4-P7才需要分页
//     SFRPAGE = CONFIG_PAGE;     如果在这里写,我P6的输出频率就变了,本来设置的是100Hz,变成了2.33Hz

//
加了这句就改变了页面TH0是0X00页面的0X8C地址,你SFRPAGE = CONFIG_PAGE;就把页面切换到0X0F页面了,而0X0F页面的0X8C就不是TH0,具体是什么可以看资料。

C8051F040_datasheet.pdf

2.06 MB

使用特权

评论回复
11
ayb_ice| | 2015-8-4 07:59 | 只看该作者
有些寄存器是不用切页的,因为所有页都包含有,这一般是常用的寄存器和51标准的寄存器

另外一些是需要切页的,使用前一般要切页,除非当前页就是正确的,

中断返回时必须与进入之前页相同,否则问题不小

使用特权

评论回复
12
心印菩提|  楼主 | 2015-8-5 16:53 | 只看该作者
oldzhang 发表于 2015-8-3 22:24
我没用过C8051F040,只是根据PDF文档分析的。
给你PDF文档,P0-P3是哪个页面都行,P4-P7才需要分页

懂了  
太感谢了哈

使用特权

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

本版积分规则

9

主题

39

帖子

0

粉丝