我把这个程序改了移到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;
} |