写一个51单片机通过按键控制LED亮度,并且保存当前亮度的程序
时间: 2023-05-31 19:03:46 浏览: 225
以下是一个简单的实现,使用PWM控制LED亮度,使用EEPROM保存当前亮度值:
```
#include <reg51.h>
#define FREQ 11059200L // 单片机工作频率
#define PWM_FREQ 1000 // PWM信号频率
#define PWM_PERIOD (FREQ / 12 / PWM_FREQ) // PWM周期
sbit BTN = P1^0; // 按键连接P1.0
sbit LED = P2^0; // LED连接P2.0
unsigned char pwm_duty = 128; // 初始占空比为50%
unsigned char pwm_count = 0; // PWM计数器
unsigned char pwm_max = 255; // PWM最大值,即占空比100%
void delay_ms(unsigned int ms) // 延时函数
{
unsigned int i, j;
for (i = 0; i < ms; i++)
for (j = 0; j < 1000; j++);
}
void pwm_isr() interrupt 1 // PWM中断服务函数
{
pwm_count++;
if (pwm_count <= pwm_duty)
LED = 1;
else
LED = 0;
if (pwm_count >= pwm_max)
pwm_count = 0;
}
void main()
{
unsigned char eeprom_value;
TMOD = 0x01; // 定时器0为模式1
TH0 = 0xFF; // 定时器0初值设为0xFFFF
TL0 = 0xFF;
TR0 = 1; // 启动定时器0
ET0 = 1; // 允许定时器0中断
EA = 1; // 允许中断总开关
while (1)
{
if (BTN == 0) // 按键按下
{
delay_ms(20); // 延时去抖
if (BTN == 0) // 再次检测按键状态
{
pwm_duty += 32; // 增加占空比
if (pwm_duty > pwm_max)
pwm_duty = 0; // 占空比超过最大值时归零
eeprom_value = pwm_duty; // 保存当前亮度值到EEPROM
EA = 0; // 关中断
IAP_CONTR = 0x81; // 启动EEPROM写操作
IAP_ADDRH = 0x00; // 写入地址为0x00
IAP_ADDRL = 0x00;
IAP_DATA = eeprom_value; // 写入数据
IAP_TRIG = 0x5A; // 启动写操作
IAP_TRIG = 0xA5;
EA = 1; // 开中断
}
}
}
}
```
阅读全文