⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 max147.c

📁 基于8位并行AD和12位串行AD的数字直流电压表
💻 C
字号:
#include"reg51.h"
#include"intrins.h"
#define uchar unsigned char 
#define uint unsigned int
#define nop() _nop_()
#define WEI P2
#define DUAN P0

code uchar display[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f };
data uchar Disp_Data[4]={0,0,0,0};
idata uint D_Temp[10]={0,0,0,0,0,0,0,0,0};
idata float D_Temp1[10]={0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0};
sbit START=P3^2;
/*************变量定义******************/
float Vref=2.5;
bit End_Flag=0;
/*************函数声明******************/
void delay(uchar j);//
void Data_Process(void);
void led_display(void);
void Wr_Contrl_Byte(uchar CB);
/**************************************/
sbit SCLK = P1^0;	//串行时钟
sbit CS = P1^1;		//片选端
sbit DIN = P1^2;	//串行数据输入
sbit SSTRB = P1^3;	//输出闸门
sbit DOUT = P1^4;	//串行数据输出

/***************************************/
void delay(uchar j)
{	register i;
	while(j--)
	{
		for(i=0;i<125;i++)
		{;}
	}
}
/***************************************/ 
void Wr_Contrl_Byte(uchar CB)
{
	uchar i;
	CS=0;
	for(i=0;i<8;i++)
	{	
		SCLK=0;
	 	DIN=0;
		if((CB<<i)&0x80)DIN=1;
		SCLK=1;
		nop();
		nop();
		nop();
	}
	CS=1;
}
         
/***************************************/
uint Re_Data(void)
{
	uint Con_Data=0;
	uchar i;
	CS=0;
	Con_Data=0;
	DOUT=1;
	for(i=0;i<12;i++)
	{	
	    SCLK=0;
		nop();
		nop();
		nop();
		SCLK=1;
		Con_Data<<=1;
		if(DOUT)
		 {Con_Data|=0x01;}
	}	
	CS=1;
	return Con_Data;
}
/***************************************/
void Data_Process(void)
{
	uchar i;
	float tt;
	uint dispnumber;
	if(End_Flag)
	{
		for(i=0;i<10;i++)
		{
			D_Temp1[i]=2.0*(D_Temp[i]*Vref)/4095.0;
		} 
		
		tt=(D_Temp1[0]+D_Temp1[1]+D_Temp1[2]+D_Temp1[3]+D_Temp1[4]+D_Temp1[5]+D_Temp1[6]+D_Temp1[7]+D_Temp1[8]+D_Temp1[9])/10.0;
		//计算数字量对应的电压值(单极性×2)
		tt*=1000.0;								  //电压放大1000倍,显示到
	    dispnumber=(uint)tt;
		Disp_Data[0]=dispnumber/1000;
		Disp_Data[1]=dispnumber%1000/100;
		Disp_Data[2]=dispnumber%1000%100/10;
		Disp_Data[3]=dispnumber%1000%100%10;
		End_Flag=0;
	}
}
/**************************************/
void led_display(void)
{
	uchar i,j,k;
    uchar *p,*q;
	p=&Disp_Data[0];	
	q=display;	
	k=0x08;
		for(i=0;i<4;i++)
		{
			WEI=k;
			j=*(p+i);
			DUAN=*(q+j);
			if(i==0)
			{DUAN|=0x80;}			
			k>>=1;
			delay(1);
		}
}

/**************************************/
void main(void)//主程序
{   
	TH0=(65536-10000)/256;
	TL0=(65536-10000)%256;
	TMOD=0x01;
	ET0=1;
	EA=1;
	
	while(1)
	{	if(!START)
		{
			delay(5);
			while(!START);
			TR0=1;
		}	
		Data_Process();
		led_display();
	}
 }


void timer0(void)interrupt 1
{	
	static uchar cnt;
	TH0=(65536-10000)/256;
	TL0=(65536-10000)%256;
	Wr_Contrl_Byte(0xce);	//10001110:通道0,单极单端输入,内部时钟模式
    D_Temp[cnt]=Re_Data();
	cnt++;
	if(cnt==10)
	{
		cnt=0;
		End_Flag=1;
		TR0=0;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -