|
#include<reg52.h>
#define ucharunsigned char
#define uintunsigned int
int LCD_init(); //聲明初始化函數(shù)
int write_com(unsignedchar);//聲明寫(xiě)命令函數(shù)
intwrite_date(unsigned char);//聲明寫(xiě)數(shù)據(jù)函數(shù)
intdelay(unsigned char);//聲明延遲函數(shù)
voidtlc5615(unsigned int dat);// TLC5615轉(zhuǎn)換函數(shù)
voidLCD_send(unsigned char,unsigned char,unsigned char[],unsigned char);//聲明LCD函數(shù)
sbit addKey =P1^0;//用于增加目標(biāo)電壓按鍵
sbit subKey =P1^1;//用于減小目標(biāo)電壓按鍵
sbit CS=P3^5;//定義ADC0832腳位
sbit CLK=P3^7;//定義ADC0832腳位
sbit DO= P3^6;//定義ADC0832腳位
sbit DI=P3^4;//定義ADC0832腳位
sbit LED=P1^2;//定義LED燈腳位
sbit RS =P2^2;//定義LCD腳位
sbit RW =P2^1;//定義LCD腳位
sbit EN =P2^0;//定義LCD腳位
sbit CS5615=P1^6;//定義DAC5615腳位
sbitSCLK5615=P1^5;//定義DAC5615腳位
sbitDATA5615=P1^7;//定義DAC5615腳位
ucharvoltage[6]="0.00 V";//lcd顯示負(fù)載電壓
uchar end[6]="4.30V";//lcd顯示目標(biāo)電壓
unsigned longint val;//(負(fù)載電壓)用于單片機(jī)電壓比較
unsigned longint endVal=430;//(目標(biāo)電壓)用于單片機(jī)電壓比較
voiddelay2ms(void) //晶振12M,誤差 0us,含調(diào)用
{
unsigned char a,b;
for(b=133;b>0;b--)
for(a=6;a>0;a--);
}
uchar AD0832()
{
uchar V =0,i = 0;
CS=0; //片選信號(hào),低電平有效
DO=0; //DO為高阻態(tài),這里置低為后續(xù)讀取做準(zhǔn)備
delay2ms();
//前三個(gè)脈沖為配置設(shè)置
CLK=0;
delay2ms();
DI=1;
CLK=1;//第一個(gè)脈沖,起始位
delay2ms();
CLK=0;
delay2ms();
DI=1;
CLK=1;//第二個(gè)脈沖,該位為“1”時(shí)是單端輸入模式,為“0”時(shí)是差分輸入模式
delay2ms();
CLK=0;
delay2ms();
DI=0; //第三個(gè)脈沖,DI=1表示選擇通道1(CH2),DI=0表示選擇通道0(CH1)
CLK=1;
delay2ms();
DI=0; //DI轉(zhuǎn)為高阻態(tài),狀態(tài)無(wú)關(guān)緊要,這里給低方便下一輪讀取
DO=1; //DO口恢復(fù)默認(rèn)上拉,準(zhǔn)備接收信號(hào)
CLK=1;
delay2ms();
CLK=0; //第一個(gè)下降沿,為去數(shù)做準(zhǔn)備
delay2ms();//等待芯片接收下降沿并切換輸出模式
//接收8位信號(hào)并轉(zhuǎn)換
for(i=0;i<8;i++)
{
CLK = 1;
delay2ms();
CLK = 0;
if(DO)//如果DO為高電平,相應(yīng)的位數(shù)是1
V= V | 1<<(7-i);
}
CS = 1;//關(guān)閉片選,結(jié)束一個(gè)轉(zhuǎn)換周期
return V;
}
void Tran(uchardigit)//用于顯示lcd顯示負(fù)載電壓
{
val = (unsigned longint)5*100*digit/256;
voltage[0] ='0'+ val/100;//百位
voltage[2] ='0'+ val/10%10;//十位
voltage[3] ='0'+ val%10;//個(gè)位
}
void key()//識(shí)別按鍵
{
if(addKey==0);//按鍵按下
{
delay(5);//延時(shí)
if(addKey==0)//按鍵按下
{
endVal=endVal+10;//增加目標(biāo)電壓
}
}
if(subKey==0)//按鍵按下
{
delay(5);//延時(shí)
if(subKey==0)//按鍵按下
{
endVal=endVal-10;//減少目標(biāo)電壓
}
}
if(endVal>480)//電壓值不大于4.80V
{
endVal=480;//電壓值不大于4.80V
}
end[0] ='0'+endVal/100;//百位
end[2]='0'+ endVal/10%10;//十位
end[3]='0'+ endVal%10;//個(gè)位
}
void nowEnd()//負(fù)載電壓與目標(biāo)電壓比較
{
if(val>=endVal)//val為負(fù)載電壓,endVal為目標(biāo)電壓
{
tlc5615(0);//5615電壓輸出為0
LED=0;//關(guān)閉LED燈
}
}
voidLCD_send(unsigned char i,unsigned char j,unsigned char str[],unsigned char n)
{
//輸入:顯示行數(shù)i,列數(shù)j,輸出字符,輸出字符長(zhǎng)度n
unsigned char x=0;
if(i==1)
{write_com(0x80+j);}
else
{write_com(0x80+0x40+j);}
for(x=0;x<n;x++)
{
write_date(str[x]);
}
}
int LCD_init()//初始化函數(shù)體
{
EN = 0;
write_com(0X38);//設(shè)置16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)接口
write_com(0X0C);//設(shè)置開(kāi)顯示,不顯示光標(biāo)
write_com(0X06);//寫(xiě)一個(gè)字符時(shí),整屏右移
write_com(0X01);//顯示清零
return 0;
}
intwrite_com(unsigned char com)//寫(xiě)命令的函數(shù)體
{
RS = 0;
RW = 0;
P0 = com;
delay(5);
EN = 1;
delay(5);
EN = 0;
return 0;
}
intwrite_date(unsigned char data1)//寫(xiě)數(shù)據(jù)的函數(shù)體
{
RS = 1;
RW = 0;
P0 = data1;
delay(5);
EN = 1;
delay(5);
EN = 0;
return 0;
}
intdelay(unsigned char xms)//延遲函數(shù)
{
unsigned char x,y;
for(x=xms;x>0;x--)
for(y=110;y>0;y--);
return 0;
}
voidtlc5615(unsigned int dat)//控制5615電壓輸出
{
unsigned char i;
CS5615=1;
DATA5615=0;
SCLK5615=0; //CS高電平期間,SCLK為低電平
dat<<=6;// 數(shù)字量dat左移6位,保留原dat低10位。新dat的高10位有效,低6位全0。
CS5615=0; // CS片選有效,開(kāi)始接收數(shù)據(jù)
SCLK5615=0;
for(i=0;i<12;i++)// 發(fā)送10位數(shù)據(jù)和2位0,從最高位開(kāi)始發(fā)送。
{ // 非級(jí)聯(lián)方式,只需要輸入12位數(shù)據(jù)。
if((dat&0x8000)==0x8000)
DATA5615=1;
else
DATA5615=0;
SCLK5615=1; //SCLK上升沿,數(shù)據(jù)輸入
dat<<=1;
SCLK5615=0; //SCLK恢復(fù)低電平
}
CS5615=1; // CS上升沿,數(shù)據(jù)送到DAC寄存器
// CS的上升沿和下降沿只有在SCLK為低的時(shí)候有效
SCLK5615=0;
DATA5615=0;// 拉高片選端,拉低時(shí)鐘端與數(shù)據(jù)端,回到初始狀態(tài)
}
void main()//主函數(shù)
{
tlc5615(430);
LCD_init();
LCD_send(1,0,"Now:",4);
LCD_send(2,0,"End:",4);
while(1)
{
Tran(AD083());
LCD_send(1,6,voltage,6);
LCD_send(2,6,end,6);
key();
nowEnd();
}
}
|
|