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

📄 ad.c

📁 基于51单片机的0831AD转换
💻 C
字号:
#include <reg52.h>
#include <intrins.h>
#define XBYTE ((char *) 0x20000L)
#define uint unsigned int
#define uchar unsigned char

unsigned char num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
		             0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
unsigned char led_num[4];

sbit DO=P1^2;					//P1.0接DO端
sbit CLK=P1^1;					//P1.1接CLK端
sbit CS=P1^0;					//P1.2接CS端

void Delay();
uchar ReadADC(void);

/*************************************************************************************
              
**************************************************************************************/
void Delay5us()
{
	uchar i;
	for(i=0;i<2;i++);//???为什么转换时间弄到这么短也可以
}

/******************************************

*******************************************/
void Delay()
{
	uchar i,j;
	for(i=0;i<10;i++)
		for(j=0;j<100;j++); 
}
/*************************************************************************************
启动,转换时间要足够长,理论上至少要32us,但我的程序里小于32us也是可以的
**************************************************************************************/
void start()
{
	CLK=0;
	CS=1;
	DO=1;
	Delay5us();
	CS=0;
//	_nop_();
	CLK=1;
	Delay5us();
	CLK=0;
	DO=0;
	Delay5us();
	CLK=1;
	Delay5us();
//	CLK=0;
//	DO=1;
//	Delay5us();
}
/*************************************************************************************
                      
**************************************************************************************/
uchar ReadADC(void)
{
	uchar i;
	uchar ch;
	bit	  d;
	start();
	DO=1;
//	CLK=1;
//	Delay5us();
	
	ch=0;
	for(i=0;i<8;i++)
	{
		CLK=0;
//*		DO=1;
		_nop_();
		_nop_();
//		Delay5us();
		d = DO;

		if(d)
		ch=(ch<<1)|0x01;
		else
		ch=(ch<<1)|0x00;
		Delay5us();
		CLK=1;
		Delay5us();		
	}
/*
	DO=0;
	CS=0;
	Delay5us();
	CS=1;
	DO=1;
	Delay5us();
*/
	return(ch);
}

/*************************************************************************************
 
**************************************************************************************/
void trans()
{
	uchar i;
	float tmp;
	int j;

	i = ReadADC();
	tmp = i;
	tmp = tmp*5.0/256;

	j = (int)(tmp*1000);//数据转换时一定要注意类型表示的范围

	led_num[0] = j/1000+10;
	led_num[1] = j%1000/100;
	led_num[2] = j%100/10;
	led_num[3] = j%10;	
}
/*************************************************************************************

**************************************************************************************/
void display(unsigned char *led)
{		
	unsigned char i=0;

	for(i = 0; i < 4 ; i++)
	{
		XBYTE[0xb000] = num[led[i]];	//显示数字
		XBYTE[0xc000] = ~(0x01<<i);		//选择数码管
		Delay();
	}
		
}
/*************************************************************************************
                        
**************************************************************************************/
void main(void)
{
	uchar a;
	XBYTE[0xa000] = 0x00;
	while(1)
	{
		a=ReadADC();
		trans();
		display(led_num);
	}
}

⌨️ 快捷键说明

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