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

📄 adc0831.c

📁 自己单片机板c程序
💻 C
字号:
/*做这个例子的朋友,先看完这段话,一定要看完再做实验。
ADC0831模数转换程序,运行程序后,调节下电位器,看数码管的显示电压从0V-5V变化?
本程序将模数转换回来的数据,我们再转抽换成相应的电压值输出数据管显示
调节电位器其实就是分压板上的JIN插针的输入电压,使ADC转换到相应电压值,如果想测外电压,就是从
JIN脚输入,切记,测量电压不可超过直流5V电压,否则ADC0831将烧毁,切记切记,初学者一定切记,还有电压极性
一定不可以搞错,板上JIN插针一脚是地,一脚是测电压正极,提醒个位朋友,如果要测外电压,就测自身板上的
IC各脚电压,因为板子是5V供电,所以都不会超出5V,而且我们还可以测到各IC的各脚工作电压,特别是单片机,还有
一点注意的是,不要去测MAX232IC,因为此IC内部有升压电路,有的脚是有12V电压的,所以切记不要去测量,
还有一点就是,先将电位器调节到电压显示为2。5V时再测其它脚位,这样才准确,*/

#include <reg51.h>
#include <intrins.h>

sbit SCL2=P1^3;		//SCL2定义为P1口的第3位脚,连接ADC0831SCL脚
sbit SDA2=P1^4;		//SDA2定义为P1口的第4位脚,连接ADC0831SDA脚
sbit CS2=P1^6;		//CS2定义为P1口的第4位脚,连接ADC0831CS脚
sbit RST = P1^5;// DS1302片选,因这两芯片采用同一数据脚(SDA,SCL),所以我们要定义它,将DS1302片选关掉,否则发生冲突

code unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
							0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,
							0x40,
							0x3e,
							0x00};
			//共阴数码管显示数的组成是 "0-9""0-9有小数点的" "-" "U" "空 表"
unsigned char l_tmpdate[]={0,0,0,0};//定义数组变量
void delay();//延时子函数,5个空指令
void display(unsigned char *lp,unsigned char lc);//数字的显示函数;lp为指向数组的地址,lc为显示的个数
unsigned char ad0831read(void);	//定义该函数为读取ADC0831的数据


void main(void)     //入口函数
{
	unsigned int i=254,tmp;
	RST=0;	
	while(1){
		i++;
		if(i==255){			//这里为循环255个周期读取一次0831,因CPU运行比较快,没必要每次循环都去读取
			tmp=ad0831read()*100;		//这里乘上100的意思是保留两位小数
			tmp=tmp/51;			//这里为什么除以51呢,分析如下:模数转换IC是8位ADC,转换回来的数值是0-255
								//0V时是0,5V时是255,他相应的倍数就是255/5=51,因此,我们的将转换回来的
								//数除以51,就得到相应的电压值了,
			i=0;		
			l_tmpdate[0]=tmp/100;	//得到百位,其实是个位,因为我们刚才乘上100了
			l_tmpdate[0]+=10;		//这里是加上小数点,带小数点的数在表中是后10位
			tmp=tmp%100;			
			l_tmpdate[1]=tmp/10;	//十位	即小数点后第一位
			l_tmpdate[2]=tmp%10;	//个位	//即小数点后第二位
			l_tmpdate[3]=21;		//加上单位U,伏
		}
		display(l_tmpdate,4);		//输出显示
	}
}
void display(unsigned char *lp,unsigned char lc)//显示
{
	unsigned char i;		//定义变量
	P2=0;					//端口2为输出
	P1=P1&0xF8;				//将P1口的前3位输出0,对应138译门输入脚,全0为第一位数码管
	for(i=0;i<lc;i++){		//循环显示
	P2=table[lp[i]];		//查表法得到要显示数字的数码段
	delay();				//延时5个空指令	
	if(i==7)				//检测显示完8位否,完成直接退出,不让P1口再加1,否则进位影响到第四位数据
		break;
	P2=0;					//清0端口,准备显示下位
	P1++;					//下一位数码管
	}
}
void delay(void)								//空5个指令
{
	_nop_();_nop_();_nop_();_nop_();_nop_();
}

unsigned char ad0831read(void)//请先了解ADC0831模数转换器的串口协议,再来读本函数,主要是对应时序图来理解
{								//本函数是模拟0831的串口协议进行的,当你了解用软件去模拟一个端口的协议
								//以后,对于一个硬件这样的端口就简单多了
	unsigned char i=0,tmp=0;
		SDA2=1;
		CS2=0;
		_nop_();
		_nop_();
		SCL2=0;
		_nop_();
		_nop_();
		SCL2=1;
		_nop_();
		_nop_();
		SCL2=0;
		_nop_();
		_nop_();
		SCL2=1;
		_nop_();
		_nop_();
		SCL2=0;
		_nop_();
		_nop_();
		for(i=0;i<8;i++){
			tmp<<=1;
			if(SDA2)
				tmp++;			
			SCL2=1;
			_nop_();
			_nop_();
			SCL2=0;
			_nop_();
			_nop_();
		}
		CS2=1;
	return tmp;
}


⌨️ 快捷键说明

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