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

📄 init._c

📁 本设计以ATMEL公司生产的AT90S8515作为控制核心
💻 _C
字号:
// init.c
// 

#include <io8515v.h>
#include <macros.h>
#include "1602LCD.h"
#include "PID.h"
#include "main.h"

// ADC寄存器
#define ADCCR (*(volatile unsigned char *) 0x4000)      // ADC控制器
#define ADCH  (*(volatile unsigned char *) 0x4001)      // 高4位寄存器
#define ADCL  (*(volatile unsigned char *) 0x4000)      // 低8位寄存器
// DAC寄存器
#define DAC1  (*(volatile unsigned char *) 0x8000)      // 通道1      
#define DAC2  (*(volatile unsigned char *) 0x8001) 		// 通道2
#define DAC3  (*(volatile unsigned char *) 0x8002)		// 通道3
#define DAC4  (*(volatile unsigned char *) 0x8003)		// 通道4
#define DACEN (*(volatile unsigned char *) 0xc000)      // 转换开始

//#define K0    32.76    // DAC转换系数
//#define K1    2.01      // ADC转换系数

// 端口初始化
void port_init(void)
{
    PORTA = 0xFF;
 	DDRA  = 0x00;
 	PORTB = 0xFF;
 	DDRB  = 0xFE;
 	PORTC = 0xFF;
 	DDRC  = 0x00;
 	PORTD = 0xFF;
 	DDRD  = 0x04; 
}
// TIMER0初始化 
void timer0_init(void)
{
    TCCR0 = 0x00; //stop timer
 	TCNT0 = 0xD9; //set count value
 	TCCR0 = 0x05; //start timer
}
// TIMER1初始化
void timer1_init(void)
{
 TCCR1A = 0x00;
 TCCR1B = 0x00; //stop
 OCR1AH = 0x07;
 OCR1AL = 0xD0;
 OCR1BH = 0x07;
 OCR1BL = 0xD0;
 TCNT1H = 0xF8; //setup
 TCNT1L = 0x30;
 TCCR1B = 0x02; //start Timer
}
// 数据格式转换
void data_init(unsigned int data)
{
    int i;

	for(i=4;i>=0;i--)
	{
		value_table[i]=data%10;
        data/=10; 
	}
}

// 初始化
void init_devices(void)
{
	CLI();
 	port_init();
 	timer0_init();
	timer1_init();
	LCD_init();
	
 	MCUCR = 0xC2;                          // 外部SRAM访问
 	GIMSK = 0x40;                          // INT0中断
 	TIMSK = 0x82;                          // T/C0、T/C1中断
	
	ADCCR=0x60;                            // 开启ADC 
	ADCCR=0x40;                               
		
	DAC1=0;                                // 开启DAC通道1 
	DAC2=0;                                // 开启DAC通道2 
	DAC3=0;                                // 开启DAC通道3 
	DAC4=DAC4_value;                       // 开启DAC通道4 
	DACEN=0;                                 

	LCD_write_string(0,0,"O:0020 R:0000 mA");
    LCD_write_string(0,1,"     ^ +/-ing...");
	value=20;
	ADC_GD=20*K1;
	DAC=7882;
	SEI();
}
// 读取ADC转换值 启动AD在PID运算后
#pragma interrupt_handler int0_isr:2
void int0_isr(void)
{
 	unsigned int ii;
	unsigned int jj;
 //external interupt on INT0
    ii=ADCL;
	delay_nus(1);
    jj=ADCH;
	ADC=jj;
	ADC<<=8;
	ADC|=ii;
	arv_ADC+=(unsigned long)ADC;
	arv_count++;
}

// 1s显示一次数据
#pragma interrupt_handler timer0_ovf_isr:8
void timer0_ovf_isr(void)
{
	TCNT0 = 0xD9; //reload counter value
	time_count++;
	if(time_count==100)
	{
	 	time_count=0;
	    LCD_display(9,0,4,arv_ADC/arv_count/K1);
		arv_ADC=0;
		arv_count=0;
	}
}
// 0.01s采集并发送控制数值
#pragma interrupt_handler timer1_ovf_isr:7
void timer1_ovf_isr(void)
{
	long iii;
	unsigned int  ii;
	float	 jj;
	
	TCNT1H=Time1>>8;
	TCNT1L=Time1&0xff;
//	PID函数
	PID(ADC-ADC_GD);                         
	DAC3=DAC>>8;                      // 写DAC3寄存器
	DAC2=DAC&0x0FF;						   // 写DAC4寄存器
	DACEN=0;                                   // 开始DA转换
	
	ADCCR=0x60;                                // 启动ADC
	ADCCR=0x40;    
}

⌨️ 快捷键说明

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