51光敏电阻,根据光强不同控制不同小灯的亮与不亮 ,xpt2046芯片,写个程序
时间: 2024-02-28 21:56:48 浏览: 32
好的,以下是一个简单的程序,使用51单片机控制两个LED灯的亮与不亮,根据光强来判断。
```c
#include <reg51.h>
sbit LED1 = P1^0; // 定义LED1
sbit LED2 = P1^1; // 定义LED2
sbit SDA = P1^5; // 定义XPT2046的数据线
sbit SCL = P1^6; // 定义XPT2046的时钟线
void delay_us(unsigned int us) // 微秒级延时函数
{
while(us--);
}
unsigned char xpt2046_read_byte() // 读取一个字节的数据
{
unsigned char i, dat = 0;
for(i=0; i<8; i++) // 读取8位数据
{
SCL = 0; // 拉低时钟线
delay_us(1);
SCL = 1; // 拉高时钟线
delay_us(1);
dat <<= 1; // 左移一位
if(SDA) dat |= 0x01; // 如果数据线为高电平,则将dat的最低位设置为1
}
return dat;
}
unsigned int xpt2046_read_data(unsigned char cmd) // 读取XPT2046芯片的数据
{
unsigned int data;
SDA = 1; // 先将数据线设置为高电平
SCL = 1; // 拉高时钟线
SDA = 0; // 拉低数据线
delay_us(1);
SCL = 0; // 拉低时钟线
SDA = 1; // 拉高数据线
delay_us(1);
SCL = 1; // 拉高时钟线
delay_us(1);
SDA = 0; // 拉低数据线
delay_us(1);
xpt2046_read_byte(); // 读取一个字节的数据,但是不需要使用
data = xpt2046_read_byte(); // 读取第一个字节的数据
data <<= 8; // 左移8位
data |= xpt2046_read_byte(); // 读取第二个字节的数据,并与第一个字节的数据组合成一个16位的数据
data >>= 3; // 右移3位,因为XPT2046的数据格式是3位控制位,12位数据位,1位标志位
return data;
}
void main()
{
unsigned int light; // 光强
LED1 = 0; // 灯1初始状态关闭
LED2 = 0; // 灯2初始状态关闭
while(1)
{
light = xpt2046_read_data(0x81); // 读取光强数据
if(light > 500) // 光强大于500,打开灯1,关闭灯2
{
LED1 = 1;
LED2 = 0;
}
else // 光强小于等于500,关闭灯1,打开灯2
{
LED1 = 0;
LED2 = 1;
}
}
}
```
注:此程序仅供参考,具体实现过程可能需要根据硬件和软件环境进行调整。
阅读全文