#include <io.h>
#include <iom128.h>
#include <interrupt.h>
#define uint unsigned int
#define uchar unsigned char
#define H_VAL_DISP_DDR DDRD
#define L_VAL_DISP_DDR DDRB
#define H_VAL_DISP_PORT PORTD
#define L_VAL_DISP_PORT PORTB
#define TIMEER0_VALUE 0x11
#define CONST_T1H 0xfc
#define CONST_T1L 0xf1
const uchar ADEnStatus[8] = {0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};
uchar AdcMux; //ADC通道
uint AdcVal; //ADC转换值
/*--------------------------------------------------------------------
程序名称:Delay延时函数
程序功能:
注意事项:
提示说明:
输 入:
返 回:
--------------------------------------------------------------------*/
void Delay(unsigned int count)
{
while(count--);
}
/*--------------------------------------------------------------------
程序名称:AD转换初始化程序
程序功能:
注意事项:
提示说明:
输 入:
返 回:
--------------------------------------------------------------------*/
void AdcInit()
{
/*设置对应的IO口为输入高阻态*/
DDRA &= ADEnStatus[AdcMux];
PORTA &= ADEnStatus[AdcMux];
ADCSRA = 0x00; //关ADC
ADMUX = (1<<REFS1)|(1<<REFS0)|(AdcMux&0x0F); //参考电压内部2.56V,select adc input channel
//ADMUX = (AdcMux&0x0F); //参考电压外部AREF,select adc input channel
ACSR = (1<<ACD); //close analog comparator
ADCSRA = (1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1);//非连续转换模式
//ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADFR)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1);//连续转换模式
}
/*--------------------------------------------------------------------
程序名称:UART初始化程序
程序功能:初始化UART为:8位,9.6K,接收中断
注意事项:基于4M晶振
提示说明:晶振不要买到假的,要不然,调不出来还以为电脑有鬼!
输 入:
返 回:
--------------------------------------------------------------------*/
void Uart0Init(void)
{
UCSR0B = 0x00; //disable while setting baud rate
UCSR0A = 0x00; //U2X = 0,不加倍数率
UCSR0C = 0x86; //8位
UBRR0L = 25; //set baud rate lo,波特率为9.6K@4MHz
UBRR0H = 0x00; //set baud rate hi
UCSR0B = 0x58; //发送中断允许,接收缓冲自动清空,接收允许
UCSR0B=(1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0); //0x98接受使能、发送使能、接受中断使能
UBRR0L=25;
UBRR0H=0x00;
UCSR0C=(1<<UCSZ01)|(1<<UCSZ00); //0x06设定数据位为8位
UCSR0B=0x98 ; //允许发送和接收,接收结束中断使能
}
/*--------------------------------------------------------------------
程序名称:timer0初始化
程序功能:
注意事项:
提示说明:
输 入:
返 回:
--------------------------------------------------------------------*/
void Timer0Init(void)
{
TCCR0 = 0;
ASSR = 0;
TCNT0 = TIMEER0_VALUE;
OCR0 = 0;
TCCR0 = 0x06;//256分频
//TIMSK |= 0x01;//允许TIMER0溢出中断
TIMSK &= 0xFE;//不允许TIMER0溢出中断
}
/*--------------------------------------------------------------------
程序名称:timer1初始化
程序功能:
注意事项:
提示说明:
输 入:
返 回:
--------------------------------------------------------------------*/
void Timer1Init(void)
{
TCCR1A = 0;
TCCR1B=0;//停止T1
TCNT1H =CONST_T1H;//800ms@1MHz
TCNT1L =CONST_T1L;//800ms@1MHz
TCCR1B = 0x05;//启动T1,并置1024预分频
TIMSK |= 0x04;//使能T1定时器溢出中断
}
/*--------------------------------------------------------------------
程序名称:发送字符程序
程序功能:
注意事项:
提示说明:
输 入:
返 回:
--------------------------------------------------------------------*/
void usart0_transmit(unsigned char data)
{
while(!(UCSR0A&(1<<UDRE0)));
UDR0=data;
}
/*--------------------------------------------------------------------
程序名称:UART发送中断服务程序
程序功能:
注意事项:
提示说明:
输 入:
返 回:
--------------------------------------------------------------------*/
ISR(SIG_USART0_TRANS)
{
}
ISR(SIG_USART0_RECV)
{
}
/*--------------------------------------------------------------------
程序名称:AD转换中断服务程序
程序功能:
注意事项:
提示说明:
输 入:
返 回:
--------------------------------------------------------------------*/
ISR(SIG_ADC)
{
ADCSRA = 0x00;//关AD
AdcVal = ADC;
usart0_transmit(AdcVal); //发送一个字节
PORTB = ~PORTB;
}
/*--------------------------------------------------------------------
程序名称:TIMER0中断服务程序
程序功能:
注意事项:
提示说明:
输 入:
返 回:
--------------------------------------------------------------------*/
ISR(SIG_OVERFLOW0)
{
TCNT0 = TIMEER0_VALUE;
}
/*--------------------------------------------------------------------
程序名称:TIMER0中断服务程序
程序功能:
注意事项:
提示说明:
输 入:
返 回:
--------------------------------------------------------------------*/
ISR(SIG_OVERFLOW1)
{
TCNT1H =CONST_T1H;//800ms@1MHz
TCNT1L =CONST_T1L;//800ms@1MHz
//ADCSRA = (1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1);//启动AD转换
ADCSRA = (1<<ADEN)|(1<<ADSC)|(1<<ADIE);
}
/*--------------------------------------------------------------------
程序名称:
程序功能:
注意事项:
提示说明:
输 入:
返 回:
--------------------------------------------------------------------*/
int main(void)
{
H_VAL_DISP_DDR = 0xFF;
L_VAL_DISP_DDR = 0xFF;
PORTE = 0xFF; //设置RXD0和TXD0
DDRE = 0x02;
DDRB = 0XFF;
PORTB = 0XFF;
AdcMux = 0; //使用ADC通道0
AdcInit();
Uart0Init();
Timer0Init();
Timer1Init();
sei();
while(1)
{
}
}