下面贴出LED闪灯的源码,并逐句子进行解说。
#include "p30f6014A.h" //包括头文件
_FOSC(CSW_FSCM_OFF & XT_PLL16); //装备时钟
_FWDT(WDT_OFF); //封闭看门狗
假定运用的外部晶振为5Mhz,体系指令周期的计算方法为:
5M*16/4=20MIPS
16为16倍频,每履行一条指令要4个时钟周期,因而要除四,就得到了实践的体系时钟。
IO端口的装备
IO端口运用很简单,和51比较仅仅多了一个方向操控,在运用端口之前 ,先设置好方向。假定咱们运用的端口A的第十位作为LED的操控位,首要设置该管脚的方向,
TRISAbits.TRISA10 = 0;//该方位零为输出,置1位输入
操控端口实践输出凹凸电平的寄存器位LATAbits,将该寄存器的LATA10位进行置1置0操作,即可输出高、低电平。
#define LED LATAbits.LATA10
值得注意的是,当进行读引脚操作时,要读PORTAbits寄存器,而不是LATAbits寄存器。
咱们是选用守时500ms中止的方法来进行LED的亮灭操控,因而需求进行守时器的装备,这儿运用的是16位守时器timer1。涉及到两个函数。
ConfigIntTimer1(5);//初始化守时器1,中止优先级为5
OpenTimer1(39062);//进行相关装备并翻开守时器1
void ConfigIntTimer1(unsigned char priority)
{
IFS0bits.T1IF = 0 //铲除中止标志
IPC0bits.T1IP = priority; //设置中止优先级
IEC0bits.T1IE = 1; //使能中止
}
void OpenTimer1(unsigned int period)
{
TMR1 = 0; /* Reset Timer1 to 0x0000 */
PR1 = period; //中止周期
T1CONbits.TCS = 0; //挑选时钟源
T1CONbits.TSYNC =1;
T1CONbits.TCKPS =3; //256分频
T1CONbits.TGATE =0;
T1CONbits.TSIDL =0;
T1CONbits.TON = 1; //发动守时器
}
挑选体系时钟(20MIPS),并进行256分频,20M/256=78125,阐明守时器计时到78125要用1秒钟,守时到500ms需求39062个周期,因而需求设置计时周期为39062,并且因为守时器1为16位守时器,无法计时到一秒,假如需求计时1s能够运用32位守时器timer23和timer45。
守时器1中止函数
void __attribute__((__interrupt__, no_auto_psv)) _T1Interrupt(void)
{
IFS0bits.T1IF = 0;//清零中止标志
LED = !LED;//对LED循环取反,进行亮灭操控
}
如此便可完成LED闪耀功用。
附上完好的工程源码,请下载检查:
http://forum.eepw.com.cn/thread/276018/1
在运用该款单片机的时分还需求注意几个问题:
1、 因为单片机的管脚有复用功用,在运用端口B的时分,假如想将端口B的第7位用作数字IO,需求这样来设置,(其它端口无需这样操作)
ADCON1bits.ADON = 0;//封闭AD转换器
ADPCFGbits.PCFG7 = 1;//该位有必要置位,不然PORTB_7无法用作数字IO管脚
2、 在体系的装置目录下,自带了单片机各个资源的运用例程,运用者能够参阅。我的目录是:C:\Program Files (x86)\Microchip\MPLAB C30\src\peripheral_30F_24H_33F\src\ pmc (供参阅)
3、 在运用串口资源时,需求精确设定串口波特率,以设置UART1, 9600波特率为例,波特率计算方法为:20MIPS/((9600+1)*16)=130。将130赋给U1BRG寄存器即可。
4、 该单片机具有内部EEPROM,假如需求存储的数据量不大的话,一些需求掉电存储的参数能够存储在单片机内部,可简化外部电路设计。
有了以上的根底,信任学习这款单片机就轻松多了,能够使初学者少走弯路,集中精力处理本质性问题,以上是自己个人的一点经历,如有遗漏之处,欢迎纠正。