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

📄 ad.c

📁 数字电压表 利用单片机AT89S51与ADC0809设计一个数字电压表
💻 C
字号:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int 
#define ulong unsigned long
#define _rrca_()          CY   = ACC & 0x01           //产生RRC A指令
#define _rlca_()          CY   = ACC & 0x80           //产生RLC A指令
sbit bADcs=P1^4;
sbit bADcl=P1^5;
sbit bADda=P1^6;
sbit flag=P1^7;
sbit str=P2^7;
sbit d=P2^6;
sbit clk=P2^5;
bit choose=0;
unsigned char data1;
unsigned char count;
unsigned char cycle;
uint ge,xiao1,xiao2;
unsigned long data2;
//无小数点
const uchar table1[17]={0x81,0xed,0x43,0x49,0x2d,0x19,0x11,0xcd,0x01,0x09,0x71,0x31,0x93,0x61,0x13,0x17,0xff};


//有小数点
const uchar table2[17]={0x80,0xec,0x42,0x48,0x2c,0x18,0x10,0xcc,0x00,0x08,0x70,0x30,0x92,0x60,0x12,0x16,0xff};
uchar buffer[4]={0x00,0x00,0x00,0x00};


void Delayus(uchar i)
 {
  while(--i);
 }

void display(void)
{

uchar bit_count=0;
uchar table_counter=0;
uchar byte_counter=0;
uchar temp_i=0;
buffer[0]=xiao2;
buffer[1]=xiao1;
buffer[2]=ge;
buffer[3]=0x00;


//led_str_off;//先清零
str=0;
//led_clk_off;
clk=0;
for(byte_counter=0;byte_counter<4;byte_counter++)
	{
	bit_count=8;
   if(byte_counter==2)temp_i=table2[buffer[byte_counter]];
    else
	temp_i=table1[buffer[byte_counter]];
//	nop;
	while(bit_count>0)
		{
		if((temp_i&0x80)==0)
			{
			//led_d_off;
			d=0;
			}
		else
			{
			//led_d_on;
			d=1;
			}
		temp_i=(temp_i<<1);
		
//		nop;
		//led_clk_on;
		clk=1;
//		nop;
		//led_clk_off;
		clk=0;
//		nop;
		
		bit_count--;			
		
		}
	
	}

	//led_str_on;
	str=1;
}

/*
void ad()
{
	choose=0;
	 count = 0;
	 bADcs = 0;//当ADC0832未工作时其CS输入端应为高电平,此时芯片禁用.
	 bADcl = 0;
	 bADda = 1;//在第1 个时钟脉冲的下沉之前DI端必须是高电平.
	 bADcl = 1; 
	 bADcl = 0;//pulse 1 down
	 bADda = 1;
	 bADcl = 1; bADcl = 0;//pulse 2 down
	 if(choose == 0)
		 bADda = 0;
	else
		 bADda = 1;	 
	  bADcl = 1; bADcl = 0;//pulse 3 down
	  bADcl = 1; bADcl = 0;//pulse 4 down
    	//bADcl = 1;


      for(cycle = 8; cycle > 0; cycle-- )
		 {
		 bADda = 1;

		//bADcl = 0;//pulse 
		bADcl = 1;
		 CY = bADda;
		 _rlca_();	//RRC A
		 bADcl = 0;//pulse
		 }
	 data1= ACC;

     
	 for(cycle = 8; cycle > 0; cycle-- )
		 {
		 bADda = 1;
		  
		  bADcl = 1;
		 CY = bADda;
		 _rrca_();	//RLC A
		 bADcl = 0;//pulse 
			 }

		 //bADcl = 0;//pulse
 
} */
void ad(void)
{  	 uchar i;
     //data1=0;
     bADcs = 0;//当ADC0832未工作时其CS输入端应为高电平,此时芯片禁用.
	 bADcl=0;
	 bADda=1;
	 bADcl=1;
	 bADcl=0;//i down
	 bADda=1;
	 bADcl=1;
	 bADcl=0;	//   2 down
	 bADda=0;
	 bADcl=1;
	 bADcl=0;	//   3 down
	 bADda=1;
	 bADcl=1;
	 bADcl=0;	//   4 down

	 for(i=8;i>0;i--)
	 	{
		
	 	data1<<=1;
	 	bADcl=0;
		bADcl=1;
		if(bADda==1) data1|=0x01;
		   	bADda=1;
	 	}
	/* for(i=8;i>0;i--)
	 	{
	 	bADcl=0;
		bADcl=1;
	 	}	*/
		 bADcs=1;
	 
}
void cal()
{
data2=((ulong)data1*493)/256;
ge=data2/100;
xiao1=(data2%100)/10;
xiao2=data2%10;
}

main()
{
flag=1; 	
  while(1){
	      ad();
       	  cal();
          display();
  }
}

⌨️ 快捷键说明

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