51光敏电阻调光 ,xpt2016芯片,写个程序
时间: 2023-08-18 19:04:04 浏览: 94
以下是基于单片机51和xpt2046芯片的光敏电阻调光程序,其中增加了xpt2046芯片的触摸屏控制功能:
```c
#include <reg51.h>
sbit LIGHT = P1^0; // 灯光控制引脚
sbit PHOTORESISTOR = P2^0; // 光敏电阻引脚
sbit CS = P3^4; // xpt2046芯片片选引脚
sbit DIN = P3^5; // xpt2046芯片数据输入引脚
sbit DOUT = P3^6; // xpt2046芯片数据输出引脚
sbit CLK = P3^7; // xpt2046芯片时钟引脚
unsigned int touch_x = 0; // 触摸屏X坐标
unsigned int touch_y = 0; // 触摸屏Y坐标
void delay(unsigned int t) // 延时函数
{
unsigned int i, j;
for(i = 0; i < t; i++)
for(j = 0; j < 125; j++);
}
void xpt2046_init() // xpt2046芯片初始化函数
{
CS = 1; // 先将片选引脚置高
CLK = 1; // 将时钟引脚置高
DIN = 1; // 将数据输入引脚置高
delay(10); // 等待10ms
}
unsigned int xpt2046_read(unsigned char cmd) // xpt2046芯片读取函数
{
unsigned int value;
unsigned char i;
CS = 0; // 使能芯片
DIN = cmd; // 发送命令
CLK = 0; // 将时钟引脚置低
CLK = 1; // 将时钟引脚置高
DIN = 0; // 将数据输入引脚置低
for(i = 0; i < 16; i++) // 读取16位数据
{
CLK = 0; // 将时钟引脚置低
value <<= 1; // 左移一位
if(DOUT) value++; // 如果数据输出引脚为高,则将当前位置为1
CLK = 1; // 将时钟引脚置高
}
CS = 1; // 禁用芯片
return value; // 返回读取的数据
}
void xpt2046_read_touch() // xpt2046芯片读取触摸屏坐标函数
{
unsigned int x, y;
x = xpt2046_read(0xD0); // 读取X坐标
y = xpt2046_read(0x90); // 读取Y坐标
touch_x = ((x * 240) / 4096); // 转换X坐标为屏幕坐标
touch_y = ((y * 320) / 4096); // 转换Y坐标为屏幕坐标
}
void main()
{
unsigned int brightness;
xpt2046_init(); // 初始化xpt2046芯片
while(1)
{
xpt2046_read_touch(); // 读取触摸屏坐标
brightness = PHOTORESISTOR; // 读取光敏电阻电压值
brightness = 255 - brightness; // 转换为亮度值
LIGHT = 1; // 开灯
delay(brightness); // 延时
LIGHT = 0; // 关灯
delay(255 - brightness); // 延时
}
}
```
程序中,我们首先初始化了xpt2046芯片,然后在主循环中读取光敏电阻的电压值和触摸屏的坐标,并根据电压值控制灯光的亮度,同时通过触摸屏控制灯光的开关。具体来说,当光敏电阻的电压值较大时,灯光会变亮;当光敏电阻的电压值较小时,灯光会变暗。当触摸屏被触摸时,灯光会开启;当触摸屏没有被触摸时,灯光会关闭。
阅读全文