PC机通过串口控制学习板LED的实验前两月,在阿发的指点下,PC机通过串口控制单片机实验终于成功,特在此共享,供有兴趣的朋友一试。实验环境:本站M16学习板。控制功能简述如下:1、通过学习板上的8个按键S0-S7可在本地控制LD0-LD7指示灯的亮灭,并及时将LED亮灭状态通过串口反馈到PC机,在上位机软件上显示。2、通过点击上位机软件中的LD1-LD8按钮,上位机软件通过串口控制学习板上LD0-LD7指示灯的亮灭,并及时将LED亮灭状态通过串口反馈到PC机,在上位机软件上显示。3、将LED换为继电器即可实现相应电器控制。程序如下:/********************************************AVR单片机串口控制应用程序**主要功能:应用PC机串口控制LED亮灭**日期:2007年04月16日**作者:tonghe**版本:V1.2.0**修改日期:2007年06月12日**主控芯片:Mega16**时钟频率:3.6864MHz**波特率:9600BPS**实验环境:本站M16学习板********************************************/#includeiom16v.h#includemacros.h//宏定义1:定义端口#definekeyPORTB//定义输出控制端口:这里是LED显示,可接继电器输出#definekey0_open(10)//端口0#definekey1_open(11)//端口1#definekey2_open(12)//端口2#definekey3_open(13)//端口3#definekey4_open(14)//端口4#definekey5_open(15)//端口5#definekey6_open(16)//端口6#definekey7_open(17)//端口7#definerd_key(~PINA)//按键接口:本地按键也可控制LED//宏定义2:定义本机地址#defineadd_kz'2'//宏定义3:定义简称#defineucharunsignedchar#defineuintunsignedintstaticucharuart_buff[5];//串口数据接收缓存//staticucharcount;//接收位置计数//ucharkeyb_state=0;ucharkeyc_state=0;ucharRX_counter=0;//串口接收到的字节数计数器ucharflag=0;//延时函数:入口i,需要定时的时长voiddelay_ms(uinti)//在3.6864M时钟下为ims{uintj;for(;i;i--){for(j=527;j;j--){;}}}//字符输出函数:入口c,需输出的字符voidputchar(charc){while(!(UCSRA&(1UDRE)));//判断上次发送有没有完成UDR=c;}/************************************字符串发送函数************************************/voidputs(uchar*s)//字符串发送函数{while(*s){putchar(*s);s++;}putchar('\n');//发送换行符}/************************************串口初始化函数************************************/voidUART_init(void){UCSRA=0x00;//波特率不加倍UCSRB=0b10011000;//允许接收和发送//并允许接收中断UCSRC=BIT(URSEL)|0x06;//8位数据//UBRRH=0x00;UBRRL=23;//3.6864M、9600}/****************************************串口接收中断函数****************************************/#pragmainterrupt_handlerUart1:12//串口接收中断//voidUart1(void){uchartemp;//变量//temp=UDR;switch(count){case0x00://启动字节校对,如果对则开始接收数据//if(uart_buff[4]=='Y'){//判断主程序是否处理完前面的数据//return;}if(temp=='A'){//此处假定启动字节定义为“0x55”//uart_buff[0]=temp;//提取第一个字节//count++;//计数值增加//}break;case0x01:uart_buff[1]=temp;count++;break;case0x02:uart_buff[2]=temp;count++;break;case0x03:if(temp=='D')//数据校验//{uart_buff[3]=temp;uart_buff[4]='Y';//接收正确,设置成功标志,等待主程序处理,只有在主程序处理完后才可以接收新的数据//}count=0x00;//接收完,计数变量清除//break;default://计数位置异常捕获//count=0x00;break;}}程序后半段:/************************************输出状态读取函数************************************/voidRead_state(void){delay_ms(2);keyb_state=~PINB;}/************************************按键读取函数**返回值:按键值************************************/ucharRead_key(void){ucharb='';uchara=0;a=rd_key;delay_ms(20);if(rd_key==a){switch(a){case0x01:b='1';break;case0x02:b='2';break;case0x04:b='3';break;case0x08:b='4';break;case0x10:b='5';break;case0x20:b='6';break;case0x40:b='7';break;case0x80:b='8';break;default:b='';break;}}return(b);}/************************************输出控制函数**入口:comm,控制指令字************************************/voidKey_control(ucharcomm){switch(comm){case'1':key^=key0_open;break;//0号LED开关case'2':key^=key1_open;break;//1号LED开关case'3':key^=key2_open;break;//2号LED开关case'4':key^=key3_open;break;//3号LED开关case'5':key^=key4_open;break;//4号LED开关case'6':key^=key5_open;break;//5号LED开关case'7':key^=key6_open;break;//6号LED开关case'8':key^=key7_open;break;//7号LED开关default:break;}Read_state();putchar('O');delay_ms(10);putchar(add_kz);delay_ms(10);putchar(keyb_state);delay_ms(10);putchar('K');delay_ms(10);uart_buff[4]='';}/************************************主函数************************************/voidmain(void){uchara,i=0;DDRB=0xFF;//初始化LED控制端口PORTB=0xFF;DDRA=0x00;//初始化按键接口PORTA=0xFF;UART_init();SEI();while(1){if(uart_buff[4]=='Y'){CLI();if(uart_buff[1]==add_kz)Key_control(uart_buff[2]);SEI();}if(rd_key!=0){a=Read_key();Key_control(a);while(rd_key!=0)delay_ms(20);}}}完整的程序文件如下:上位机软件采用VB6编程,运行界面如下:[快车下载]: