STM32F4驱动MB1504,示器上测不出波形,哪位大神进来帮忙看看,感激不尽

2019-07-20 16:37发布

#include "sys.h"
#include "delay.h"  
#include "usart.h"  
#include "led.h"
#include "mb1504.h"
int main(void)
{   
        Stm32_Clock_Init(336,8,2,7);//设置时钟,168Mhz
        delay_init(168);                        //延时初始化  
        mb1504_Init();
        SCLK_L;
    LE_L;
    DAT_L;
                                                 
    while(1)
                Write_MB1504(30000);        //单位KHz
       
}

#include "mb1504.h"
#include "sys.h"
#include "delay.h"

#define ulong unsigned long

u32  temp=0;  
u32 R=1200;       
                                //晶振fosc=12.00MHz,P=32,则frequ=(32*N+A)*12000000/1200
                                //N=(frequ/10000)/32;        A=(frequ/10000)%32;由此得到的频率frequ单位是Hz

u32 N;                        //可编程计数器分频比   N       
u32 A;                        //吞除脉冲计数器分频比 A

u32 frequ;

void mb1504_Init(void)
{
        RCC->AHB1ENR|=1<<2;
        GPIO_Set(GPIOC,PIN0|PIN1|PIN2,GPIO_MODE_OUT,0,0,GPIO_PUPD_PD);
}


void write_R(void)
{
        u32 i;   
        LE_L; // delay_us(1);   
        DAT_L; //delay_us(1);     
        SCLK_L;//delay_us(3);   
        DAT_H; //delay_us(3);//SW位,前置分频,0为64/65,1为32/33   
        SCLK_H;//delay_us(3);   
        SCLK_L;//delay_us(1);   
        temp=R;
        delay_us(1);   
        for(i=0;i<14;i++)   //(14数据)14位可编程参考分频器   
        {  
                if((temp&0x2000)==0x2000)
                        DAT_H;                 //写R分频系数共14位,先写高位      
                else           
                        DAT_L;
                delay_us(3);   
                SCLK_H;
                delay_us(3);   
                SCLK_L;
                delay_us(3);   
                temp=temp<<1;      
        }  
        DAT_H; //delay_us(3);//控制位C,1时写入R寄存器  
        SCLK_H;
        delay_us(3);  
        SCLK_L;
        delay_us(2);      
        LE_H;  
        delay_us(3);//使能信号,上升沿数据打入对应寄存器  
        SCLK_L;
//        LE_L;
        delay_us(2);   
        //ENB=0;   
}  


void write_NA(u32 N,u32 A)
{   
        u32 i;   
        LE_L;  
        delay_us(1);   
        DAT_L;
        delay_us(1);   
        SCLK_L;
        delay_us(1);  
        temp=N;
        delay_us(1);
       
        for(i=0;i<11;i++)        //写N,共11位      
        {  
                if((temp&0x400)==0x400)
               
                        DAT_H;      
                else         
                        DAT_L;
                delay_us(3);  
                        SCLK_H;
                delay_us(3);   
                        SCLK_L;
                delay_us(2);   
                        temp=temp<<1;
                delay_us(1);        
        }   
        temp=A;   
        for(i=0;i<7;i++)       //写A,共7位      
        {  
                if((temp&0x40)==0x40)
//                if(temp&0x40)               
                        DAT_H;                                                                      
                else                
                        DAT_L;
                delay_us(2);   
                        SCLK_H;
                delay_us(3);   
                        SCLK_L;
                delay_us(2);  
                        temp=temp<<1;         
        }      
        DAT_L;
        delay_us(1);//控制为C,0时数据写入NA寄存器  
        SCLK_H;
        delay_us(3);
        SCLK_L;
        delay_us(1);   
        LE_H;  
        delay_us(3); //使能信号,上升沿数据打入对应寄存器  
        SCLK_L;
        delay_us(2);
        LE_L;
        delay_us(1);     
//        DAT_H;delay_us(1);
}


void Write_MB1504(ulong Frequ)
{   
        int M=(int)(Frequ/10);  //转化成整形数据(见程序开头处的解释)
                                                    //这里本该除以10k,如今只除以10,那么得到的频率frequ的单位是KHz
                                                        //int M=(int)(frequ/10.24),外部晶振为12.2886M时
                                                       

    N=M/32;                                        //前置分频系数P=32,若P=64,这里就改为64
    A=M%32;
    write_R();          
        delay_us(2);//写入晶振频率
    write_NA(N,A);
        delay_us(1);                   //写入N、A
//        display_Freq(Frequ);
}


#ifndef __mb1504_H
#define __mb1504_H
#include "sys.h"

#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long

#define SCLK_H GPIOC->ODR|=1<<0
#define SCLK_L GPIOC->ODR&=~(1<<0)
#define DAT_H GPIOC->ODR|=1<<1
#define DAT_L GPIOC->ODR&=~(1<<1)
#define LE_H GPIOC->ODR|=1<<2
#define LE_L GPIOC->ODR&=~(1<<2)

void mb1504_Init(void);
//void display_Freq(ulong Freq);
void write_R(void);
void write_NA(u32 N,u32 A);
void Write_MB1504(ulong Frequ);

#endif



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。