|
謝謝分享。![]() |
|
我把這個程序改了移到STC8單片機上了 //#include "reg51.h" //#include "intrins.h" //sbit smg1=P2^0;//數碼管 //sbit smg2=P2^1; //sbit led1=P1^1;//LED強 //sbit led2=P1^2;//中 //sbit led3=P1^3;//弱 //sbit lamp=P3^5;//燈 //sbit beep=P3^6;//蜂鳴器 //sbit k1=P3^0;//按鈕 //sbit CLK= P1^5;//時鐘,初始狀態為0 //sbit DIO= P1^6;//數據輸入 ////sbit DO= P1^7; // 數據輸出 //sbit CS= P1^4; #include<stc8.h> #include "intrins.h" sbit smg1=P5^4; //數碼管10位 sbit smg2=P5^5; //數碼管個位 sbit led1=P3^4; //強 sbit led2=P3^5; //中 sbit led3=P3^6; //弱 sbit lamp=P3^7; //燈 sbit CLK= P3^0;//時鐘,初始狀態為0 sbit DIO= P3^1;//數據輸入 sbit CS= P3^3; //unsigned char code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共陰0-9 unsigned char code smgduan[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共陽0-9 unsigned char light=0;//光照 unsigned char time=0,flag=0; void Delay_2us(void) { _nop_(); _nop_(); } /********************************************* 讀取ADC **********************************************/ unsigned char ADC_read_data(bit channel)//通道ch0 { unsigned char i,dat0=0,dat1=0; //-----第一次下降沿之前DI置高,啟動信號----- CS=0; //片選信號置低,啟動AD轉換芯片 CLK=0; //時鐘置低電平 DIO=1; //開始信號為高電平 Delay_2us(); CLK=1; //產生一個正脈沖,在時鐘上升沿,輸入開始信號(DI=1) Delay_2us(); CLK=0; //第1個時鐘下降沿 DIO=1; Delay_2us(); CLK=1; //第2個下降沿輸入DI=1,表示雙通道單級性輸入 Delay_2us(); //-----在第2個下降沿,模擬信號輸入模式選擇(1:單模信號,0:雙模差分信號)----- CLK=0; DIO=channel; //第3個下降沿,設置DI,選擇通道 Delay_2us(); CLK=1; Delay_2us(); //-----在第3個下降沿,模擬信號輸入通道選擇(1:通道CH1,0:通道CH0)----- CLK=0; DIO=1; //第4個下降沿之前,DI置高,準備接收數據 Delay_2us(); for(i=0;i<8;i++) //第4~11共8個下降沿讀數鋸(MSB->LSB) { CLK=1; Delay_2us(); CLK=0; Delay_2us(); dat0=dat0<<1|DIO; } for(i=0;i<8;i++) //第11~18共8個下降沿讀數據(LSB->MSB) { dat1=dat1|((unsigned char)(DIO)<<i); CLK=1; Delay_2us(); CLK=0; Delay_2us(); } CS=1; return(dat0==dat1)?dat0:0; //判斷dat0與dat1是否相等 } // unsigned char temp0,temp1,i; // CS=0; // temp0=0; // temp1=0; // _nop_(); // _nop_(); // DI=1;//開始位 // _nop_(); // _nop_(); // CLK=1; // _nop_(); // _nop_(); // CLK=0; // _nop_(); // _nop_(); // DI=0; // _nop_(); // _nop_(); ////選擇通道0 // DI=1; // _nop_(); // CLK=1;//上升沿DI=1 // _nop_(); // CLK=0;//1個下降沿DI=1 // _nop_(); // DI=0; // _nop_(); // CLK=1; // _nop_(); // CLK=0;//第3個上升沿DI=0 // _nop_(); // DI=1; ////********通道選擇結束開始讀取轉換后的二進制數**** ////下降沿讀數,一下進行判斷和處理,共8次 //for(i=0;i<8;i++) // { // temp0=temp0<<1; // CLK=1; // if(DO) // temp0++; // _nop_(); // CLK=0; // } //for(i=0;i<8;i++) // { // temp1=temp1>>1; // CLK=1; // if(DO) // temp1=temp1 +0x80; // _nop_(); // CLK=0; // } // CS=1; // return temp0; //} void delay(unsigned int i)//延時 { unsigned char j; for(j=0;j<i;j++); } void main() { P1M0=0xFF; P1M1=0x00; P3M0=0x00; P3M1=0x00; P5M0=0x10; P5M1=0x00; led1=1;led2=1;led3=1; TMOD|=0X01; TH0=0X3C; TL0=0XB0; ET0=1;//打開定時器0中斷允許 EA=1;//打開總中斷 TR0=1;//打開定時器 while(1) { //顯示 // P0=smgduan[light/10];//光照 // smg1=0; // delay(100); // smg1=1; // P0=smgduan[light%10]; // smg2=0; // delay(100); // smg2=1; P1=smgduan[light/10];//光照 smg1=0; delay(100); smg1=1; P1=smgduan[light%10]; smg2=0; delay(100); smg2=1; //停止報警 // if(!k1) // { // flag=1; // beep=1; // } } } //定時器0中斷 void Timer0() interrupt 1 { unsigned int i; if(time<10)//0.5s time++; else { time=0; i=ADC_read_data(0); light=i*60/256; //判斷 if((light>50)&&(flag==0))//強 { lamp=1; led1=0;led2=1;led3=1; } if((light<51)&&(light>20))//中 { led1=1;led2=0;led3=1; //beep=1; lamp=1; flag=0; } if(light<21)//弱 { led1=1;led2=1;led3=0; //beep=1; lamp=0; flag=0; } } TH0=0X3C; TL0=0XB0; } |
| 你好,就是您的那篇光控燈的代碼我燒在普中開發板上沒有反應,是代碼哪里需要修改嗎,而且仿真圖里用示波器測蜂鳴器也是沒有波形 |