📄 m8外部中断0测试.c
字号:
/************ATMEGA8-ADC测试*************************/
/*******特别注意:经常碰到提示错误:不稳定的语法,是因为函数或变量名字起的和库函数重复了。所以,尽量加上自己的标志*********/
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <avr/delay.h>
/***************************************************/
#define uchar unsigned char
#define uint unsigned int
/***************************************************/
void uart();
void sendstr(uchar *s);
void send_UART(uchar uart_data);
void port_init();
/***************************************************/
void delayms(uint k);
/**************************************************/
void int0_init();
/**************************************************/
int main()
{
port_init();
uart();
delayms(2000);
sendstr("ATMEGA8-INT0-TEST!!");
delayms(3000);
int0_init();
while(1)
{
delayms(300);
PORTD|=(1<<PD7)|(1<<PD6);
sendstr("sleep stoping!!");
delayms(1400);
PORTD|=~(1<<PD7)|(1<<PD6);
}
}
/***************************************************/
void port_init()
{
DDRD= 0XFF;
PORTD=0x0F;
DDRD=(1<<1);//串口的输出
}
/***************************************************/
void int0_init()
{
/* 置位WDCE 和 WDE */
WDTCR |= (1<<WDCE) | (1<<WDE); //关闭看门狗,必须这两个步骤
/* 关闭WDT */
WDTCR = 0x00;
MCUCR=(0<<ISC01);//外部中断0低电平触发中断
GICR=1<<INT0 ;
sei(); //使能全局中断
MCUCR|=1<<SM1; //进入掉电模式
MCUCR|=(1<<SE); //休眠使能
asm("SLEEP");
}
/******************发送数据到串口*****************/
void send_UART(uchar uart_data)
{
while (!(UCSRA&(1<<UDRE)));
UDR=uart_data;
while (!(UCSRA&(1<<UDRE)));
UDR=0x0a; //回车换行
while (!(UCSRA&(1<<UDRE)));
UDR=0x0d;
}
/************************************************/
void uart() //特别注意写UCSRC时,要把最高位置1,否则写不进去
{
UCSRB = 0x00; //先不使能发送接收
UCSRA = 0x00; //Bit1为1则倍速发送,这里不倍速
UCSRC = 0x86; //8位数据格式,异步方式,URSEL=1时,写UCSRC寄存器
UBRRL = 25; //波特率:9600 Bps 8MHZ时钟 51 1MHZ 6 2MHZ 12 4MHZ 25
UBRRH = 0x00; //误差率:0.156%
UCSRB = 0x98; //使能发送接收,使能接收中断
}
/*************串口接收***********************/
unsigned char Getchar(void)
{
while(!(UCSRA& (1<<RXC)));
return UDR;
}
/********************************************/
void sendstr(uchar *s)
{
while (*s)
{
while (!(UCSRA&(1<<UDRE)));
UDR=*s;
s++;
}
while (!(UCSRA&(1<<UDRE)));
UDR=0x0a; //回车换行
while (!(UCSRA&(1<<UDRE)));
UDR=0x0d;
}
/***********************************************/
SIGNAL(SIG_INTERRUPT0)
{
MCUCR=(0<<ISC01);//外部中断0低电平触发中断,退出休眠模式
sendstr("INT0 ceshi ok!!");
delayms(700);
int0_init();
}
/***********************************************/
void delayms(uint k)
{
uint i,j;
for(i=0;i<k;i++)
{
for(j=0;j<100;j++)
{;}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -