单⽚机模拟⼿机屏幕亮度调节功能
概括:
通过运⽤AD/DA转换芯⽚来输出电压控制LED灯的亮度,实现在较暗环境下LED灯亮度偏弱,在较亮环境下LED灯亮度偏强的效果。⽤到的核⼼模块为XPT2046芯⽚,通过PWM波的调控来实现上述效果。
源代码:
#include<reg52.h>
#include<intrins.h>
typedef unsigned int uint;
typedef unsigned char uchar;
#define CH0 0x94//光敏通道
#define CH1 0xd4//热敏通道
#define CH2 0xa4//电位器通道
#define CH3 0xe4//外部输⼊通道
sbit DU=P2^6;
sbit WE=P2^7;//锁存器IO⼝位定义
sfr P4=0xe8;//先将P4⼝引⼊
sbit DOUT_dat=P4^4;//DA转换后对应的输出IO⼝
sbit CS=P3^7;
sbit DCLK=P2^1;
sbit DIN=P2^0;
sbit DOUT=P2^5;//XPT2046对应SPI通讯的位定义
uchar code SMGduan[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//0-9
uchar code SMGwei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//1-8位数码管
uchar dat;//DA转换出来的量
uchar pwm_t;//模拟PWM波的变量
uint v2;//AD转换出来的量
/******SPI通讯模块******/
void SPI_Write(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
DCLK=0;
if(dat&0x80)
DIN=1;
else
DIN=0;
DCLK=1;
dat=dat<<1;
}
}
uint SPI_Read()
{
uchar i;
uint dat;
for(i=0;i<12;i++)
{
dat=dat<<1;
DCLK=1;
DCLK=0;
if(DOUT)
dat=dat|0x01;
}
return dat;
}
uint Read_AD(uchar cmd)
{
uint dat;
CS=0;
SPI_Write(cmd);
DCLK=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
dat=SPI_Read();
CS=1;
return dat;
}
/******数码管显⽰模块******/
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=114;y>0;y--);
}
void display(uint i)//显⽰AD转换出来的电压{
DU=0;
P0=SMGduan[i/1000]|0x80;
DU=1;
DU=0;
WE=0;
P0=SMGwei[0];
WE=1;
WE=0;
delay(1);
DU=0;
P0=SMGduan[i%1000/100];
DU=1;
DU=0;
WE=0;
P0=SMGwei[1];
WE=1;
WE=0;
delay(1);
DU=0;
P0=SMGduan[i%100/10];
DU=1;
DU=0;
WE=0;
P0=SMGwei[2];
WE=1;
WE=0;
delay(1);
DU=0;
P0=SMGduan[i%10];
DU=1;
DU=0;
WE=0;
P0=SMGwei[3];
WE=1;
WE=0;
delay(1);
}
}
/******定时器模块模拟PWM波******/
void Timer0Init()
{
手机mv
TMOD|=0X02;
TH0=220;
TL0=220;
TR0=1;
ET0=1;
EA=1;
}
void Timer0() interrupt 1
{
pwm_t++;
if(pwm_t<=dat)
DOUT_dat=1;
else
DOUT_dat=0;
if(pwm_t==255)
pwm_t=0;
}
void main()
{
uchar i;
uint v1,v3;
Timer0Init();
while(1)
{
if(i>=30)
{
v1=Read_AD(CH0);
v2=v1*1.2207;//12位AD转换之后,每⼀位对应1.2207mV
v3=v2/20*256/250;//转换出的数据再⽤8位DA转换出来,送给LED灯
dat=~v3;//取反达到模拟⼿机屏幕亮度变换的效果
i=0;
}
delay(1);
display(v2);
i++;
}
}
LED灯的亮度变化⾁眼可见,但是亮度变化时相邻亮度之间的亮度差⽐较⼤,对应的主函数中那⼀段对V3的算法可以改进,通过减
少“/”运算省略的余数可以提⾼精度,有兴趣的话可以⾃⼰改下。(其实调的已经看起来⽐较舒服了)对应的还可以实现温度调控,电位器调控,或者外部输⼊的电压转换后直接调控,对应的控制字节直接贴在上边了。
写在后边:
从上次写完“单⽚机模拟短信接收装置”后,由于考试和对参加学校基地的机试的准备,鸽了好长⼀段时间。好在机试顺利通过了,本⼈也顺利进⼊了基地,结果还是不错的。我写单⽚机的初衷就是兴趣和喜爱,想学会更多,认识更多对单⽚机感兴趣的朋友。嗯,就到这⾥吧。如果感觉博主写的还不错的⼩伙伴,记得点个赞哦~