wadc0.c
来自「将AIN0.0的输入值(电压)转换为12位数字量」· C语言 代码 · 共 161 行
C
161 行
//功能:将AIN0.0的输入值(电压)转换为12位数字量,保存在片内外部存储器XRAM中
//LCD显示电压值
#include<c8051f020.h> //作SFR定义
sfr16 TMR3RL=0x92; //保存重装载值
sfr16 TMR3=0x94; //保存计数值
sfr16 ADC0=0xbe; //保存转换后代码
#define SYSCLK 22118400 //取22.118400MHz外部晶振
#define DEC 256
#define SAMPLE_RATE 50000
unsigned long x;
unsigned char xdata LCDdata[7]={0x30,0x30,0x2e,0x30,0x30,0x30,0x56};
long result;
unsigned char *lcdpoint; //指向 lcddata数组的指针
unsigned char lcd_data_count; //要显示的数据个数
unsigned char xdata *point; //指向XRAM的指针
void SYSCLK_Init (void);
void PORT_Init(void);
void Timer3_Init(int counts);
void ADC_Init(void);
void ADC_ISR(void);
void LCD_Init(void);
void main(void)
{
unsigned char data1;
long voltage;
int v_int,v_frac;
WDTCN=0xde; //关看门狗定时器
WDTCN=0xad;
SYSCLK_Init(); //初始化系统时钟
PORT_Init(); //初始化IO端口
Timer3_Init(SYSCLK/SAMPLE_RATE); //初始化定时器3
ADC_Init(); //初始化ADC0
EA=1; //允许所有中断
while(result==0); //等于0,则等待
while(1)
{
EA = 0;
voltage=result;
point=0x0000; //XRAM中0x0000单元保存数字量低8位
*point=voltage&0x00ff;
point=point+1; //0x0001单元保存高4位
*point=(voltage>>8)&0x000f;
for(x=0;x<50000;x++);
EA = 1;
voltage=8611L-(voltage*2968L)/1024; //通道0
//voltage=(voltage*625L)/1024; //通道1
v_int=voltage/1000;
v_frac=voltage-(v_int*1000);
LCDdata[0]=v_int/10+0x30;LCDdata[1]=v_int%10+0x30; //整数部分
LCDdata[3]=v_frac/100+0x30;LCDdata[4]=v_frac%100/10+0x30;LCDdata[5]=v_frac%100%10+0x30; //小数部分
LCD_Init(); //LCD初始化
P2=0xA0; //准备送数据
for(x=0;x<50000;x++); //通过改变延时量可改变LCD显示速度
lcdpoint=&LCDdata;
for(lcd_data_count=7;lcd_data_count>0;lcd_data_count--) //显示第一行字符
{
data1=*lcdpoint;
P3=data1; //送显
P2=0x20;
P2=0xA0;
lcdpoint++;
for(x=0;x<5000;x++);
}
}
}
void LCD_Init(void)
{
unsigned long x;
P2 = 0X80;
for(x=0;x<1000;x++);
//P7 = 0x30; /*一行显示*/
P3 = 0x38; /*两行显示*/
P2 = 0X00;//0x08;
P2 = 0X80;//0x09;
for(x=0;x<1000;x++);
P3 = 0x0e;
P2 = 0x00;
P2 = 0x80;
for(x=0;x<1000;x++);
P3= 0x06;
P2 = 0x00;
P2 = 0x80;
for(x=0;x<5000;x++);
P3 = 0x01;
P2 = 0x00;
P2 = 0x80;
for(x=0;x<5000;x++);
}
void SYSCLK_Init(void)
{
int i; // delay counter
OSCXCN=0x67; // 启动外部振荡器用22.1184MHz晶体
for(i=0;i<256;i++); // 最少等待>1ms
while (!(OSCXCN & 0x80)); // 等待晶体稳定
OSCICN=0x88; // 选择外部振荡器作为系统时钟源,使能丢失时钟检测器
}
void PORT_Init(void)
{
XBR2=0x40; //使能交叉开关
P2MDOUT = 0xe0; // P2口设为推挽方式
P3MDOUT = 0xff; // P3口设为推挽方式
EMI0CF|=0x20; //只用片内数据存储器,ALE高/低脉冲占1个SYSCLK周期
EMI0TC|=0x6c; //地址建立/保持时间占0个SYSCLK周期,读写占12个SYSCLK周期
}
void Timer3_Init (int counts)
{
TMR3CN = 0x02;
TMR3RL = -counts;
TMR3 = 0xffff;
EIE2 &= ~0x01;//使能T3标志位有效,允许作中断申请
TMR3CN |= 0x04;
}
void ADC_Init(void)
{
ADC0CN|=0x84; //ADC0使能,定时器3溢出使能模数转换
REF0CN = 0x07; // 启用内部基准源
ADC0CF =0x40; //设置转换周期=2.5MHz,PGA增益系数为1
AMX0CF|=0x00; //单端输入
AMX0SL=0x00; //选择通道0
//AMX0SL=0x01; //选择通道1
EIE2|=0x02; //使能ADC0转换结束中断
}
void ADC_ISR(void)interrupt 15 //ADC0转换结束中断服务程序
{
static unsigned dec=DEC;
static long accumulator=0L;
AD0INT = 0; // 清 ADC 中断标志位
accumulator += ADC0; // 累加ADC采样数据
dec--; // 指针减1
if(dec==0) // 累加完了吗?
{
dec = DEC; // 指针复位
result=accumulator>>8; // 取平均
accumulator=0L; // 累加和变量清0
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?