应广单片机PFS123ADC采集电压显示例程

目录

应广单片机PFS123ADC采集电压显示视频

应广单片机PFS123ADC采集电压显示图片

应广单片机PFS123按键中断控制数码管显示代码

应广科技网址,开发工具,PMS123规格书:http://www.padauk.com.tw/cn/product/show.aspx?num=145&kw=PFS123



应广单片机PFS123ADC采集电压显示图片

应广单片机PFS123按键中断控制数码管显示代码

#include	"extern.h"
COM1	equ	pc.3
COM2	equ	pa.7
COM3	equ	pa.6
bit 	j;
byte 	m;
byte	num_bit;
byte	num_ten;
word    reload_T16;
word	data;//分辨率为12测得的ADC值
word	VDD_data;

void    ADC_Init(void)	//初始化
{
	$ ADCC Enable,BANDGAP;	//启用ADC功能,通道选择(AD转换的输入信号)
							//启用:Enable;停用:Disable
							//通道选择:BANDGAP
	$ ADCM 12bit,/2;		//时钟源选择(系统时钟/X)
							//X有/1, /2, /4, /8, /16, /32, /64, /128
							//注:时钟源选择建议选用500K(/2)
							//参考高电压为VDD
    $ ADCRGC VDD;
    .delay 200*4;		//延时400us
						//注:时钟源选择其他时,延迟时间请参考datasheet
}

void	ADC_mea(void)//测量数据
{
	byte Icnt = 16;//测量16笔数据
	Eword	_Temp = 0;//16笔数据之和
	while(Icnt--)
	{
		//开始ADC转换
		AD_START = 1;		//开始ADC转换
		while(!AD_DONE)		//等待ADC转换结果
			NULL;
		//当AD_DONE高电位时读取ADC结果
		//注意:8位分辨率读取ADCR值,9~12为分辨率读取ADCRH和ADCRL
		data$1 = ADCRH;
		data$0 = ADCRL;
		_Temp += data;
	}
	data = _Temp >> 4;//取平均值
}

DWORD	mul_t4;
WORD	mul_x2;
WORD	mul_y2;
void	Word_Mul_Word (void)
{	//	mul_t4[D]	=	mul_x2[W] * mul_y2[W]
	mul_t4$3	=	0;
	mul_t4$2	=	0;

	BYTE	cnt;
	cnt	=	16;

	do
	{
		mul_x2	>>=	1;
		if (CF)
		{
			mul_t4	+=	(mul_y2 << 16);
		}
		mul_t4	>>>=	1;
	} while (--cnt);
}

DWORD	div_src4;
WORD	div_val2, div_res2;
void	DWord_Div_Word (void)
{	//	div_src4[D] / div_val2[W]	=	div_src4[D] * div_val2[W] + div_res2[W]
	BYTE	div_cnt, div_tmp;
	div_cnt		=	0;
	div_res2	=	0;

	do
	{
		div_src4	<<=		1;
		div_res2	<<<=	1;
		div_tmp		<<<=	1;
		div_cnt++;
		A	=	(div_res2 - div_val2) >> 8;

		if (div_tmp.0 || ! CF)
		{
			div_res2$1	=	A;
			div_res2$0	-=	div_val2$0;
			div_src4.0	=	1;
		}
	} while (! div_cnt.5);
}

void	ADC_calcu(void)//数据计算
{
	//VDD = BG(1.2V) * 0xFFF0 / ADC(分辨率12的芯片)
	mul_x2 = 0xFFF0;//分辨率12为0xFFF0
	mul_y2 = 120;//BG电压的100倍
	Word_Mul_Word();
	div_src4 = mul_t4;
	div_val2 = data;
	DWord_Div_Word();
	VDD_data = div_src4;//测得的值是实际值100倍
	nop;
}

void	Look_Table(void)
{
	A += 1;
	_Pcadd
	{
		ret		0x3f;//0
		ret 	0x06;//1
		ret		0x5b;//2
		ret 	0x4f;//3
		ret		0x66;//4
		ret 	0x6d;//5
		ret		0x7d;//6
		ret 	0x07;//7
		ret		0x7f;//8
		ret 	0x6f;//9
	}
}

void	xianshi(void)
{		

		A = num_ten;
		Look_Table();
		m = A;
		PA = m & 0x01;	//a->	pa0=1,其他的关
		PB = m & 0x00;
		PC = m & 0x00;
	  	$ COM1 out,low;						//c3为共阴极=0,a->f流水灯
		$ COM2 out,high;
		$ COM3 out,high;
		.delay 1000;

		PA = (m<<3) & 0x10;	//b->	a4=1,其他的关
		PB = m & 0x00;
		PC = m & 0x00;
		$ COM1 out,low;						//c3为共阴极=0,a->f流水灯
		$ COM2 out,high;
		$ COM3 out,high;
		.delay 1000;
		
		PA = (m<<1 )& 0x08;	//c		a3=1,其他的关
		PB = m & 0x00;
		PC = m & 0x00;
		$ COM1 out,low;						//c3为共阴极=0,a->f流水灯
		$ COM2 out,high;
		$ COM3 out,high;
		.delay 1000;

		PA = m & 0x00;	//d		c0=1,其他的关
		PB = m & 0x00;
		PC = (m>>3) & 0x01;
		$ COM1 out,low;						//c3为共阴极=0,a->f流水灯
		$ COM2 out,high;
		$ COM3 out,high;
		.delay 1000;

		PA = m & 0x00;	//e		c1=1,其他的关
		PB = m & 0x00;
		PC = (m>>3) & 0x02;
		$ COM1 out,low;						//c3为共阴极=0,a->f流水灯
		$ COM2 out,high;
		$ COM3 out,high;
		.delay 1000;

	    PA = m & 0x00;	//f		b0=1,其他的关
		PB = (m>>5) & 0x01;
		PC = m & 0x00;
		$ COM1 out,low;						//c3为共阴极=0,a->f流水灯
		$ COM2 out,high;
		$ COM3 out,high;
		.delay 1000;

	    PA = (m>>2) & 0x10;						//g		a6=0,a4=1,其他的关
		PB = m & 0x00;
		PC = m & 0x00;
	  	$ COM1 out,high;
		$ COM2 out,high;
		$ COM3 out,low;						//a6为共阴极=0,开g数码管
		.delay 1000;

/*个位分两部分*/
		A = num_bit;
		Look_Table();
		m = A;
		PA = m & 0x01;	//a->	pa0=1,其他的关
		PB = m & 0x00;
		PC = m & 0x00;
	  	$ COM1 out,high;						//c3为共阴极=0,a->f流水灯
		$ COM2 out,low;
		$ COM3 out,high;
		.delay 1000;

		PA = (m<<3) & 0x10;	//b->	a4=1,其他的关
		PB = m & 0x00;
		PC = m & 0x00;
		$ COM1 out,high;						//c3为共阴极=0,a->f流水灯
		$ COM2 out,low;
		$ COM3 out,high;
		.delay 1000;
		
		PA = (m<<1 )& 0x08;	//c		a3=1,其他的关
		PB = m & 0x00;
		PC = m & 0x00;
		$ COM1 out,high;						//c3为共阴极=0,a->f流水灯
		$ COM2 out,low;
		$ COM3 out,high;
		.delay 1000;

		PA = m & 0x00;	//d		c0=1,其他的关
		PB = m & 0x00;
		PC = (m>>3) & 0x01;
		$ COM1 out,high;						//c3为共阴极=0,a->f流水灯
		$ COM2 out,low;
		$ COM3 out,high;
		.delay 1000;

		PA = m & 0x00;	//e		c1=1,其他的关
		PB = m & 0x00;
		PC = (m>>3) & 0x02;
		$ COM1 out,high;						//c3为共阴极=0,a->f流水灯
		$ COM2 out,low;
		$ COM3 out,high;
		.delay 1000;

	    PA = m & 0x00;	//f		b0=1,其他的关
		PB = (m>>5) & 0x01;
		PC = m & 0x00;
		$ COM1 out,high;						//c3为共阴极=0,a->f流水灯
		$ COM2 out,low;
		$ COM3 out,high;
		.delay 1000;

	    PA = (m>>3) & 0x08;						//g		a6=0,a3=1,其他的关
		PB = m & 0x00;
		PC = m & 0x00;
	  	$ COM1 out,high;
		$ COM2 out,high;
		$ COM3 out,low;						//a6为共阴极=0,开g数码管
		.delay 1000;
}

void 	T16_Time(void)
{
	$ T16M SYSCLK,/64,bit15;  //T16的时钟源选择,内部的时钟分频器,中断源选择(当选择位由低到高或者由高到低时,发生中断事件);
								//时钟源选择可以选择STOP, SYSCLK, PA4_F, IHRC, EOSC, ILRC, PA0_F;分频器可选择/1, /4, /16, /64
								//中断源可选择BIT8, BIT9, BIT10, BIT11, BIT12, BIT13, BIT14, BIT15
	reload_T16 = 32768 - 31250;	//每次进中断为1s;
			                	//计算公式为 [1/(时钟源/分频器)]*(中断源-reload_T16)=[1/(2M/64)]*(2^15-(32768 - 31250))=1s

	stt16 reload_T16;		//设定计数器初始值reload_T16,当计数器累加超过设定中断源时产生中断;

	$ INTEN T16;			//中断允许寄存器,启用从T16的溢出中断;1:启用,0:停用。
	$ INTRQ T16;			//中断请求寄存器,此位是由硬件置位并由软件清零;1:请求,0:不请求。
							//注:INTEN,INTRQ没有初始值,所以要使用中断前,一定要根据需要设定数据。即使INTEN为0,INTRQ还是会被中断发生源触发。
	$ INTEGS BIT_R;			//T16中断边缘选择,上升缘请求中断为BIT_R,下降缘请求中断为BIT_F;默认为上升缘请求。
	INTEN.T16 = 1;			//开T16中断
	INTRQ.T16 = 0;			//清零INTRQ寄存器。
	ENGINT;					//打开全局中断
}


void	FPPA0 (void)
{
	.ADJUST_IC	SYSCLK=IHRC/8, IHRC=16MHz;
	num_ten = 0;
	num_bit = 0;
	PAC = 0b1101_1001;
	PBC = 0b0000_0001;
	PCC = 0B0000_1011;
	PA = 0b0000_0000;
	PB = 0b0000_0000;
	PC = 0b0000_0000;
	ADC_init();
	T16_Time();
	.delay 10000;
	while (1)
	{	
		if(j)
		{			
			j=0;
			num_ten = 0;
			num_bit = 0;
			ADC_mea();
			ADC_calcu();
/*			if(320<VDD_data&&VDD_data<330){num_ten=3;num_bit=2;}
			if(330<VDD_data&&VDD_data<340){num_ten=3;num_bit=3;}
			if(340<VDD_data&&VDD_data<350){num_ten=3;num_bit=4;}
			if(350<VDD_data&&VDD_data<360){num_ten=3;num_bit=5;}
			if(360<VDD_data&&VDD_data<370){num_ten=3;num_bit=7;}
			if(370<VDD_data&&VDD_data<380){num_ten=3;num_bit=8;}
			if(380<VDD_data&&VDD_data<400){num_ten=3;num_bit=9;}
			if(400<VDD_data&&VDD_data<410){num_ten=4;num_bit=0;}
			if(410<VDD_data&&VDD_data<420){num_ten=4;num_bit=1;}
			if(420<VDD_data&&VDD_data<440){num_ten=4;num_bit=3;}
			if(440<VDD_data&&VDD_data<460){num_ten=4;num_bit=5;}
			if(460<VDD_data&&VDD_data<480){num_ten=4;num_bit=6;}
			if(480<VDD_data&&VDD_data<500){num_ten=4;num_bit=8;}
			if(500<VDD_data&&VDD_data<520){num_ten=5;num_bit=0;}
			if(520<VDD_data&&VDD_data<540){num_ten=5;num_bit=2;}
			if(540<VDD_data&&VDD_data<560){num_ten=5;num_bit=4;}
			if(560<VDD_data&&VDD_data<580){num_ten=5;num_bit=6;}*/
			while(VDD_data>100){VDD_data-=100;num_ten++;}
			while(VDD_data>10){VDD_data-=10;num_bit++;}
		}
		xianshi();
	}
}
void	Interrupt (void)
{
	pushaf;        //进栈
	if (Intrq.T16)
	{
		Intrq.T16=0;
		stt16 reload_T16;	
		j=1;
	}
	popaf;        //出栈
}

应广科技网址,开发工具,PMS123规格书:PFS123

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值