#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit out=P3^7;
sbit led1=P0^0;
sbit led2=P0^1;
sbit led3=P0^2;
sbit led4=P0^3;
sbit led5=P0^4;
sbit led6=P0^5;
sbit led7=P0^6;
sbit led8=P0^7;
sbit SCL=P1^2; //SCL定義為P1口的第3位腳,連接ADC0832SCL腳
sbit DO=P1^3; //DO定義為P1口的第4位腳,連接ADC0832DO腳
sbit CS=P1^0; //CS定義為P1口的第4位腳,連接ADC0832CS腳
uchar scale;
uchar m;
uchar h1,date;
unsigned char adval;
void delay(uint z)
{
uint y;
for(;z>0;z--)
for(y=5;y>0;y--);
}
/***********讀數模轉換數據********************************************************/
//請先了解ADC0832模數轉換的串行協議,再來讀本函數,主要是對應時序圖來理解,本函數是模擬0832的串行協議進行的
// 1 1 0 通道
// 1 1 1 通道
unsigned char ad0832read(bit SGL,bit ODD)
{
unsigned char i=0,value=0,value1=0;
SCL=0;
DO=1;
CS=0; //開始
SCL=1; //第一個上升沿
SCL=0;
DO=SGL;
SCL=1; //第二個上升沿
SCL=0;
DO=ODD;
SCL=1; //第三個上升沿
SCL=0; //第三個下降沿
DO=1;
for(i=0;i<8;i++)
{
SCL=1;
SCL=0; //開始從第四個下降沿接收數據
value<<=1;
if(DO)
value=value|0x01;
}
for(i=0;i<8;i++)
{ //接收校驗數據
value1=value1>>1;
if(DO)
value1=value1|0x80;
SCL=1;
SCL=0;
}
CS=1;
SCL=1;
DO=1;
if(value==value1) //與校驗數據比較,正確就返回數據,否則返回0
return value;
return 0;
}
void penquan() //PWM調壓
{
date=ad0832read(1,0);
if(date>130&&date<=200)
{
scale=(date-100)/10+2;
if(scale>10)
scale=10;
}
else if(date>200)
scale=10;
else if(date<=130)
scale=0;
if(date>=0&&date<130) P0=0xfe;
else if(date>=130&&date<140) P0=0xfc;
else if(date>=140&&date<150) P0=0xf8;
else if(date>=150&&date<160) P0=0xe0;
else if(date>=160&&date<170) P0=0xe0;
else if(date>=170&&date<180) P0=0xc0;
else if(date>=180&&date<200) P0=0x80;
else if(date>=200) P0=0x00;
// if(date>120) led1=0; else led1=1;
// if(date>130) led2=0; else led2=1;
// if(date>140) led3=0; else led3=1;
// if(date>150) led4=0; else led4=1;
// if(date>160) led5=0; else led5=1;
// if(date>170) led6=0; else led6=1;
// if(date>180) led7=0; else led7=1;
// if(date>200) led8=0; else led8=1;
delay(300);
}
void init()
{
TMOD=0x01;
TH0=0xfc;
TL0=0x18;
ET0=1;
TR0=1;
EA=1;
}
void main()
{
init();
while(1)
{
penquan(); //給定個延時次數
}
}
void T0_time() interrupt 1
{
TH0=0xfc;
TL0=0x18;
m++;
if(m<scale)
{
out=0;
}
else
{
out=1;
}
if(m>10)
{
m=0;
}
} |