📄 usart64.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 + -