用52单片机,光敏电阻,根据光强不同控制不同小灯的亮与不亮 ,xpt2046芯片,写个程序
时间: 2024-02-28 09:57:20 浏览: 183
基于光敏电阻的路灯控制电路proteus仿真图及软件程序源码.zip
5星 · 资源好评率100%
好的,以下是用52单片机、光敏电阻和xpt2046芯片,根据光强控制不同小灯亮度的程序:
```
#include <reg52.h>
#include <intrins.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
sbit CS=P2^7;//xpt2046片选信号
sbit RS=P2^6;//xpt2046数据/命令选择信号
sbit light1=P1^0;//小灯1
sbit light2=P1^1;//小灯2
sbit light3=P1^2;//小灯3
uchar ADData;
uint temp;
//延时函数
void delay_ms(uint ms){
uint i,j;
for(i=0;i<ms;i++)
for(j=0;j<125;j++);
}
//xpt2046写入命令
void LCD_Write_Cmd(uchar cmd){
RS = 0;//写入命令
CS = 0;//片选选中xpt2046
SPI_Write(cmd);//通过SPI总线写入数据
CS = 1;//片选取消
}
//xpt2046写入数据
void LCD_Write_Data(uchar data){
RS = 1;//写入数据
CS = 0;//片选选中xpt2046
SPI_Write(data);//通过SPI总线写入数据
CS = 1;//片选取消
}
//SPI总线读写数据
uchar SPI_Write(uchar dat){
uchar i;
for(i=0;i<8;i++){
SCLK=0;//SCLK置低
if(dat&0x80)SDIN=1;//写入最高位数据
else SDIN=0;
dat <<= 1;//数据左移一位
SCLK=1;//SCLK置高
_nop_();//空操作
}
return dat;
}
//光敏电阻读取
uchar ADC_Read(){
ADC_CONTR=0x80|0x00|0x00;//开始转换
while(!ADC_FLAG);//等待转换结束
ADC_FLAG=0;//标志位清零
return ADC_RES;//返回结果
}
//亮度控制函数
void Light_Control(){
if(ADData<50){//光强较弱
light1=1;//小灯1亮
light2=0;//小灯2灭
light3=0;//小灯3灭
}else if(ADData>=50&&ADData<150){//光强适中
light1=0;//小灯1灭
light2=1;//小灯2亮
light3=0;//小灯3灭
}else{//光强较强
light1=0;//小灯1灭
light2=0;//小灯2灭
light3=1;//小灯3亮
}
}
void main(){
//初始化串口
TMOD=0x20;
TH1=0xFD;
TL1=0xFD;
SCON=0x50;
PCON=0x00;
TR1=1;
//初始化ADC模块
ADC_RES=0;
ADC_CONTR=0x80|0x00|0x00;//转换结果右对齐,ADC通道0,ADC模块开启
delay_ms(1);
//初始化SPI总线
CS=1;//片选取消
SCLK=1;//SCLK置高
SDIN=1;//SDIN置高
while(1){
ADData=ADC_Read();//读取光敏电阻值
Light_Control();//根据光敏电阻值控制小灯亮度
}
}
```
注意:这段代码仅供参考,具体实现需要根据硬件电路和相关模块的数据手册进行调试和修改。
阅读全文