#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
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>