此程序是我根据周立功课本里面的程序修改的,
程序设定KEY1连接外部中断0,设置外部中断唤醒掉电CPU. 在掉电前,LED1闪烁10次(注意闪烁频率),然后进入掉电模式。一旦被外部中断唤醒,第一次实验不进行PLL重设定,再次让LED1闪烁10次,观察LED1闪烁频率。第二次实验进行PLL重设定,恢复掉电前的PLL设定,再次观察LED1闪烁的频率。
从实验结果可以看出,如果不进行PLL重设定,唤醒后LED1闪烁频率会比掉电前慢许多;进行PLL重新设定后,唤醒后LED1闪烁频率和掉电前一样。
实验程序如下所示:
#include
typedef unsigned char uint32;
void Delayn(unsigned long n);
void HC595_Init(void);
void WriteByte(unsigned char data);
void Write595(void);
unsigned int HC595_DATA = 0;
#define SCLK 0x01<<24
#define MISO 0x01<<5
#define MOSI 0x01<<6
#define RCK 0x01<<7
//初始化595接口
void HC595_Init(void)
{
IO0DIR |= MOSI|RCK;
IO1DIR |= SCLK;
IO1CLR |= SCLK;
IO0DIR |= RCK;
HC595_DATA = 0xFFFFFFFF;
Write595();
}
//写字节
void WriteByte(unsigned char data)
{
unsigned char i;
//IO0CLR = RCK;
for(i=0;i<8;i++)
{
if(data&0x01) IO0SET=MOSI;
else IO0CLR=MOSI;
IO1SET=SCLK;
data>>=1;
IO1CLR=SCLK;
}
//IO0SET = RCK;
}
//刷新595的数据
void Write595(void)
{
IO0CLR = RCK;
WriteByte(HC595_DATA&0xff);
WriteByte((HC595_DATA&0xff00)>>8);
WriteByte((HC595_DATA&0xff0000)>>16);
WriteByte((HC595_DATA&0xff000000)>>24);
IO0SET = RCK;
}
main()
{
//初始化74HC595
HC595_Init();
uint32 i;
PINSEL1=0x00000001; //P0.16连接EINT0
PINSEL2=PINSEL2&(~0x08);//P1[25:16]连接GPIO
IO1DIR |= SCLK; //P.18控制LED1,低电平点亮(设置LED1控制口为输出,其余I/O为输入)
EXTWAKE=0x01; //外部中断0唤醒芯片
EXTINT=0x01; //清除EINT0中断标志
//掉电前闪烁10次,注意闪烁频率
for(i=0;i<10;i++)
{
//IO1SET=1<<18; //LED1亮
HC595_DATA &=~(1<<18);
Write595();
Delayn(2500000);
//IO1CLR=1<<18; //LED1灭
HC595_DATA |=(1<<18);
Write595();
Delayn(2500000);
}
PCONP=0x00; //关闭定时器,RTC和UART等功能部件
PCON=0x03; //系统进入掉电模式
//摁KEY1键唤醒CPU
//实验分两次进行,第一次不进行PLL重新设定,观察掉电前和唤醒后LED1的闪烁频率;
//第二次加上PLL重设定,再次观察掉电前和唤醒后LED1闪烁频率
/*重新设定PLL——开始*/
/* PLLCON=1; //使能PLL
PLLCFG=0x23; //设置M为4,P为2,和掉电前一样
PLLFEED=0xaa; //发送PLL馈送序列
PLLFEED=0x55;
while((PLLSTAT&(1<<10))==0); //等待PLL锁定
PLLCON=3; //PLL使能和连接
PLLFEED=0xaa;
PLLFEED=0x55;
*/
/*重新设定PLL--结束*/
//唤醒后闪烁10次,注意闪烁频率
for(i=0;i<10;i++)
{
//IO1SET=1<<18;
HC595_DATA &=~(1<<18);
Write595();
Delayn(250000);
//IO1CLR=1<<18;
HC595_DATA |=(1<<18);
Write595();
Delayn(250000);
}
while(1);
}
//延时周期数
void Delayn(unsigned long n)
{
while(n--);
}
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』