简介
分享一个使用8G1K08作为主控制作的无极调光灯环。用来做带照明的放大镜;
原理图
主控
将所有引脚引出,还可以作为其他DIY的验证开发板。

供电
使用稳压器降压后提供MCU 3.3V电源;

电池充电电路

LED驱动电路

调光电位器

程序
主程序
#include "uart.h"
#include "adc.h"
#include "pwm.h"
#include <stdio.h>
/* 串口发送字节数据函数 参数是你要发送的字节 */
void UartSend_Data(unsigned char dat)
{
SBUF = dat; // 把要发送的数据给了SBUF寄存器
while(!TI); // 等待数据发送完成
TI = 0; // 清除发送完成标志位
}
/* 主函数 */
void main()
{
unsigned int res;
Uart1_Init();
ADC_Init();
PWM_Init();
while(1)
{
DelayMs(200);
res = ADC_Read();
PWM_Duty(res);
}
}
PWM 程序
#include "pwm.h"
void PWM_Init(void)
{
P3M0 &= ~0x20;
P3M1 &= ~0x20;
P_SW1 &= ~(0X20);
P_SW1 |= (0X10); // 切换PCA0 的引脚为P35
CCON = 0X00;
CMOD = 0X0A;
CCAPM0 = 0X42;
PCA_PWM0 |= 0xc0;
CL = 0;
CH = 0;
// 下边的三个值共同绝顶初始占空比
PWM_Duty(1024/2);
CCON |= 0X40;
}
void PWM_Duty(unsigned int adc_value)
{
unsigned char temp_l,temp_h,temp;
temp_l=adc_value&0x00ff; //读pwm_0低8位赋值给temp_l
temp_h=(adc_value&0x0300)>>4; //读pwm_0高2位,移动到XCCAP0H(PCA_PWM0[5:4])位置,赋值给temp_h
temp=PCA_PWM0&0xcd; //读PCA_PWM0,XCCAP2H(PCA_PWM0[5:4])、EPC0H(PCA_PWM0[1])清零后赋值给temp
temp_h|=temp; //写其他位到temph
if(adc_value==0x03ff) //如果pwm_0最大
{
temp_h|=0x02; //设置EPC0H(PCA_PWM0[1])为1
}
PCA_PWM0=temp_h; //写PCA_PWM0(先写高2位)
CCAP0H=temp_l; //写CCAP0H(再写低8位)
}
ADC 采样
#include "adc.h"
// 使用P32作为ADC采样口
void ADC_Init(void)
{
P3M0 &= ~0x04; P3M1 |= 0x04; // 配置端口为高祖输入
P_SW2 |= 0X80; // 使能外部扩展寄存器
ADCCFG &= ~0x2f; // ADCCFG = xx0x 0000 SPEED(0)
ADCCFG |= 0x20; // ADCCFG = xx0x 0000 SPEED(0)
ADCTIM = 0x2e; // 配置ADC CSSETUP(0), CSHOLD(1), SMPDUTY(14)
ADC_CONTR = 0X8A; // 开启ADC电源,清除转换结束标志,选择通道10(P32);
}
unsigned int ADC_Read(void)
{
unsigned int res;
ADC_CONTR |= 0X40; // 启动AD转换
_nop_();
_nop_();
while(!(ADC_CONTR&0X20)); // 查询ADC完成标志
ADC_CONTR &= ~0X20; // 清除完成标志
res = (ADC_RES<<8)|ADC_RESL; //读取ADC结果
return res;
}
实物图及功能延时
实物图
灯环

主控板

功能演示