200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > 51单片机-串行口通信实验

51单片机-串行口通信实验

时间:2018-09-16 02:11:56

相关推荐

51单片机-串行口通信实验

实验要求:

实现以下功能:串口调试助手向单片机发送控制码,单片机向PC回送控制码,0:熄灭;1:LED从上往下循环;2:LED从下往上循环;3:LED闪烁;4:蜂鸣器响

电路设计:

USB供电及自动下载原理图

串口转USB以及蜂鸣器原理图

软件代码:

方案一:

#include<8052.h>__sfr __at (0xE8) P4;__sbit __at (0xEC) P4_4;#define LSA P1_5#define LSB P1_6#define LSC P1_7#define BUZZ P4_4 /*LED初始化*/void LedInit(){LSA = 0;LSB = 0;LSC = 0;P0 = 0xff;}/*延迟函数*/void Delayms(unsigned int xms){unsigned int i,j;for (i = xms;i > 0;i--){for (j = 110;j > 0;j--);}} /*LED从上向下循环3次*/void Up2Down(int x){int i, j;unsigned char sel=0xfe;for(i=0;i<x;i++){for(j=0;j<8;j++){P0 = sel;Delayms(250);sel =sel<<1; }sel=0xfe;}}/*LED从下往上循环3次*/void Down2Up(int x){int i, j;unsigned char sel=0x7f;for(i=0;i<x;i++){for(j=0;j<8;j++){P0 = sel;Delayms(250);sel=sel>>1; }sel=0x7f;}}/*LED闪烁*/void Led_Shan(int x){unsigned int i;for (i = 0;i < x;i++){P0 = 0xff;Delayms(500);P0 = 0x00;Delayms(500);}P0 = 0xff;}void Buzz(){BUZZ=0;Delayms(1000);BUZZ=1;Delayms(1000);}void ConfigUART(unsigned int baud)//UART波特率初始化{SCON = 0x50;//串口工作方式1TMOD &= 0x0F;TMOD |= 0x20;TH1 = 256 - (11059200/12/32)/baud;TL1 = TH1;ET1 = 0;ES = 1;TR1 =1;}void InterruptUART(void) __interrupt 4 //串口中断{unsigned char temp;if (RI==1){//串口接收RI = 0;temp = SBUF;if ((temp == '0')||(temp == '1')||(temp == '2')||(temp == '3')||(temp == '4')){TI = 1;}}if (TI==1){//串口发送TI = 0;SBUF = temp;while(TI == 0);if (temp == '0') {P0 = 0xff;}if (temp == '1') {Up2Down(3);}if (temp == '2') {Down2Up(3);}if (temp == '3'){Led_Shan(3);}if (temp == '4') {Buzz();}TI = 0;}}void main(){EA = 1;//开启总中断ConfigUART(9600);//波特率设为9600LedInit(); //LED初始化while(1);}

方案二:

#include <reg52.h>#include <intrins.h>sbit LSA = P2^2;sbit LSB = P2^3;sbit LSC = P2^4;sbit beep= P1^5;void U2D(unsigned int xms,unsigned char m);void D2U(unsigned int xms,unsigned char m);void delayms(unsigned int xms);void Shinning(unsigned int xms,unsigned char m);void ConfigUART(unsigned int baud);void delayms(unsigned int xms) {unsigned int i,j;for(i=0;i<xms;i++){for(j = 0;j<110;j++);}}void U2D(unsigned int xms,unsigned char m){unsigned char i,j,temp;temp = 0x7f; for(i=0;i<m;i++){for(j=0;j<8;j++){P0 = temp;delayms(xms);temp = _cror_(temp,1);}}}void D2U(unsigned int xms,unsigned char m){unsigned char i,j,temp;temp = 0xfe; for(i=0;i<m;i++){for(j=0;j<8;j++){P0 = temp;delayms(xms);temp = _crol_(temp,1);}}}void Shinning(unsigned int xms,unsigned char m){unsigned char i; for(i=0;i<m;i++){P0 = 0x00;delayms(xms);P0=0xff;delayms(xms); }}void ConfigUART(void);unsigned char Rdata;unsigned char Tdata;void main(void){LSA=LSB=LSC=0;ConfigUART(9600);while(1);}void ConfigUART(unsigned int baud){SCON=0x50; TMOD=TMOD&0x0f;TMOD=TMOD|0x20;TH1=TL1=256-(11059200/12/32)/baud;EA=1;ES=1;ET1=0;TR1=1;}void UARTINIT(void) interrupt 4{if(RI){RI=0;Rdata=SBUF; Tdata=Rdata+1;SBUF=Tdata; while(!TI);TI=0;switch(Rdata){case 0:P0=0xff;break;case 1:U2D(100,1);break;case 2:D2U(100,1);break;case 3:Shinning(100,1);break;case 4:beep=0;delayms(500);beep=1;break;default: P0=0xff;beep=1;break;}}}

程序改进:修改程序,能把串口接收到控制码显示到数码管上。

数码管接口电路原理图

方案一:

#include<8052.h>__sfr __at (0xE8) P4;__sbit __at (0xEC) P4_4;#define LSA P1_5#define LSB P1_6#define LSC P1_7#define BUZZ P4_4 unsigned char smg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};/*LED初始化*/void LedInit(){LSA = 0;LSB = 0;LSC = 0;P0 = 0xff;}/*延迟函数*/void Delayms(unsigned int xms){unsigned int i,j;for (i = xms;i > 0;i--){for (j = 110;j > 0;j--);}} /*LED从上向下循环3次*/void Up2Down(int x){int i, j;unsigned char sel=0xfe;for(i=0;i<x;i++){for(j=0;j<8;j++){P0 = sel;Delayms(250);sel =sel<<1; }sel=0xfe;}}/*LED从下往上循环3次*/void Down2Up(int x){int i, j;unsigned char sel=0x7f;for(i=0;i<x;i++){for(j=0;j<8;j++){P0 = sel;Delayms(250);sel=sel>>1; }sel=0x7f;}}/*LED闪烁*/void LedShan(int x){unsigned int i;for (i = 0;i < x;i++){P0 = 0xff;Delayms(500);P0 = 0x00;Delayms(500);}P0 = 0xff;}void Buzz(){BUZZ=0;Delayms(1000);BUZZ=1;Delayms(1000);}void ConfigUART(unsigned int baud)//UART波特率初始化{SCON = 0x50;//串口工作方式1TMOD &= 0x0F;TMOD |= 0x20;TH1 = 256 - (11059200/12/32)/baud;TL1 = TH1;ET1 = 0;ES = 1;TR1 =1;}void SMG(int x){LSA=1;LSB=0;LSC=0;P0=smg[x];}void InterruptUART(void) __interrupt 4 //串口中断{unsigned char temp;if (RI==1){//串口接收RI = 0;temp = SBUF;if ((temp == '0')||(temp == '1')||(temp == '2')||(temp == '3')||(temp == '4')){TI = 1;}}if (TI==1){//串口发送TI = 0;SBUF = temp;while(TI == 0);LSA = 0;LSB = 0;LSC = 0;if (temp == '0'){P0 = 0xff;SMG(0);}if (temp == '1') {Up2Down(3);SMG(1);}if (temp == '2') {Down2Up(3);SMG(2);}if (temp == '3') {LedShan(3);SMG(3);}if (temp == '4') {Buzz();SMG(4);}TI = 0;}}void main(){EA = 1; //开启总中断ConfigUART(9600);//波特率设为9600LedInit(); //LED初始化while(1);}

方案二:

#include <reg52.h>#include <STC89C52RC.h>#include <intrins.h>#include <led.h>void ConfigUART(unsigned int baud);void delay(unsigned int xms);unsigned char code smg[]={0xc0,0xf9,0xa4,0xb0,0x99};unsigned char temp;void main(){LSA=LSB=LSC=0;EA=1;ConfigUART(9600);while(1){if(temp==0){LedScan(0,smg[0]);}else if(temp==1){LedScan(0,smg[1]);}else if(temp==2){LedScan(0,smg[2]);}else if(temp==3){LedScan(0,smg[3]);}else if(temp==4){LedScan(0,smg[4]);}}}void ConfigUART(unsigned int baud){SCON=0x50;TMOD&=0x0F;TMOD|=0x20;TH1=256-(11059200/12/32)/baud;TL1=TH1;ET1=0;ES=1;TR1=1;void interruptUART(void) interrupt 4{if(RI){RI=0;temp=SBUF;SBUF=temp;}if(TI){TI=0;}}void delay(unsigned int xms){unsigned char m,n;for(m=0;m<xms;m++){for(n=0;n<110;n++);}}

STC89C52RC.h#ifndef _STC89C52RC_H_#define _STC89C52RC_H_sfrAUXR=0X8E;sfrAUXR1=0XA2;sfrIPH=0xb7;sfrXICON=0XC0;sfrP4=0xE8;sbit P44=P4^4;sbitP43=P4^3;sbitP42=P4^2;sbitP41=P4^1;sbitP40=P4^0;#endif

led.cvoid LedScan(unsigned char pos,unsigned char dispCode){switch(pos) {case 0:LSA=1;LSB=0;LSC=0;break; case 1:LSA=0;LSB=1;LSC=0;break; }P0=dispCode;delay(1);P0=0xff;LSA=1;LSB=1;LSC=1;}

led.h#ifndef __LED_H_#define __LED_H_#include<reg52.h>sbit LSA=P1^5;sbit LSB=P1^6;sbit LSC=P1^7;void LedScan(unsigned char pos, unsigned char dispCode);void delay(unsigned int xms);#endif

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。