目录
应广科技网址,开发工具,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; //出栈
}