论坛首页 > 初学者园地 > 学学单片机 > dsPIC33F系列入门续1
查看:758  |  回复:2
dsPIC33F系列入门续1
飞鸿踏雪泥
3
主题
26
回复
发表于Fri Sep 23 09:52:13 CST 2016   |  只看该作者 1# 电梯直达

    此帖接着<dsPIC33F系列入门>.

    为什么重新开一贴,主要是因为之前的帖子不能上传压缩文件,所以不得不重开一帖,望大家谅解.

回复 收藏
  举报
飞鸿踏雪泥
3
主题
26
回复
发表于Fri Sep 23 09:56:05 CST 2016   |  只看该作者 2#

    今天更新的内容有两个.

    第一是如何配置dsPIC33F系列单片机的内部时钟源

源代码

#include <p33FJ128MC804.h>
//内部振荡器7.3728MHz
//FCY=FOSC/2
//FOSC=FIN*(M/(N1*N2))
//FIN=7.3728M,M=32,N1=4,N2=8
//FOSC=7.3728M,FCY=3.68M
_FOSCSEL(FNOSC_FRCPLL & IESO_OFF)
_FOSC(FCKSM_CSDCMD & IOL1WAY_OFF & OSCIOFNC_OFF & POSCMD_NONE)

typedef unsigned int  uint;//长度为0-65535
typedef unsigned char uchar;//长度为0-255
typedef unsigned long ulong;

void initial_mcu_memory();//主存初始化
void initial_peripheral();//常规外设初始化
void delay_short(uint ui_delay_short);//短延时
void delay_long(uint ui_delay_long);//长延时

int main()
{
initial_mcu_memory();//主存初始化
delay_long(10);//延时,等待常规外设供电稳定
initial_peripheral();//常规外设初始化

while(1)
{
PORTCbits.RC6=~PORTCbits.RC6;
        PORTCbits.RC7=~PORTCbits.RC7;
delay_long(100);
}
}

void initial_mcu_memory()//主存初始化
{
OSCCONbits.COSC=1;//带PLL的快速RC振荡器
OSCCONbits.LPOSCEN=0;//禁止辅助振荡器

CLKDIVbits.PLLPRE=2;//N1=4,PLL相位检测器输入分频比
CLKDIVbits.PLLPOST=3;//N2=8,PLL后分频比
CLKDIVbits.FRCDIV=0;//内部快速RC振荡器后分频比,1分频
CLKDIVbits.DOZE=3;//FCY分频比,8分频

//PLLFBDbits.PLLDIV=8;//M=8,PLL倍频比,8倍频
//PLLFBDbits.PLLDIV=32;//M=32,PLL倍频比,32倍频
//PLLFBDbits.PLLDIV=64;//M=64,PLL倍频比,64倍频
PLLFBDbits.PLLDIV=128;//M=128,PLL倍频比,128倍频
//PLLFBDbits.PLLDIV=256;//M=256,PLL倍频比,256倍频
//PLLFBDbits.PLLDIV=512;//M=512,PLL倍频比,512倍频
OSCTUNbits.TUN=0;//FRC振荡器调节位,标称值7.37M

TRISCbits.TRISC6=0;//RC6配置输出
    TRISCbits.TRISC7=0;//RC7配置输出
}

void initial_peripheral()//常规外设初始化,暂时无
{
;
}

void delay_short(uint ui_delay_short)
{
uint i;
for(i=0;i<ui_delay_short;i++)
{
;
}
}

void delay_long(uint ui_delay_long)//长延时
{
uint i;
uint j;
for(i=0;i<ui_delay_long;i++)
{
for(j=0;j<500;j++)
{
;
}
}
}

飞鸿踏雪泥
3
主题
26
回复
发表于Fri Sep 23 09:57:06 CST 2016   |  只看该作者 3#

    第二个程序为独立按键程序,主要通过主程序扫描实现

#include <p33FJ128MC804.h>
//内部振荡器7.3728MHz
//FCY=FOSC/2
//FOSC=FIN*(M/(N1*N2))
//FIN=7.3728M,M=32,N1=4,N2=8
//FOSC=7.3728M,FCY=3.68M
_FOSCSEL(FNOSC_FRCPLL & IESO_OFF)
_FOSC(FCKSM_CSDCMD & IOL1WAY_OFF & OSCIOFNC_OFF & POSCMD_NONE)

typedef unsigned int  uint;//长度为0-65535
typedef unsigned char uchar;//长度为0-255
typedef unsigned long ulong;

#define ui_key_jitter_time1 20//按键1消抖延时
#define key_input0 PORTBbits.RB7
#define led0 PORTCbits.RC6
#define led1 PORTCbits.RC7 

//后缀带step,表示该变量属于switch循环  
//后缀带cnt,表示该变量为计数量
//key_scan()函数按键扫描函数
uchar uc_key_trigger_number=0;//触发按键编号
//按键1相关变量定义
uint ui_key_jitter_cnt1=0;//按键1消抖时长
uchar uc_key_lock_flag1=0;//按键1触发自锁标志

void initial_mcu_memory();//主存初始化
void initial_peripheral();//常规外设初始化
void key_scan();//按键扫描函数
void key_action();//按键动作函数
void delay_short(uint ui_delay_short);//短延时
void delay_long(uint ui_delay_long);//长延时

int main()
{
initial_mcu_memory();//主存初始化
delay_long(10);//延时,等待常规外设供电稳定
initial_peripheral();//常规外设初始化

while(1)
{

key_scan();//按键扫描函数
key_action();//按键动作函数
}
}

void initial_mcu_memory()//主存初始化
{
OSCCONbits.COSC=1;//带PLL的快速RC振荡器
OSCCONbits.LPOSCEN=0;//禁止辅助振荡器

CLKDIVbits.PLLPRE=2;//N1=4,PLL相位检测器输入分频比
CLKDIVbits.PLLPOST=3;//N2=8,PLL后分频比
CLKDIVbits.FRCDIV=0;//内部快速RC振荡器后分频比,1分频
CLKDIVbits.DOZE=3;//FCY分频比,8分频

//PLLFBDbits.PLLDIV=8;//M=8,PLL倍频比,8倍频
PLLFBDbits.PLLDIV=32;//M=32,PLL倍频比,32倍频
//PLLFBDbits.PLLDIV=64;//M=64,PLL倍频比,64倍频
//PLLFBDbits.PLLDIV=128;//M=128,PLL倍频比,128倍频
//PLLFBDbits.PLLDIV=256;//M=256,PLL倍频比,256倍频
//PLLFBDbits.PLLDIV=512;//M=512,PLL倍频比,512倍频
OSCTUNbits.TUN=0;//FRC振荡器调节位,标称值7.37M

TRISBbits.TRISB7 = 1;//RB7配置输入
CNPU2bits.CN23PUE = 1;//RB7使能弱上拉

TRISCbits.TRISC6=0;//RC6配置输出
    TRISCbits.TRISC7=0;//RC7配置输出
}

void initial_peripheral()//常规外设初始化,暂时无
{
;
}

void key_scan()//按键扫描函数
{  
if(key_input0==1)//IO高电平,按键未按下,及时清零标志位
{
uc_key_lock_flag1=0;//按键自锁标志清零
ui_key_jitter_cnt1=0;//按键消抖计数器清零    
}
else if(uc_key_lock_flag1==0)//按键按下,且第一次被按下
{
ui_key_jitter_cnt1++;//按键消抖延时计数器累加
if(ui_key_jitter_cnt1>ui_key_jitter_time1)
{
ui_key_jitter_cnt1=0; 
uc_key_lock_flag1=1;//自锁按键置位,避免一直触发
uc_key_trigger_number=1;//触发1号键
}
}
}

void key_action()////按键动作函数
{
switch(uc_key_trigger_number)//按键触发切换
{
case 1://1号键,S0
{
led0=~led0;
        led1=~led1;
uc_key_trigger_number=0;//按键触发编号清零,避免一直触发
}
break;                    
}                
}

void delay_short(uint ui_delay_short)
{
uint i;
for(i=0;i<ui_delay_short;i++)
{
;
}
}

void delay_long(uint ui_delay_long)//长延时
{
uint i;
uint j;
for(i=0;i<ui_delay_long;i++)
{
for(j=0;j<500;j++)
{
;
}
}
}


  • 温馨提示:标题不合格、重复发帖、发布广告贴,将会被删除帖子或禁止发言。 详情请参考:社区发帖规则
  • 您当前输入了 0个文字。还可以输入8000个文字。 已添加复制上传图片功能,该功能目前仅支持chrome和火狐

顶部