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

📄 usart64.c

📁 Mega128 串口中断方式 端口控制。
💻 C
字号:
//---------------------串口通讯程序-------------------
//                                           2008.01
//----------------------------------------------------

//处理器:ATMEGA128或ATMEGA64
//时钟频率:7.3728MHz
//处理器类型和时钟频率请在Configuration Options中设置,或在Makefile中指定

//硬件连接:
//将相关的跳线跳上

//测试时,应该拔掉下载线,避免下载线对串口造成干扰

//测试操作:
//    按KEY1,超级终端显示“您按下了1#键”;
//    按KEY2,超级终端显示“您按下了2#键”;
//    按KEY3,超级终端显示“您按下了3#键”;
//    按KEY4,超级终端显示“您按下了4#键”;
//    按KEY5,超级终端显示“您按下了5#键”;
//    按KEY6,超级终端显示“您按下了6#键”;
//    按KEY7,超级终端显示“您按下了7#键”;
//    按KEY8,超级终端显示“您按下了8#键”。

//    在上位机上,用键盘输入“1”,实验板上L1、L2亮,超级终端显示“您点亮了L1和L2”;
//    在上位机上,用键盘输入“2”,实验板上L3、L4亮,超级终端显示“您点亮了L3和L4”;
//    在上位机上,用键盘输入“3”,实验板上L5、L6亮,超级终端显示“您点亮了L1和L2”;
//    在上位机上,用键盘输入“4”,实验板上L7、L8亮,超级终端显示“您点亮了L3和L4”;
//    在上位机上,用键盘输入“5”,实验板上L1、L2灭,超级终端显示“您熄灭了L1和L2”;
//    在上位机上,用键盘输入“6”,实验板上L3、L4灭,超级终端显示“您熄灭了L3和L4”;
//    在上位机上,用键盘输入“7”,实验板上L5、L6灭,超级终端显示“您熄灭了L5和L6”;
//    在上位机上,用键盘输入“8”,实验板上L7、L8灭,超级终端显示“您熄灭了L7和L8”;
//    在上位机上,用键盘输入“B”,实验板上蜂鸣器响,超级终端显示“蜂鸣器响”;
//    在上位机上,用键盘输入“b”,实验板上蜂鸣器消音,超级终端显示“蜂鸣器消音”;

//按键响应和数据发送采用查询方式实现,数据接收采用中断方式实现。

#include <avr/io.h>
#include <avr/delay.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#include "mega128exb.h"

void putc(unsigned char c);
void puts(unsigned char *s);
void Init_USART0(void);
void Init_PORT(void);

void putc(unsigned char c)									//从串口输出一个字符 
{ 
	while( !(UCSR0A & (1<<UDRE0)) ); 
	UDR0=c; 
} 

void puts(unsigned char *s)									//从串口输出一串字符
{
	while(*s)
	{
		putc(*s);
		s++;
	}
}

unsigned char getc(void) 									//从串口读出一个字符
{ 
	while( !(UCSR0A & (1<<RXC0)) ); 
	return UDR0; 
} 

void Init_USART0(void)										//UART 初始化 
{
	UBRR0H=0; 
	UBRR0L=47;												//波特率9600 

	UCSR0B |= (1<<RXEN)|(1<<TXEN)|(1<<RXCIE);				//RXEN1,TXEN1使能,中断接收,查询方式主动发送
}

void Init_PORT(void)
{
	DDRE = 0b00001111;										//LED和蜂鸣器对应的IO口设置为输出
	PORTE = 0xff;											//LED灭,蜂鸣器消音
	
	DDRA = 0xff;
	PORTA = 0xff;
	DDRB = 0xff;
	PORTB = 0xff;											//按键对应的IO口设置为输入
}

int main(void)
{
	Init_USART0(); 
	Init_PORT();

	sei();

	for(;;)
	{
		if ((PINE | 0b11101111) != 0xff)
		{
			_delay_loop_2(40000);
			if ((PINE | 0b11101111) != 0xff)
			{
				puts("您按下了1#键\n\r");
				while((PINE | 0b11101111) != 0xff){}
				_delay_loop_2(40000);
			}
		}
		else if ((PINE | 0b11011111) != 0xff)
		{
			_delay_loop_2(40000);
			if ((PINE | 0b11011111) != 0xff)
			{
				puts("您按下了2#键\n\r");

				while((PINE | 0b11011111) != 0xff){}
				_delay_loop_2(40000);
			}
		}
		else if ((PINE | 0b10111111) != 0xff)
		{
			_delay_loop_2(40000);
			if ((PINE | 0b10111111) != 0xff)
			{
				puts("您按下了3#键\n\r");
				while((PINE | 0b10111111) != 0xff){}
				_delay_loop_2(40000);
			}
		}
		else if ((PINE | 0b01111111) != 0xff)
		{
			_delay_loop_2(40000);
			if ((PINE | 0b01111111) != 0xff)
			{
				puts("您按下了4#键\n\r");
				while((PINE | 0b01111111) != 0xff){}
				_delay_loop_2(40000);
			}
		}
		else if ((PINC | 0b11111110) != 0xff)
		{
			_delay_loop_2(40000);
			if ((PINC | 0b11111110) != 0xff)
			{
				puts("您按下了5#键\n\r");
				while((PINC | 0b11111110) != 0xff){}
				_delay_loop_2(40000);
			}
		}
		else if ((PINC | 0b11111101) != 0xff)
		{
			_delay_loop_2(40000);
			if ((PINC | 0b11111101) != 0xff)
			{
				puts("您按下了6#键\n\r");
				while((PINC | 0b11111101) != 0xff){}
				_delay_loop_2(40000);
			}
		}
		

	}
	return 0;	
}

SIGNAL(SIG_UART0_RECV)										//串口接收中断服务程序
{
	unsigned char i;
	
	i=getc();
		
	switch(i)
	{
		case '1':	
			L1_On;
			L2_On;
			puts("您点亮了LED1和LED2\n\r");
			break;
		case '2':
			L3_On;
			L4_On;
			puts("您点亮了LED3和LED4\n\r");
			break;
		case '3':
			L5_On;
			L6_On;
			puts("您点亮了LED5和LED6\n\r");
			break;
		case '4':
			L7_On;
			L8_On;
			puts("您点亮了LED7和LED8\n\r");
			break;
		case '5':
			L1_Off;
			L2_Off;
			puts("您熄灭了LED1和LED2\n\r");
			break;
		case '6':
			L3_Off;
			L4_Off;
			puts("您熄灭了LED3和LED4\n\r");
			break;
		case '7':
			L5_Off;
			L6_Off;
			puts("您熄灭了LED5和LED6\n\r");
			break;
		case '8':
			L7_Off;
			L8_Off;
			puts("您熄灭了LED7和LED8\n\r");
			break;
		case 'B':
			BEEP_On;
			puts("蜂鸣器响\n\r");
			break;
		case 'b':
			BEEP_Off;
			puts("蜂鸣器消音\n\r");
			break;
		default:
			puts("您输入的指令无效!\n\r");
			break;
	}
}

⌨️ 快捷键说明

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