## 51单片机通过模拟PWM信号输出,利用光敏电阻控制led10
时间:2023-11-06 00:07:01
通过模拟PWM信号输出由光敏电阻控制led10
#include
#include #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;/span> } 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; }