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 + -
显示快捷键?