1、PWM
(1)芯片一共有6个PWM通道(PWM0~PWM5)
(2)IRCH时钟(IRCH 频率为 16MHz)
(3)IRCL时钟(IRCL频率为100KHz)
(4)PFG时钟(PWM0的时钟固定为PFG)
(5)PWM1~5可以选择IRCH、IRCL和PFG时钟作为时钟源
(6)例程:
#define PWMxDIV 100 //分频比,根据时钟源可以算出频率
#define PWMxDUT 50 //50除以100为占空比
PWMxDIVH = PWMxDIV / 256
PWMxDIVL = PWMxDIV % 256
PWMxDUTH = PWMxDUT / 256
PWMxDUTL = PWMxDUT % 256
PWMDIV和PWMDUT是两个16位的数值(0到65535)。为了将它们储存在8位寄存器里面,需要将它们分为高8位部分和低8位部分
高8位部分(高字节):这是通过除以256得到的。是由于256是2的8次方,除以256相当于向右移动8位。
低8位部分(低字节):这是通过对256取余数 (% 256
) 得到的
例如:
-
PWMxDIV = 100
:- 高字节 (
PWMxDIVH
): 100 / 256 = 0 - 低字节 (
PWMxDIVL
): 100 % 256 = 100
- 高字节 (
-
PWMxDUT = 50
:- 高字节 (
PWMxDUTH
): 50 / 256 = 0 - 低字节 (
PWMxDUTL
): 50 % 256 = 50
- 高字节 (
这样,你就可以将16位的值(100和50)分成两个8位的值,分别存储在8位的寄存器中。这个操作使得处理较大的数值在硬件资源有限的微控制器上成为可能。
(7)P07C = 0x3C,强灌电流
2、GPIO
LED1输出高电平,LED输出低电平,LED3悬浮输入,则D5亮红灯,其他灯不亮
void LED1_light()
{
P14F = 2;
P13F = 2;
P12F = ~((1<<7) | (1<<6)) | 1;
P14 = 1;
P13 = 0;
P12 = 0;
}
要让灯光按顺序亮,需要加入定时器中断和灯光扫描函数,这样能在快速不断的打开关闭IO口的时候,实现好几个灯同时点亮的效果。
void fun_led_scan()
{
static unsigned char ledIndex = 0;
ledIndex ++;
if(ledIndex >= 6)
{
ledIndex = 0;
}
switch(ledIndex)
{
case 0:
if(bLED1)
LED1_light();
break;
case 1:
if(bLED2)
LED2_light();
break;
case 2:
if(bLED3)
LED3_light();
break;
case 3:
if(bLED4)
LED4_light();
break;
case 4:
if(bLED5)
LED5_light();
break;
case 5:
if(bLED6)
LED6_light();
break;
default:
LEDall_OFF();
ledIndex = 0;
break;
}
}
unsigned char bTimeBase_Onetime;
void TIMER0_ISR (void) interrupt 1
{
bTimeBase_Onetime = 1;
TH0 = TH_VAL;
TL0 = TL_VAL;
fun_led_scan();
}
3、中断
定时器0有4种模式,用户手册里面的东西太繁琐
定时器1有4种模式,用户手册里面的东西太繁琐
直接例程里面的代码拿来用就是。1ms中断(模式0),10ms中断(模式1),100us中断(模式2)
4、adc
例程直接拿来用