基于单片机的数字电压表设计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 |