#include #include #include "Io_define.h"unsigned char RX_data[4]={0}; //串口接收的数据unsigned char keyb_state=0;unsigned char keyc_state=0;unsigned char RX_counter=0; //串口接收到的字节数计数器void UART_init (void);void putchar (unsigned char c);void puts (unsigned char *s);void UART_rx (void);void delay_nms (unsigned int n);void Key_control (unsigned char comm);void Read_Pin (void);void putchar(unsigned char c) //字符输出函数 { while (!(UCSRA&(1 << UDRE))); //判断上次发送有没有完成 UDR = c; }#pragma interrupt_handler UART_rx: iv_USART_RXvoid UART_rx(void) //串口接收中断函数 { RX_data[RX_counter] = UDR; if (RX_data[RX_counter]=='s') { RX_data[0]=RX_data[RX_counter]; RX_counter=0; } RX_counter++; //接收的字节数计数 }void puts(unsigned char *s) //字符串发送函数 { while (*s) { putchar(*s); s++; } } void UART_init(void) { UCSRB = BIT(RXCIE)| BIT(RXEN) |BIT(TXEN); //允许串口发送和接收,并响应接收完成中断 UBRR = 51; //时钟8Mhz,波特率9600 UCSRC = BIT(URSEL)|BIT(UCSZ1)|BIT(UCSZ0); //8位数据+1位stop位 } void main(void) { //unsigned char keyb_state=0; //unsigned char keyc_state=0; unsigned char i=0; OSCCAL=0xa3; DDRB = 0B11000111; //初始化继电器控制端口 PORTB = 0B00000000; DDRC = 0B00111111; PORTC = 0B00000000; DDRD = 0B10000000; PORTD = 0B00000000; DDRB |= 0b00111000; //初始化键盘接口,行为低电平 PORTB&= 0b11000111; DDRD &= ~0b01111000; //列为高电平 PORTD|= 0b01111000; DDRD &= ~BIT(2); //设置INT0为输入,高电平状态 PORTD |= BIT(2); GICR |= BIT(INT0); //允许INT0外部低电平中断 UART_init(); SEI(); while (1) { if (RX_counter==4) { RX_counter=0; if (RX_data[3] == 't') //接收到PC机发的状态请求指令,则发送 { //控制板的key状态数据给PC putchar(0); //控制板地址码 delay_nms(10); putchar(keyb_state); delay_nms(10); putchar(keyc_state); delay_nms(10); putchar('t'); //状态数据标志位 delay_nms(10); } else if ((RX_data[0] == 's')&&(RX_data[3] == 'p')) //检验指令格式是否正确 { if ((RX_data[1] == 'u') &&(RX_data[2]=='0'))//是否是软件升级指令 { //puts("upready"); asm("jmp 0xe00"); } else if (RX_data[1]=='0') //地址码是否正确 { Key_control(RX_data[2]); } } } } } void Key_control(unsigned char comm) { CLI(); switch (comm) { case '0': key0 ^= key0_open; break; case '1': key1 ^= key1_open; break; case '2': key2 ^= key2_open; break; case '3': key3 ^= key3_open; break; case '4': key4 ^= key4_open; break; case '5': key5 ^= key5_open; break; case '6': key6 ^= key6_open; break; case '7': key7 ^= key7_open; break; case '8': key8 ^= key8_open; break; case '9': key9 ^= key9_open; break; case ':': key10 ^= key10_open; break; case ';': key11 ^= key11_open; break; case 'a': { PORTB |= 0B11000111; PORTC |= 0B00111111; PORTD |= 0B10000000; } break; case 'b': { PORTB &= 0B00111000; PORTC &= 0B11000000; PORTD &= 0B01111111; } break; } Read_Pin(); putchar(0); //发送控制板地址码和key状态数据 delay_nms(10); putchar(keyb_state); delay_nms(10); putchar(keyc_state); delay_nms(10); putchar('t'); delay_nms(10); SEI(); }void Read_Pin(void) { asm("nop"); keyb_state = ((PINB & 0B11000111)|((PINC & 0B00110000)>>1)| ((PIND & 0B10000000)>>2)); keyc_state = (PINC & 0B00001111); }
导读:目前正在解读《AVR_M8单片机串口控制应用程序》的相关信息,《AVR_M8单片机串口控制应用程序》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《AVR_M8单片机串口控制应用程序》的详细说明。
简介:本文给大家分享了一个AVR_M8单片机串口控制应用程序。
提醒:《AVR_M8单片机串口控制应用程序》最后刷新时间 2024-03-14 00:57:46,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《AVR_M8单片机串口控制应用程序》该内容的真实性请自行鉴别。