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