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