#include<reg52.h> //調(diào)用單片機(jī)頭文件 #define ucharunsigned char //無(wú)符號(hào)字符型 宏定義 變量范圍0~255 #defineuint unsigned int //無(wú)符號(hào)整型 宏定義 變量范圍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延時(shí)函數(shù)*****************************/ void delay_1ms(uintq) { uint i,j; for(i=0;i<q;i++) for(j=0;j<120;j++); } /***********讀數(shù)模轉(zhuǎn)換數(shù)據(jù) unsigned charad0832read(bit SGL,bit ODD) { unsigned char i=0,value=0,value1=0; SCL=0; DO=1; CS=0; //開始 SCL=1; //第一個(gè)上升沿 SCL=0; DO=SGL; SCL=1; //第二個(gè)上升沿 SCL=0; DO=ODD; SCL=1; //第三個(gè)上升沿 SCL=0; //第三個(gè)下降沿 DO=1; for(i=0;i<8;i++) { SCL=1; SCL=0; //開始從第四個(gè)下降沿接收數(shù)據(jù) value>>=1; if(DO) value++; } for(i=0;i<8;i++) { //接收校驗(yàn)數(shù)據(jù) value1>>=1; if(DO) value1+=0x80; SCL=1; SCL=0; } CS=1; SCL=1; if(value==value1) //與校驗(yàn)數(shù)據(jù)比較,正確就返回?cái)?shù)據(jù),否則返回0 return value; return 0; } ucharkey_can; /********************獨(dú)立按鍵程序*****************/ 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個(gè) case 0xb0: key_can = 2; break; //左邊第2個(gè) case 0x70: key_can = 3; break; //左邊第3個(gè) } 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; } } /****************按鍵處理函數(shù)***************/ voidkey_with() { if(key_can == 1) //設(shè)置鍵 { flag_moshi = ~flag_moshi; } if(flag_moshi == 1) //手動(dòng)模式 { if(key_can == 2) //加 { dangwei ++; if(dangwei >= 7) dangwei = 7; } if(key_can == 3) //減 { if(dangwei != 0) dangwei --; } led_dangwei(dangwei) ; //檔位 } } /*************定時(shí)器0初始化程序***************/ voidtime_init() { EA =1; //開總中斷 TMOD = 0X10; //定時(shí)器1工作方式1 ET1 =1; //開定時(shí)器0中斷 TR1 =0; //允許定時(shí)器0定時(shí) } ***********************************************************************/ void Main() { time_init(); //初始化定時(shí)器 red = 0; f_pwm_l = 99; while(1) { key(); if(key_can < 10) key_with(); if(flag_moshi == 0) //自動(dòng)模式 red = 1; else red = 0; //手動(dòng)模式 if(flag_moshi == 0) //自動(dòng)模式 { if(guangxian <= 10) //開燈 { TR1 = 0; //最亮 td_led = 0; }else if(guangxian >= 90) //關(guān)燈 { TR1 = 0; //滅 td_led = 1; }else { TR1 = 1; f_pwm_l = guangxian; } } guangxian = ad0832read(1,0); //采集光線 guangxian = guangxian * 99 / 255; delay_1ms(1); } } /*******************定時(shí)器1用做單片機(jī)模擬PWM 調(diào)節(jié)***********************/ void Timer1()interrupt 3 //調(diào)用定時(shí)器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; } } }
|