|
單片機小白一個...程序不知道該怎么寫了.......跪求大佬指錯!求指導(dǎo)主函數(shù)該怎么寫!!
ADC0832對負載狀態(tài)進行監(jiān)視轉(zhuǎn)換,負載正常運行CH0處電壓為3V左右,故障設(shè)定為斷路,此時CH0處電壓為0V;
電路圖如下:
51hei圖片20200518155403.png (51.47 KB, 下載次數(shù): 28)
下載附件
2020-5-18 15:55 上傳
程序如下:求大佬指出修改!
#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; // 全局計數(shù)變量
uchar gIndex; // 亮度變量,0是最暗,9是最亮
uchar flag=0; // 時間計數(shù)變量
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計數(shù)
/*********************************************************/
void Int1() interrupt 2
{
uchar num;
if (CHE == 0)
{
num++;
}
}
/*********************************************************/
// 定時器1服務(wù)程序,5s內(nèi)外部中斷計數(shù)
/*********************************************************/
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服務(wù)程序
/*********************************************************/
void Timer0(void) interrupt 1
{
TH0 = 252; // 給定時器0的TH0裝初值
TL0 = 24; // 給定時器0的TL0裝初值
gCount++; //1ms
if(gCount==10)
{
gCount=0; // 則將gCount清零,進入新一輪的計數(shù)
Lamp=0; // 則把燈點亮
}
if(gCount==gIndex)
{
Lamp=1; // 則把燈熄滅
}
}
/*********************************************************/
// 按數(shù)量區(qū)間進行調(diào)光
/*********************************************************/
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轉(zhuǎn)換結(jié)果
/*********************************************************/
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_(); // 結(jié)束此次傳輸
ADC_DAT = 1;
ADC_CLK = 1;
ADC_CS = 1;
if(dat1==dat2) // 返回采集結(jié)果
return dat1;
else
return 0;
}
/*********************************************************/
// 檢測故障結(jié)果做出指示
/*********************************************************/
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采集結(jié)果
AutoControl(ret); // 進行自動控制
}
|
|