#include<reg52.h> //调用单片机头文件 #define ucharunsigned char //无符号字符型 宏定义 变量范围0~255 #defineuint unsigned int //无符号整型 宏定义 变量范围0~65535 sbitSCL=P2^2; //SCL定义为P1口的第3位脚,连接ADC0832SCL脚 sbit DO=P2^3; //DO定义为P1口的第4位脚,连接ADC0832DO脚 sbit CS=P2^0; //CS定义为P1口的第4位脚,连接ADC0832CS脚 sbit red =P1^4; //红色指示灯 sbit td_led =P3^5; uchar f_pwm_l; //越小越亮 bitflag_moshi; uchardangwei; //档位 ucharguangxian; //光线的显示变量 /***********************120ms延时函数*****************************/ void delay_1ms(uintq) { uint i,j; for(i=0;i<q;i++) for(j=0;j<120;j++); } /***********读数模转换数据 unsigned charad0832read(bit SGL,bit ODD) { unsigned char i=0,value=0,value1=0; SCL=0; DO=1; CS=0; //开始 SCL=1; //第一个上升沿 SCL=0; DO=SGL; SCL=1; //第二个上升沿 SCL=0; DO=ODD; SCL=1; //第三个上升沿 SCL=0; //第三个下降沿 DO=1; for(i=0;i<8;i++) { SCL=1; SCL=0; //开始从第四个下降沿接收数据 value>>=1; if(DO) value++; } for(i=0;i<8;i++) { //接收校验数据 value1>>=1; if(DO) value1+=0x80; SCL=1; SCL=0; } CS=1; SCL=1; if(value==value1) //与校验数据比较,正确就返回数据,否则返回0 return value; return 0; } ucharkey_can; /********************独立按键程序*****************/ void key() { static uchar key_new; key_can = 20; if((P2 & 0xf0) != 0xf0) { delay_1ms(1); if(((P2 & 0xf0) != 0xf0) &&(key_new == 1)) { key_new = 0; switch(P2 & 0xf0) { case 0xd0: key_can = 1; break; //左边第1个 case 0xb0: key_can = 2; break; //左边第2个 case 0x70: key_can = 3; break; //左边第3个 } red = 0; delay_1ms(80); red = 1; } } else key_new = 1; } /***************档位***************/ voidled_dangwei(uchar dat) { switch(dat) { case 7: TR1 = 0; //最亮 td_led = 0; break; case 6: TR1 = 1; //亮 f_pwm_l = 20; break; case 5: TR1 = 1; //亮 f_pwm_l = 40; break; case 4: TR1 = 1; //亮 f_pwm_l = 60; break; case 3: TR1 = 1; //亮 f_pwm_l = 80; break; case 2: TR1 = 1; //亮 f_pwm_l = 90; break; case 1: TR1 = 1; //亮 f_pwm_l= 95; break; case 0: TR1 = 0; //灭 td_led = 1; break; } } /****************按键处理函数***************/ voidkey_with() { if(key_can == 1) //设置键 { flag_moshi = ~flag_moshi; } if(flag_moshi == 1) //手动模式 { if(key_can == 2) //加 { dangwei ++; if(dangwei >= 7) dangwei = 7; } if(key_can == 3) //减 { if(dangwei != 0) dangwei --; } led_dangwei(dangwei) ; //档位 } } /*************定时器0初始化程序***************/ voidtime_init() { EA =1; //开总中断 TMOD = 0X10; //定时器1工作方式1 ET1 =1; //开定时器0中断 TR1 =0; //允许定时器0定时 } ***********************************************************************/ void Main() { time_init(); //初始化定时器 red = 0; f_pwm_l = 99; while(1) { key(); if(key_can < 10) key_with(); if(flag_moshi == 0) //自动模式 red = 1; else red = 0; //手动模式 if(flag_moshi == 0) //自动模式 { if(guangxian <= 10) //开灯 { TR1 = 0; //最亮 td_led = 0; }else if(guangxian >= 90) //关灯 { TR1 = 0; //灭 td_led = 1; }else { TR1 = 1; f_pwm_l = guangxian; } } guangxian = ad0832read(1,0); //采集光线 guangxian = guangxian * 99 / 255; delay_1ms(1); } } /*******************定时器1用做单片机模拟PWM 调节***********************/ void Timer1()interrupt 3 //调用定时器1 { static uchar value_l; TH1=0xfe; // TL1=0x0c; // if(td_led==1) { value_l+=1; if(value_l > f_pwm_l) //高电平 { td_led=0; } } else { value_l+=1; if(value_l > 100 - f_pwm_l) //低电平 { td_led=1; } } }
|