基于單片機的數字電壓表設計C51原程序
#include
sbit ST=P3^6;
sbit OE=P3^7;
sbit EOC=P3^2;
sbit ZLG7289_pinCS=P1^0;
sbit ZLG7289_pinCLK=P1^1;
sbit ZLG7289_pinDIO=P1^2;
unsigned char ZLG7289_Delay_t=4;
/*
宏定義:ZLG7289_ShortDelay()
功能:短延時
說明:延時ZLG7289_ShortDelay_t*2+8)個機器周期
*/
void ZLG7289_ShortDelay()
{
unsigned char t=ZLG7289_Delay_t;
while(--t!=0);
}
/*
宏定義:ZLG7289_LongDelay()
功能:長延時
說明:延時ZLG7289_LongDelay_t*12+8)個機器周期
*/
void ZLG7289_LongDelay()
{
unsigned char t=ZLG7289_Delay_t*6;
while(--t!=0);
}
黑龍江職業學院畢業論文(設計)
/*
函數:ZLG7289_SPI_Write()
功能:向SPI總線寫入1字節的數據
參數:
dat:要寫入的數據
*/
void ZLG7289_SPI_Write(char dat)
{
unsigned char t=8;
do
{
ZLG7289_pinDIO=(bit)(dat&0x80);
dat<<=1;
ZLG7289_pinCLK=1;
ZLG7289_ShortDelay();
ZLG7289_pinCLK=0;
ZLG7289_ShortDelay();
}while(--t!=0);
}
/*函數:ZLG7289_cmd()
功能:執行ZLG7289純指令
參數:
cmd:命令字
*/
void ZLG7289_cmd(char cmd)
{
char sav=IE;
IE&=0xFA;
ZLG7289_pinCS=0;
ZLG7289_LongDelay();
ZLG7289_SPI_Write(cmd);
ZLG7289_pinCS=1;
ZLG7289_LongDelay();
IE=sav;
}
//復位(清除)指令
void ZLG7289_Reset()
{
ZLG7289_cmd(0xA4);
}
/*
函數:ZLG7289_cmd_dat()
功能:執行ZLG7289帶數據指令
參數:
cmd:命令字
dat:數據
*/
void ZLG7289_cmd_dat(char cmd,char dat)
{
char sav=IE;
IE&=0xFA;
ZLG7289_pinCS=0;
ZLG7289_LongDelay();
ZLG7289_SPI_Write(cmd);
ZLG7289_LongDelay();
ZLG7289_SPI_Write(dat);
ZLG7289_pinCS=1;
ZLG7289_LongDelay();
IE=sav;
}
/*
函數:ZLG7289_Download()
功能:下載數據
參數:
mod=0:下載數據且按方式0譯碼
mod=1:下載數據且按方式1譯碼
mod=2:下載數據且按方式2譯碼
x:數碼管編號(橫坐標),取值0~7
dp=0:小數點不亮
dp=1:小數點亮
dat:要顯示的數據
說明:
譯碼方式的具體含義查參考數據手冊
*/
void ZLG7289_Download(unsigned char mod,char x, bit dp,char dat)
{
code char ModDat[3]={0x80,0xC8,0x90};
char d1;
char d2;
if(mod>2)mod=2;
d1=ModDat[mod];
x&=0x07;
d1|=x;
d2=dat&0x7F;
if(dp)d2|=0x80;
ZLG7289_cmd_dat(d1,d2);
}
/*
函數:ZLG7289_Init()
功能:ZLG7289初始化
參數:SPI總線的延時值設置,取值1-40(超出范圍可能導致錯誤)
說明:
t的取值可以參考以下公式:t>=5*f1/f2,其中f1表示89C51的
晶振頻率,f2表示ZLG7289的晶振頻率
*/
void ZLG7289_Init(unsigned char t)
{
unsigned char x;
//I/O口初始化
ZLG7289_pinCS=1;
ZLG7289_pinCLK=0;
ZLG7289_pinDIO=1;
//延時初始化
ZLG7289_Delay_t=t;
//點亮所有數碼管
for(x=0;x<4;x++)
{
ZLG7289_Download(1,x,1,8);
}
}
/***************************************************
***************主函數*******************************
****************************************************/
void main()
{
/*********程序初始化***********/
unsigned long int sum;
unsigned char gatdata;
char i,j,x,outdat;
int result;
ST=1;
OE=1;
ZLG7289_Reset();
ZLG7289_Init(4);
/*******初始化結束***************/
while(1)
{
sum=0;
gatdata=0;
for(i=0;i<=5;i++)
{
ST=0;
ZLG7289_ShortDelay();
ST=1;
while(1)
if(EOC==0)
{
OE=0;
gatdata=P0;
OE=1;
sum=sum+gatdata;
break;
}
}
result=(sum*1000)/255;
for(j=0;j<=3;j++)
{
outdat=result%10;
result=result/10;
if(j==3) x=1;
else x=0;
ZLG7289_Download(1,j,x,outdat);
}
}
}
0.092.jpg
0.081.jpg
0.062.jpg
f |