谢谢分享。![]() |
|
我把这个程序改了移到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; } |
| 你好,就是您的那篇光控灯的代码我烧在普中开发板上没有反应,是代码哪里需要修改吗,而且仿真图里用示波器测蜂鸣器也是没有波形 |