#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;
}
} |