|
1.可控電源設(shè)計(jì)液晶屏能正常顯示功能實(shí)現(xiàn)
2.正確顯示電壓值、 DA能準(zhǔn)確輸出對(duì)應(yīng)電壓
3.能連續(xù)可調(diào)節(jié)0-12V的電壓并正常顯示
#include"reg52.h" //包含頭文件
//宏定義
#define uchar unsigned char
#define uint unsigned int
//按鍵定義
sbit KEY1=P2^0;
sbit KEY2=P2^1;
sbit KEY3=P2^2;
sbit KEY4=P2^3;
//液晶控制引腳定義
sbit RS=P2^5;
sbit RW=P2^6;
sbit EN=P2^7;
//DAC定義
sbit CS_5615=P1^5; //定義選片信號(hào)IO口
sbit CLK_5615=P1^6; //定義時(shí)鐘信號(hào)IO口
sbit DAT_5615=P1^7; //定義數(shù)據(jù)輸入IO口
//ADC定義
sbit CS=P3^5; //定義選片信號(hào)IO口
sbit CLK=P3^3; //定義時(shí)鐘信號(hào)IO口
sbit DIO=P3^4; //定義數(shù)據(jù)輸入IO口
//報(bào)警指示燈定義
sbit led=P3^1;
uint U;
uchar GETU=0;
bit flag=0;
uint a=0;
unsigned char Int,Dec; //分別儲(chǔ)存轉(zhuǎn)換后的整數(shù)部分與小數(shù)部分
uchar code tab1[]={"Welcome to use "}; //固定字符
uchar code tab2[]={"adj power supply"}; //固定字符
uchar code tab3[]={"Voltage: . v"}; //固定字符
uchar code tab4[]={" "}; //固定字符
uchar code tab5[]={"Short circuit!!!"}; //固定字符
uchar code tab6[]={"Please restart!!"}; //固定字符
//延時(shí)函數(shù)
void delay(uint xms) //延時(shí)函數(shù),有參函數(shù)
{
uint x,y;
for(x=xms;x>0;x--)
for(y=121;y>0;y--);
}
//液晶寫入指令函數(shù)
void write_1602com(uchar com)
{
RS=0; //數(shù)據(jù)/指令選擇置為指令
RW=0; //讀寫選擇置為寫
P0=com; //送入數(shù)據(jù)
delay(1);
EN=1; //拉高使能端,為制造有效的下降沿做準(zhǔn)備
delay(1);
EN=0; //en由高變低,產(chǎn)生下降沿,液品執(zhí)行命令
}
//液晶寫入數(shù)據(jù)函數(shù)
void write_1602dat(uchar dat)
{
RS=1; //數(shù)據(jù)/指令選擇置為數(shù)據(jù)
RW=0; //讀寫選擇置為寫
P0=dat; //送入數(shù)據(jù)
delay(1);
EN=1; //en置高電平,為制造下降沿做準(zhǔn)備
delay(1);
EN=0; //en由高變低,產(chǎn)生下降沿,液晶執(zhí)行命令
}
//液晶初始化函數(shù)
void lcd_init()
{
uchar p;
write_1602com(0x38); //設(shè)置液晶工作模式,意思: 16*2行顯示,5*7點(diǎn)陣,8位數(shù)據(jù)
write_1602com(0x0c); //開(kāi)顯示不顯示光標(biāo)
write_1602com(0x06); //整屏不移動(dòng),光標(biāo)自動(dòng)右移
write_1602com(0x01); //清顯示
write_1602com(0x80); //日歷顯示固定符號(hào)從第一行第1個(gè)位置之后開(kāi)始顯示
for(p=0;p<16;p++)
{
write_1602dat(tab1[p]); //向液晶屏寫日歷顯示的固定符號(hào)部分
}
write_1602com(0xc0); //時(shí)間顯示固定符號(hào)寫入位置,從第2個(gè)位置后開(kāi)始顯示
for(p=0;p<16;p++)
{
write_1602dat(tab2[p]); //寫顯示時(shí)間固定符號(hào),兩個(gè)冒號(hào)
}
delay(1000);
write_1602com(0x80); //日歷顯示固定符號(hào)從第一行第1個(gè)位置之后開(kāi)始顯示
for(p=0;p<16;p++)
{
write_1602dat(tab3[p]); //向液晶屏寫日歷顯示的固定符號(hào)部分
}
write_1602com(0xc0); //時(shí)間顯示固定符號(hào)寫入位置,從第2個(gè)位置后開(kāi)始顯示
for(p=0;p<16;p++)
{
write_1602dat(tab4[p]); //寫顯示時(shí)間固定符號(hào),兩個(gè)冒號(hào)
}
}
//液晶顯示函數(shù)
void shuma(uint buf)
{
uchar a,b,c,d,p;
a=buf/1000; //十位
b=buf%1000/100; //個(gè)位
c=buf%100/10; //小數(shù)點(diǎn)后一位
d=buf%10; //小數(shù)點(diǎn)后兩位
if(flag==0)
{
write_1602com(0x80+11);
write_1602dat(a+0x30);
write_1602dat(b+0x30);
write_1602dat('.');
write_1602dat(c+0x30);
}
if(flag==1) //短路提示
{
write_1602com(0x80); //時(shí)間顯示固定符號(hào)寫入位置,從第二個(gè)位置后開(kāi)始顯示
for(p=0;p<16;p++)
{
write_1602dat(tab5[p]); //寫入時(shí)間固定符號(hào),兩個(gè)冒號(hào)
}
write_1602com(0xc0); //時(shí)間顯示固定符號(hào)寫入位置,從第二個(gè)位置后開(kāi)始顯示
for(p=0;p<16;p++)
{
write_1602dat(tab6[p]); //寫入時(shí)間固定符號(hào),兩個(gè)冒號(hào)
}
}
}
//DAC5615驅(qū)動(dòng)函數(shù)
void tlc_5615(uint buf) //DA輸出
{
uint a,c; //定義變量
c=buf; //要輸出的數(shù)據(jù)賦值
CS_5615=0; //引腳拉低
for(a=16;a>0;a--) //循環(huán)16次
{
DAT_5615=c>>15; //把數(shù)據(jù)串行口輸入da芯片
c=c<<1; //將數(shù)據(jù)左移一位,下次循環(huán)時(shí)就是傳輸?shù)诙粩?shù)據(jù)了
CLK_5615=1; //拉高
CLK_5615=0; //拉低
}
CLK_5615=1;
CLK_5615=0;
CLK_5615=1;
CLK_5615=0;
CS_5615=1;
}
//ADC驅(qū)動(dòng)函數(shù)
unsigned int A_D()
{
unsigned char i, dat;
CS=1; //一個(gè)轉(zhuǎn)換周期開(kāi)始
CLK=0; //為第一個(gè)脈沖作準(zhǔn)備
CS=0; //CS置0,片選有效
DIO=1; //DI0置1,規(guī)定的起始信號(hào)
CLK=1; //第一個(gè)脈沖
CLK=0; //第一個(gè)脈沖的下降沿,此前DIO必須是高電平
DIO=1; //DI0置1,通道選擇信號(hào)
CLK=1; //第二個(gè)脈沖,第2、3個(gè)脈沖下沉之前,DI必須跟別輸入兩位數(shù)據(jù)用于選擇通道,這里選擇通道1
CLK=0; //第二個(gè)脈沖下降沿
DIO=0; //DI置0,選擇通道0
CLK=1; //第三個(gè)脈沖
CLK=0; //第三個(gè)脈沖下降沿
DIO=1; //第三個(gè)脈沖下沉之后,輸入端DIO失去作用,應(yīng)置1
CLK=1; //第四個(gè)脈沖
for(i=0;i<8;i++) //高位在前
{
CLK=1; //第四個(gè)詠沖
CLK=0;
dat<<=1; //將下面儲(chǔ)存的低位數(shù)據(jù)向右移
dat|=(unsigned char)DIO; //將輸出數(shù)據(jù)DIO通過(guò)或運(yùn)算儲(chǔ)存在dat最低位
}
CS=1; //片選無(wú)效
return dat; //將讀出的數(shù)據(jù)返回
}
//主函數(shù)
void main(void)
{
U=0; //電壓值顯示0
lcd_init();
while(1) //進(jìn)入循環(huán)
{
tlc_5615(U); //輸出電壓值
shuma(U/8*10); //顯示電壓值
if(flag==0) //沒(méi)有短路
{
if(KEY1==0) //按鍵1按下
{
shuma(U/8*10);
shuma(U/8*10);
shuma(U/8*10);
shuma(U/8*10);
shuma(U/8*10);//此處調(diào)用顯示函數(shù)就是延時(shí)去抖的作用
if(KEY1==0) //再次判斷按鍵1按下
{
if(U<960) //1V 對(duì)應(yīng)的是80 10位ad
U=U+8; //電壓加0.1V
}
}
if(KEY2==0) //按鍵2按下
{
shuma(U/8*10);
shuma(U/8*10);
shuma(U/8*10);
shuma(U/8*10);
shuma(U/8*10);
if(KEY2==0)
{
if(U>=8) //電壓減
U=U-8;
}
}
if(KEY3==0) //按鍵3按下
{
shuma(U/8*10);
shuma(U/8*10);
shuma(U/8*10);
shuma(U/8*10);
shuma(U/8*10);
if(KEY3==0)
{
U=528; //輸出6.6V電壓
}
}
if(KEY4==0) //按鍵4按下
{
shuma(U/8*10);
shuma(U/8*10);
shuma(U/8*10);
shuma(U/8*10);
if(KEY4==0)
{
U=0; //關(guān)閉輸出
}
}
}
GETU=A_D(); //讀取ad數(shù)據(jù)
if(GETU>=12) //0.0196V,采樣電阻采集到的電壓數(shù)據(jù)
{
U=0; //關(guān)閉輸出
led=0;
a=0;
flag=1; //短路標(biāo)志位
}
}
}
|
-
1.png
(71.83 KB, 下載次數(shù): 74)
下載附件
2020-7-9 17:09 上傳
-
0.png
(4.41 KB, 下載次數(shù): 96)
下載附件
2020-7-9 17:09 上傳
-
-
可控電源.zip
2020-7-9 17:10 上傳
點(diǎn)擊文件名下載附件
115.61 KB, 下載次數(shù): 4
|