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

📄 capacitor.c

📁 avr 单片机用来测量电容的程序 需要配合实际电路 用的捕获时间方法
💻 C
📖 第 1 页 / 共 3 页
字号:
//ICC-AVR application builder : 2006-8-9 10:11:51
// Target : M32
// Crystal: 16.000Mhz

//#include <avr_macros.h>
#include <ioavr.h>
#include <inavr.h>
#include <ina90.h>

//#include <iom32.h>

#include "def.h"

void btnpressed(void);
void calhigh(void);
void callow(void);
void calcomp(long  int i);
void canoffset(void);
void calerr(void);
void dly(int i);
void measure(void);
void adjustzero(void);
void adjustgain(void);
void dispval(long int i);
void putformd(void);
void clrdisp (void);
void loadeep(void);
void saveeep(void);
void writeeep(int adress,int data);
int readeep(int adress);
void scankey(void);
void mn(void);
int AD_Receive( void );



long int a=0;
long int b=0;


int temp=0;
int keydown=0;
int form4[4]={14,5,15,15};
int form3[4]={14,4,15,15};
int form2[16]={10,1,0,13,
               10,0,0,13,
               14,3,15,15,
               14,3,15,15};
int form1[48]={15,1,0,13,
               0,1,0,13,
               0,0,0,13,
               1,0,0,12,
               0,1,0,12,
               0,0,0,12,
               1,0,0,11,
               0,1,0,11,
               0,0,0,11,
               14,2,15,15,
               14,2,15,15,
               14,2,15,15};
int seg7[16]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,
            //	 0  , 1  , 2  , 3  , 4  , 5  , 6  , 7
              0xfe,0xf6,0x02,0x4e,0xc4,0xce,0x9e,0x00};		
            //   8  , 9  , -   ,u  , n  , p  , E  ,
int dispptr=0;      //存储在第几个数码管上显示
int code=0;
long int mm1=0;
int pdispbuf[4];  //存储在这四个数码管上将要显示数值的显示代码在seg7里面的偏移
int dispbuf[5];   //存储在这四个数码管上将要显示数值的显示代码
int keyscan[2][2];   //存储有关于按键是否按下的数值
unsigned long int comp1=0;     //存储低量程校准的增益
unsigned long int comp2=0;     //存储高量程校准的增益
int comp3=0;        //存储0偏值
int strbuf[10];	    //存储测量数值转化成10进制后的每一位,从低位到高位存储		

int stm1=0;         //系统定时器1
int stm2=0;         //系统定时器2
int flags=0;        //标志,第0位是负数标志位,第一位是捕捉完成标志位
                    //第二位和第三位是测量时间超时标志位,第七位是按键按下标志位
                    //第六位和第五位表明已经高量程和低量程校准
int jianche;        //本变量仅仅在进行校准的时候区分高量程校准(1)和低量程校准(0)					
float result=0.0;
unsigned long resulta=0; //0.17Vcc时的result
unsigned long resultb=0; //0.5Vcc时的result
long int nbit=0;         //result的位数
long int count1=0;       //充电时间间隔的T/C1的溢出次数
long int count2=0;       //充电时间间隔的TCNT1H:TCNT1L
long int maxtc1ovf=0;	  //T/C1溢出次数的上限,高于他就测试失败		
long int ntc1ovf=0;      //T/C1的溢出次数
long int count1a=0;      //记录充电开始时的tc1计数值
long int count2a=0;      //记录充电开始时的tc1溢出次数
long int count1b=0;      //记录充电结束时的tc1计数值
long int count2b=0;      //记录充电结束时的tc1溢出次数
unsigned long int comp1l=0;       //comp1存储到EEPROM时分的高位和低位
unsigned long int comp1h=0;
unsigned long int comp2l=0;
unsigned long int comp2h=0;

void adc_init(void)
{
 ADCSRA = 0x00; //disable adc
// ADMUX = 0x61; //select adc input 0
 ADMUX = 0xE1; //select adc input 0
 ADCSRA = 0x87;
}

//写lcd的cs1命令寄存器函数
void lcd_wr1_ins (unsigned char lcd_wr_buffer)
{
    unsigned char lcd_wr_temp;
 	e_off;										  //读lcd状态
 	rw_on;
 	di_off;
 	cs1_on;
 	DDRA&=0x07;
 	PORTA&=0x07;
	DDRD&=0xe3;
 	PORTD&=0xe3;
 	e_on;
 	asm("nop");
 	asm("nop");
 	asm("nop");
 	lcd_wr_temp=(PINA&0xf8);
	lcd_wr_temp|=((PIND&0x1c)>>2);
 	e_off;
 	cs1_off;
 	while(lcd_wr_temp&0x90)
 	{
        e_off;					  				  //读lcd状态
	 	rw_on;
	 	di_off;
 	 	cs1_on;	
 	 	DDRA&=0x07;
 	    PORTA&=0x07;
		DDRD&=0xe3;
 		PORTD&=0xe3;
 		e_on;
 		asm("nop");
 		asm("nop");
 		asm("nop");
 		lcd_wr_temp=(PINA&0xf8);
		lcd_wr_temp|=((PIND&0x1c)>>2);
		e_off;
	 	cs1_off;
    }
 	e_off;										  //写lcd命令
 	rw_off;
 	di_off;
 	cs1_on;
	PORTA&=0x07;
 	PORTA|=(lcd_wr_buffer&0xf8);
	PORTD&=0xe3;
 	PORTD|=((lcd_wr_buffer<<2)&0x1c);
 	DDRA|=0xf8;
	DDRD|=0x1c;
 	e_on;
 	asm("nop");
 	asm("nop");
 	asm("nop");
 	asm("nop");
 	e_off;
 	cs1_off;
 	asm("nop");
 	asm("nop");	
 	DDRA&=0x07;
	DDRD&=0xe3;
}

//向lcd_cs1写数据函数
void lcd_wr1_data (unsigned char lcd_wr_buffer)
{
    unsigned char lcd_wr_temp;
 	e_off;										  //读lcd状态
 	rw_on;
 	di_off;
 	cs1_on;
 	DDRA&=0x07;
 	PORTA&=0x07;
	DDRD&=0xe3;
 	PORTD&=0xe3;
 	e_on;
 	asm("nop");
 	asm("nop");
 	asm("nop");
 	lcd_wr_temp=(PINA&0xf8);
	lcd_wr_temp|=((PIND&0x1c)>>2);
 	e_off;
 	cs1_off;
 	while(lcd_wr_temp&0x90)
 	{
        e_off;					  				  //读lcd状态
	 	rw_on;
	 	di_off;
 	 	cs1_on;	
 	 	DDRA&=0x07;
 	    PORTA&=0x07;
		DDRD&=0xe3;
 		PORTD&=0xe3;
 		e_on;
 		asm("nop");
 		asm("nop");
 		asm("nop");
 		lcd_wr_temp=(PINA&0xf8);
		lcd_wr_temp|=((PIND&0x1c)>>2);
		e_off;
	 	cs1_off;
    }
 	e_off;										  //写lcd数据
 	rw_off;
 	di_on;
 	cs1_on;
	PORTA&=0x07;
 	PORTA|=(lcd_wr_buffer&0xf8);
	PORTD&=0xe3;
 	PORTD|=((lcd_wr_buffer<<2)&0x1c);
 	DDRA|=0xf8;
	DDRD|=0x1c;
 	e_on;
 	asm("nop");
 	asm("nop");
 	asm("nop");
 	asm("nop");
 	e_off;
 	cs1_off;
 	asm("nop");
 	asm("nop");	
 	DDRA&=0x07;
	DDRD&=0xe3;
}

//写lcd的cs2命令寄存器函数
void lcd_wr2_ins (unsigned char lcd_wr_buffer)
{
    unsigned char lcd_wr_temp;
 	e_off;										  //读lcd状态
 	rw_on;
 	di_off;
 	cs2_on;
 	DDRA&=0x07;
 	PORTA&=0x07;
	DDRD&=0xe3;
 	PORTD&=0xe3;
 	e_on;
 	asm("nop");
 	asm("nop");
 	asm("nop");
 	lcd_wr_temp=(PINA&0xf8);
	lcd_wr_temp|=((PIND&0x1c)>>2);
 	e_off;
 	cs2_off;
 	while(lcd_wr_temp&0x90)
 	{
        e_off;					  				  //读lcd状态
	 	rw_on;
	 	di_off;
 	 	cs2_on;	
 	 	DDRA&=0x07;
 	    PORTA&=0x07;
		DDRD&=0xe3;
 		PORTD&=0xe3;
 		e_on;
 		asm("nop");
 		asm("nop");
 		asm("nop");
 		lcd_wr_temp=(PINA&0xf8);
		lcd_wr_temp|=((PIND&0x1c)>>2);
		e_off;
	 	cs2_off;
    }
 	e_off;										  //写lcd命令
 	rw_off;
 	di_off;
 	cs2_on;
	PORTA&=0x07;
 	PORTA|=(lcd_wr_buffer&0xf8);
	PORTD&=0xe3;
 	PORTD|=((lcd_wr_buffer<<2)&0x1c);
 	DDRA|=0xf8;
	DDRD|=0x1c;
 	e_on;
 	asm("nop");
 	asm("nop");
 	asm("nop");
 	asm("nop");
 	e_off;
 	cs2_off;
 	asm("nop");
 	asm("nop");	
 	DDRA&=0x07;
	DDRD&=0xe3;
}

//向lcd_cs2写数据函数
void lcd_wr2_data (unsigned char lcd_wr_buffer)
{
    unsigned char lcd_wr_temp;
 	e_off;										  //读lcd状态
 	rw_on;
 	di_off;
 	cs2_on;
 	DDRA&=0x07;
 	PORTA&=0x07;
	DDRD&=0xe3;
 	PORTD&=0xe3;
 	e_on;
 	asm("nop");
 	asm("nop");
 	asm("nop");
 	lcd_wr_temp=(PINA&0xf8);
	lcd_wr_temp|=((PIND&0x1c)>>2);
 	e_off;
 	cs2_off;
 	while(lcd_wr_temp&0x90)
 	{
        e_off;					  				  //读lcd状态
	 	rw_on;
	 	di_off;
 	 	cs2_on;	
 	 	DDRA&=0x07;
 	    PORTA&=0x07;
		DDRD&=0xe3;
 		PORTD&=0xe3;
 		e_on;
 		asm("nop");
 		asm("nop");
 		asm("nop");
 		lcd_wr_temp=(PINA&0xf8);
		lcd_wr_temp|=((PIND&0x1c)>>2);
		e_off;
	 	cs2_off;
    }
 	e_off;										  //写lcd数据
 	rw_off;
 	di_on;
 	cs2_on;
	PORTA&=0x07;
 	PORTA|=(lcd_wr_buffer&0xf8);
	PORTD&=0xe3;
 	PORTD|=((lcd_wr_buffer<<2)&0x1c);
 	DDRA|=0xf8;
	DDRD|=0x1c;
 	e_on;
 	asm("nop");
 	asm("nop");
 	asm("nop");
 	asm("nop");
 	e_off;
 	cs2_off;
 	asm("nop");
 	asm("nop");	
 	DDRA&=0x07;
	DDRD&=0xe3;
}


//LCD显示刷屏函数,起始地址放在lcd_display2_buffer[0][0]中
//使用的全局变量:*lcd_display_rdp;
void lcd_display2(void)
{
    const unsigned char *asc_rdp;
 	unsigned char lcd_row_counter;
 	unsigned char lcd_column_counter;
 	unsigned char lcd_asc;
 	unsigned char lcd_asc_column;
 	unsigned char lcd_buffer1;
 	unsigned char lcd_invter;
 	lcd_wr1_ins(0xc0);							 //显示起始行为0
 	lcd_wr2_ins(0xc0);							 //显示起始行为0
 	*lcd_display_rdp=lcd_display2_buffer[0][0];
 	for (lcd_row_counter=0;lcd_row_counter<=7;lcd_row_counter++)  //显示的0~7行循环计数
    {
  	    lcd_wr1_ins(lcd_row_counter+0xb8);			 //设置x页地址
 	   	lcd_wr2_ins(lcd_row_counter+0xb8);			 //设置x页地址
 	   	lcd_wr1_ins(0x40);						 	 //y地址清零
 	   	lcd_wr2_ins(0x40);						 	 //y地址清零
       	for (lcd_column_counter=0;lcd_column_counter<=9;lcd_column_counter++)  //显示的0~20列循环计数(cs1为0~9列)
	    {
	  	    lcd_asc=*lcd_display_rdp;					          //要显示的字符ASC码放在lcd_asc中	

	
		    lcd_display_rdp++;
			if (lcd_asc&BIT(7))
			{
			    lcd_invter|=BIT(0);
				lcd_asc&=(~BIT(7));
			}
			else
			{
			    lcd_invter&=(~BIT(0));
			}
		    if ((lcd_asc<0x20)||(lcd_asc>=0x80))
		    {
		        lcd_asc=0x20;
		    }
		    lcd_asc=lcd_asc-0x20;
		    for (lcd_asc_column=0;lcd_asc_column<=0x04;lcd_asc_column++)	  //显示的5列的循环
		    {
		        asc_rdp=&asc[lcd_asc][lcd_asc_column];		  //取出当前字符的每列内容
		        lcd_buffer1=*asc_rdp;						  //要写入lcd的数据放入lcd_buffer1中
	            if(lcd_invter&BIT(0))
			    {
				    lcd_buffer1=~lcd_buffer1;
			    }
				lcd_wr1_data(lcd_buffer1);			  			
		    }
		    if(lcd_invter&BIT(0))
		    {
				   lcd_wr1_data(0xff);
			}
			else
			{
				   lcd_wr1_data(0x00);
			}
	   	}
	    lcd_asc=*lcd_display_rdp;					          //要显示的字符ASC码放在lcd_asc中		


	    lcd_display_rdp++;
	    if (lcd_asc&BIT(7))
		{
			lcd_invter|=BIT(0);
			lcd_asc&=(~BIT(7));
		}
	    else
		{
			lcd_invter&=(~BIT(0));

⌨️ 快捷键说明

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