## 51单片机通过模拟PWM信号输出,利用光敏电阻控制led10

通过模拟PWM信号输出,利用光敏电阻控制led10

#include<reg52.h>
#include<intrins.h>

#define uchar unsigned char
#define uint unsigned int
#define AIN0 0xb4;      //光敏电阻

sbit CS = P3^7;
sbit DCLK = P2^1;
sbit DIN = 	P2^0;
sbit DOUT = P2^5;
sbit DU = P2^6;//数码管段选
sbit WE = P2^7;//数码管段选
sbit DAC_DATA = P4^4;

uchar code SMGduan[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,};
uchar code SMGwei[] = {0xfe, 0xfd, 0xfb, 0xf7};
uchar pwm_t,DAC_VAL;

void timer0Init()
{
    EA = 1;
    TR0 =1;
    ET0 = 1;
    TMOD = 0X02;
    TH0 = 220;
    TL0 = 220;
}
void SPIWrite(uint DAT)		//DCLK上升沿发送数据
{
    uchar i;
    for( i = 0; i<8;i++)
    {
        DCLK = 0;
        if(DAT & 0x80)
            DIN = 1;
        else
            DIN = 0;
        DAT <<= 1;
        DCLK = 1 ;
    }
}
uint SPIRead()
{
    uchar i;
    uint DAT;
    for(i = 0; i<12;i++)
    {
        DAT <<= 1;
        DCLK = 1;
        DCLK = 0;
        if(DOUT)
        {
            DAT |= 0x01;
        }
    }
    return DAT;
}
uint ReadAD(uint cmd)
{
		uint DAT;
    CS = 0;
    SPIWrite(cmd);
		DCLK = 0;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
		DAT = SPIRead();
		CS = 1;
    return (DAT);
}
void display(uint i)
{
	uchar q, b, s, g;
	static uchar wei;
	q = i / 1000;
	b = i % 1000 / 100;
	s = i % 100 / 10;
	g = i % 10;
	P0 = 0XFF;//清除断码
	WE = 1;//打开位选锁存器
	P0 = SMGwei[wei];
	WE = 0;//锁存位选数据
	P0 = 0XFF;//清除断码
	switch(wei)
	{
		case 0: DU = 1; P0 = SMGduan[q] ;	DU = 0; break;//0x80加上小数点
		case 1: DU = 1; P0 = SMGduan[b]; 	DU = 0; break;
		case 2: DU = 1; P0 = SMGduan[s]; 	DU = 0; break;
		case 3: DU = 1; P0 = SMGduan[g]; 	DU = 0; break;
	}
	wei++;
	if(wei == 4)
		wei = 0;
}

void delayms(uchar xms)
{
    uchar i,j;
    for(i = xms;i>0; i--)
        for(j = 110;j>0;j--);
}
void main()
{
	uchar i;
	uint vol;
	timer0Init();
    while(1)
    {
			if(i >= 100)
            {
                i = 0;
               vol = ReadAD(0x94);		//传出12进制
                  
               DAC_VAL = vol / 16;
            }
        display(vol);
        i++;
    }
}
void time0() interrupt 1
{
    pwm_t++;
    if(pwm_t <= DAC_VAL)
        DAC_DATA = 1;
    else
        DAC_DATA = 0;
}
  • 9
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值