📄 system_init._c
字号:
#include <iom8v.h> //和单片机类型相对应的头文件,选择Atmega8做实验;
#include <macros.h>
#include "discharge.h"
#include <stdio.h>
#include "LCD_1602.h"
void init_devices(void)
{
CLI(); //禁止所有中断
MCUCR = 0x00;
MCUCSR = 0x80;//禁止JTAG
GICR = 0x00;
port_init();
usart_init();
timer1_init(10,10,4000);//PWM上限 4000
timer2_init();
AD_init();
LCD_init();
delay_nms(10);
SEI();//开全局中断
}
//端口初始化
void port_init(void)
{
DDRB&=~(1<<0)|(1<<3)|(1<<4)|(1<<5);//KEY 输入
PORTB|=(1<<0)|(1<<3)|(1<<4)|(1<<5);//KEY 开上拉
DDRC|=(1<<4)|(1<<5);//LED_G LED_R
DDRB&=~(1<<1)|(1<<2);//PWMA PWMB 设为输入,即关闭
}
//串口通信初始化
void usart_init(void)
{
UCSRB = 0x00;//禁止中断
UCSRA = 0x00;
UCSRC = BIT(URSEL) | 0x06;
UBRRL = 0x0C;
UBRRH = 0x00;
UCSRB = 0x18;
}
//定时器T2初始化
void timer2_init(void)
{
TCCR2 = 0x00;//停止定时器
ASSR = 0x00;//异步时钟模式
TCNT2 = 0x06;//初始值
OCR2 = 0x05;//匹配值
TIMSK |= 0x40;//中断允许
TCCR2 = 0x06;//启动定时器
}
//定时T1初始化
void timer1_init(unsigned int a,unsigned int b,unsigned int top)
{
TCCR1B = 0x00;//停止定时器
TIMSK |= 0x00;//中断允许
TCNT1H = 0x00;
TCNT1L = 0x00;//初始值
OCR1A=a;//匹配A值
OCR1B=b;//匹配B值
ICR1=top-1;//输入捕捉匹配值
TCCR1A = 0x82;
TCCR1B = 0x19;//启动定时器 无分频
}
/*
//定时器T0初始化
void timer0_init(void)
{
TCCR0 = 0x00;//停止定时器
TCNT0 = 0xFF;//初始值
}
void timer0_start(void)
{
TCNT0 = 0xFF;//初始值
TCCR0 = 0x05;//启动定时器
}
void timer0_stop(void)
{
TCCR0 = 0x00;//停止定时器
LCD_write_number(9,0,0,TCNT0,"us",0);//
}
*/
void AD_init(void)
{
ADCSRA=0X00;
ACSR =(1<<ACD);//关闭模拟比较器
ADMUX =(1<<REFS0)|(1&0x0F); //
ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADPS2)|(1<<ADPS1);//ADC转换 64分频
}
unsigned int read_adc (uchar r,uchar m)
{
unsigned int adc_rel;
ADMUX=0;
ADMUX |=(m&0x0F);//选择通道
ADMUX |=(r<<6);//选择基准
ADCSRA|=(1<<ADSC);//启动AD转换
delay_nus(125);
adc_rel=ADC&0x3FF;
return(adc_rel);
}
void delay_nms(unsigned int n)//延时n毫秒
{
unsigned int i;
for (i=0;i<n;i++)//执行n次1毫秒延时
{delay_nus(1000);}
}
void delay_nus(unsigned int n)//延时N微秒,N>=5 晶振:8MHz
{
unsigned int i;
for (i=5;i<n;i++)
{
asm("nop");
asm("nop");
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -