51光敏电阻,根据光强不同控制不同小灯的亮与不亮 ,xpt2016芯片,写个程序
时间: 2024-02-28 22:56:42 浏览: 79
好的,以下是一个简单的51单片机程序,使用光敏电阻控制不同小灯的亮与不亮,同时控制XPT2016芯片的PWM输出:
```
#include <reg52.h>
sbit LDR = P1^0; //光敏电阻引脚
sbit LED1 = P2^0; //小灯1引脚
sbit LED2 = P2^1; //小灯2引脚
sbit PWM = P2^2; //XPT2016芯片PWM引脚
void main()
{
TMOD = 0x01; //设置定时器0为模式1
TH0 = 0xFC; //设置定时器0计数初值
TL0 = 0x66;
ET0 = 1; //开启定时器0中断
EA = 1; //开启总中断
TR0 = 1; //启动定时器0
while(1)
{
//采集光敏电阻数据
unsigned char adc_value = 0;
ADC_CONTR = 0x81; //开启ADC转换,使用P1.0通道
while(ADC_CONTR & 0x80); //等待ADC转换完成
adc_value = ADC_RES; //获取ADC转换结果
//根据光敏电阻数据控制小灯亮与不亮
if(adc_value < 64) //光线很弱
{
LED1 = 1; //小灯1亮
LED2 = 1; //小灯2亮
}
else if(adc_value < 128) //光线较弱
{
LED1 = 1; //小灯1亮
LED2 = 0; //小灯2不亮
}
else if(adc_value < 192) //光线较强
{
LED1 = 0; //小灯1不亮
LED2 = 1; //小灯2亮
}
else //光线很强
{
LED1 = 0; //小灯1不亮
LED2 = 0; //小灯2不亮
}
//根据光敏电阻数据计算PWM占空比
unsigned char duty_cycle = 0;
if(adc_value < 128) //光线较弱
duty_cycle = 128 - adc_value; //PWM占空比逐渐增大
else //光线较强
duty_cycle = 0; //PWM占空比为0
//设置PWM占空比
TH1 = 0xFF; //设置定时器1计数初值
TL1 = duty_cycle; //设置定时器1计数初值
}
}
//定时器0中断服务函数,用于定时启动定时器1计数
void timer0_isr() interrupt 1
{
TR1 = 1; //启动定时器1计数
}
```
这个程序采集光敏电阻数据,根据光强的不同控制不同小灯的亮与不亮,并且根据光敏电阻数据计算PWM占空比,控制XPT2016芯片的PWM输出。具体的程序细节请参考注释。
阅读全文