单片机小白一个...程序不知道该怎么写了.......跪求大佬指错!求指导主函数该怎么写!!
ADC0832对负载状态进行监视转换,负载正常运行CH0处电压为3V左右,故障设定为断路,此时CH0处电压为0V;
电路图如下:
程序如下:求大佬指出修改!
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit Lamp = P1^0;
sbit CHE = P3^3;
sbit ADC_CS = P0^1; // ADC0832的CS引脚
sbit ADC_CLK = P0^2; // ADC0832的CLK引脚
sbit ADC_DAT = P0^3; // ADC0832的DI/DO引脚
sbit LED = P1^0;
uchar gCount=0; // 全局计数变量
uchar gIndex; // 亮度变量,0是最暗,9是最亮
uchar flag=0; // 时间计数变量
uchar num;
void DelayMs(uint time)
{
uint i,j;
for(i=0;i<time;i++)
for(j=0;j<112;j++);
}
/*********************************************************/
// 外部中断1初始化
/*********************************************************/
void Int1Init()
{
IT1=1;
EX1=1;
EA=1;
}
/*********************************************************/
// 定时器1初始化
/*********************************************************/
void Init_Timer1(void)
{
TMOD=0x01;
TH1=(65535-30000)/256;
TL1=(65535-30000)%256;
EA=1;
ET1=1;
TR1=1;
}
/*********************************************************/
// 定时器0初始化
/*********************************************************/
void TimerInit()
{
TMOD = 0x01; // 使用定时器0,工作方式1
TH0 = 252; // 给定时器0的TH0装初值
TL0 = 24; // 给定时器0的TL0装初值
ET0 = 1; // 定时器0中断使能
EA = 1; // 打开总中断
TR0 = 1; // 启动定时器0
}
/*********************************************************/
// 外部中断1计数
/*********************************************************/
void Int1() interrupt 2
{
uchar num;
if (CHE == 0)
{
num++;
}
}
/*********************************************************/
// 定时器1服务程序,5s内外部中断计数
/*********************************************************/
void Timer1_isr(void) interrupt 3
{
TH1=(65535-30000)/256;
TL1=(65535-30000)%256;
flag++;
if(flag==100)
{
flag=0;
return num;
num = 0;
}
}
/*********************************************************/
// 定时器0服务程序
/*********************************************************/
void Timer0(void) interrupt 1
{
TH0 = 252; // 给定时器0的TH0装初值
TL0 = 24; // 给定时器0的TL0装初值
gCount++; //1ms
if(gCount==10)
{
gCount=0; // 则将gCount清零,进入新一轮的计数
Lamp=0; // 则把灯点亮
}
if(gCount==gIndex)
{
Lamp=1; // 则把灯熄灭
}
}
/*********************************************************/
// 按数量区间进行调光
/*********************************************************/
void AutoControl()
{
if(num<6)
{
gIndex=8;
}
else if((num>7)&&(num<10))
{
gIndex=5;
}
else if(num>11)
{
gIndex=3;
}
}
/*********************************************************/
// ADC0832的时钟脉冲
/*********************************************************/
void WavePlus()
{
_nop_();
ADC_CLK = 1;
_nop_();
ADC_CLK = 0;
}
/*********************************************************/
// 获取负载故障检测通道的A/D转换结果
/*********************************************************/
uchar Get_ADC0832()
{
uchar i;
uchar dat1=0;
uchar dat2=0;
ADC_CLK = 0; // 电平初始化
ADC_DAT = 1;
_nop_();
ADC_CS = 0;
WavePlus(); // 起始信号
ADC_DAT = 1;
WavePlus(); // 通道选择的第一位
ADC_DAT = 0;
WavePlus(); // 通道选择的第二位
ADC_DAT = 1;
for(i=0;i<8;i++) // 需要两次采集,第一次读取
{
dat1<<=1;
WavePlus();
if(ADC_DAT)
dat1=dat1|0x01;
else
dat1=dat1|0x00;
}
for(i=0;i<8;i++) // 第二次读取
{
dat2>>= 1;
if(ADC_DAT)
dat2=dat2|0x80;
else
dat2=dat2|0x00;
WavePlus();
}
_nop_(); // 结束此次传输
ADC_DAT = 1;
ADC_CLK = 1;
ADC_CS = 1;
if(dat1==dat2) // 返回采集结果
return dat1;
else
return 0;
}
/*********************************************************/
// 检测故障结果做出指示
/*********************************************************/
void Control(uchar gu)
{
if(gu==0)
{
LED=0;
}
else
{
LED=1;
}
}
void main()
{
uchar ret;
Init_Timer1();
Int1Init();
TimerInit();
ret=Get_ADC0832();
AutoControl(ret); // 上电先进行一次自动亮度控制
AutoControl(ret+7);
while(1)
{
ret=Get_ADC0832(); // 获取AD采集结果
AutoControl(ret); // 进行自动控制
}
|