// 本次实验实现:通过定时器比较模式,输出PWM波-改变LED亮度
#include
#define uint unsigned int
#define uchar unsigned char
#define LED1 P1_0 //P1.0口控制LED1
void Init_Led(); //声明初始化LED函数
void Init_Timer1(); //声明定时器T1初始化函数
void Init_Clock(); //声明初始化时钟函数
void Delay(uint ms); //声明延时函数
/*=======================主程序入口============================*/
void main()
{
Init_Led(); //初始化LED灯
Init_Clock(); //初始化时钟
Init_Timer1(); //初始化定时T1
/********************************************************************
* 通过依次给T1CC2L赋不同的值,
* 进而改变PWM的占空比,来控制LED的亮度。
* 现象:LED由 暗 慢慢 变亮 一直循环。
*******************************************************************/
while(1)
{
uchar i;
uchar array[11]={0xF7,0xE1,0xC8,0xAF,0x96,
0x7D,0x64,0x4B,0x32,0x19,0x0A};
//占空比依次增大,LED逐渐变亮
for(i = 0; i < 11; i++)
{
T1CC2H = 0x00;//高位不变
T1CC2L = array[i];//依次改变占空比
Delay(50000);
Delay(50000);
}
}
}
/*=======================声明函数的具体实现==========================*/
void Init_Led()
{
P1SEL &=~ 0x03; //配置P1.0 P1.1为通用I/O口
P1DIR |= 0x03; //配置P1.0 P1.1为输出
LED1 = 0; //初始LED1为熄灭
}
void Init_Timer1()
{
PERCFG |= 0X40;//选定时器T1的I/O位置 置1:备用位置2
P2SEL &= ~0X10;//定时器1优先
P2DIR |= 0XC0; //第1优先级:定时器1通道2-3
P1DIR |= 0XFF; //端口1为输出
P1SEL |= 0X01; //timer1 通道2映射口P1.0为外设
//以上是配置PWM输出在P1_0脚,P1_0接有LED灯
//定时器通道0初值 1ms的周期时钟,频率为976.516Hz
T1CC0H = 0X00;
T1CC0L = 0Xff; //255
//以上是为了确定基准频率
//定时器通道2比较值 修改T1CC2L可调整led的亮度
T1CC2H = 0X00;
T1CC2L = 0X7D; //125 ≈255%2;50%的占空比
//以上就是相对与基准频率 改变的占空比
T1CCTL2 = 0x1c; //通道2比较模式
T1CTL = 0x02; //250KHz 不分频
}
void Init_Clock()
{
CLKCONCMD &= ~0x40; //系统时钟源选择:外部32MHz 。
while(!(SLEEPSTA & 0x40));//等待晶振稳定
CLKCONCMD &= ~0x47; //128分频 CLKSPD不发分频
SLEEPCMD |= 0x04; //关闭不用的RC振荡器
}
void Delay(uint ms)
{
uint i,j;
for(i=0; i<ms; i++)
for(j=0; j<535;j++);
}
如果大家觉得实验中一些寄存器的配置不是很明白,大家就拿出咱们吃饭的家伙CC2530的数据手册来把实验中出现的寄存器在手册中查找,去理解,数据手册网上多的是。
啃骨头,要好好啃,使劲啃,啃到底,才能啃到精髓嘛~~
我会每天更新一篇ZigBee入门-CC2530-的基础实验,让大家学习Zigbee技术不在是从入门到“入土”,而是从入门到巅峰~!!!欢迎大家的留言和评论我会在看到的第一时间内答复。
看完后感觉得到帮助的小伙伴,要点点赞哦~给笔者一些动力嘛!谢谢啦~
嵌入式Pro 原创文章 7获赞 7访问量 131 关注 私信 展开阅读全文