DS1302程序

2019-03-24 21:09发布

帮忙请各位看看这段程序
主程序前半部分部分:
int main(void)
{
    int bee;//蜂鸣器鸣响时间计数
        int bee_on;//闹铃标志

    DDRA |= (1<<PA3);//初始化蜂鸣器蜂鸣器
    PORTA &= ~(1<<PA3);
   

    PORTD |= (1 << PD2);
        PORTD |= (1 << PD3);
        PORTD |= (1 << PD6);
        PORTD |= (1 << PD7);//四个按键均使能上拉电阻,低电平触发
        DDRD &= ~(1 << PD2);
        DDRD &= ~(1 << PD3);
        DDRD &= ~(1 << PD6);
        DDRD &= ~(1 << PD7);//四个按键置为输入方式
       
        MCUCR=0b00000010;//INT0设置为下降沿触发
        GICR |= (1 << INT0);//使能INT0
       
        LCD_Init();
        init_USART();
        init_SPI();       
   
     
   SREG=SREG|0x80;//使能全局中断
          

  DS1302_EXIST=check_RTC();//检测DS1302的存在

   if(DS1302_EXIST)
           {
             put_s("Send a or A to init time...");
         put_s("Send b or B to set the clock time...");
                 put_s("send c or C read the cur_time...");
                }
     else
            {
                  put_s("RTC not found");
                 }
   
      
     }
因为我是单步调试的,运行到这里以后,一直出现RTC not found;可是我明明在仿真设置中接了DS1302;
DS1302部分子程序及其调用的SPI:
unsigned char check_RTC(void)
{
        unsigned char i;
       
       
    Single_SPI(CMD_CONTROL|CMD_WRITE,CFG_UNPROTECT);//写允许
    Single_SPI(CMD_RAM_BASE|CMD_WRITE,0xA5);                //写RAM0
    Single_SPI(CMD_CONTROL|CMD_WRITE,CFG_PROTECT);        //写保护
    i=Single_SPI(CMD_RAM_BASE|CMD_READ,0);                        //读取RAM0
    if(i==0xA5)        return 1;
    else                 return 0;
}

Single_SPI    : 使用SPI接口读写数据到DS1302

输入参数:        command:        命令选择;
                        wdata:                写入的数据;
返回值                rdata:                读回的数据;       
   (SPI的收发是同时进行的)
-----------------------------------------------------------------------*/
unsigned char Single_SPI(unsigned char command,unsigned char wdata)
{
        unsigned char rdata;
    EnDS1302;                                                        // 使能LCD
    Delay10uS();
    spi_rw(command);                                         // 传送命令到SPI寄存器
    Delay10uS();
    rdata = spi_rw(wdata);                                 // 传送数据到SPI寄存器
    DiDS1302;                                                        // 关断LCD SPI通讯
    Delay10uS();
    return rdata;
}


char spi_rw(char wdata)
{
    #ifndef _V_SPI_
        SPDR = wdata;// 传送数据到SPI寄存器
    while((SPSR&(1<<SPIF))==0);// 等待数据传送完? LOOP_UNTIL_BIT_IS_SET(SPSR,SPIF)
    return(SPDR);// 读取数据
        #else
        char rdata = 0;
        char i = 0;

        for(i = 0;i < 8;i ++)
        {
                SPI_PORT &= ~(1 << DS1302_SCK);//时钟拉低

                if(wdata & 0x01)
                {
                        SPI_PORT |= (1 << DS1302_MOSI);
                }
                else
                {
                        SPI_PORT &= ~(1 << DS1302_MOSI);
                }
                wdata >>= 1;//右移一位

                rdata >>= 1;//右移一位
                if(SPI_PIN & (1 << DS1302_MISO))
                {
                        rdata |= 0x80;
                }
               
                SPI_PORT |= (1 << DS1302_SCK);//时钟拉高,产生上升沿
        }
        SPI_PORT &= ~(1 << DS1302_SCK);//时钟拉低
    return(rdata);// 读取数据

        #endif
} 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
1条回答
加油费
1楼-- · 2019-03-25 03:12
硬件电路:

一周热门 更多>