绍兴seo网站推广,丰泽区住房和城乡建设局投诉网站,wordpress代刷网,网站标题logo怎么做的实现目标
1、巩固UART知识#xff1b;
2、掌握串口接收字符数据#xff1b;
3、具体实现目标#xff1a;#xff08;1#xff09;上位机串口助手发送多字符命令#xff0c;单片机接收命令作相应的处理#xff08;如#xff1a;openled1 即打开LED1;closeled1 即关…实现目标
1、巩固UART知识
2、掌握串口接收字符数据
3、具体实现目标1上位机串口助手发送多字符命令单片机接收命令作相应的处理如openled1 即打开LED1;closeled1 即关闭LED1; 一、主要知识点
1.1 字符串定义
字符串是由字母、数字、下划线和空格等各种字符组成的一串字符是一个常量。由一对双引号括起来。字符串的末尾都默认有一个\0的结束符。 C语言存储字符其实是存储字符所对应的ASCII码因此字符可以以%c或者%d输出均可以需要作为常识记住的是字符0对应的ASCII码为48字符A对应的ASCII码为65字符Z对应的ASCII码为90字符a对应的ASCII码为97字符z对应的ASCII码为122; 字符类型char占用1个字节。 用来存放字符的数组称为字符数组字符数组实际上是一系列字符的集合也就是字符串C语言通常有两种表示字符串的方法
第一种定义一个字符数组char str[]abcd; 第二种字符串指针; const char * strhello; 这种方式不可通过对字符指针解引用进行修改字符串因为字符串常量不可修改 这二者都是使用字符串常量对其进行初始化从指针角度理解本质一样不论是字符数组还是字符指针str都代表字符串首字符的起始地址。区别在于字符数组名为常量常量不可以作左值字符指针是变量但是字符指针不可以进行解引用再修改值。
获取字符串的长度
方法一sizeof()运算符
方法二strlen()函数 求字符串“abcd”的长度 int str[]{abcd} int len1sizeof(str)/sizeof(str[0); int len2strlen(str); 解析结果len15;len24; sizeof 和strlen总结
①sizeof是运算符strlen是库函数包含在string.h头文件中
②sizeof功能是获得所建立对象的字节大小strlen函数是获得字符串所占内存的有效字节数
③sizeof运算符的参数可以是数组、指针、对象、函数等strlen函数的参数必须是以\0结尾的字符串的指针
④sizeof运算符计算大小在编译时就完成因此不能用来计算动态分配内存大小strlen函数结果要在运行时才能计算出来。 1.2 strstr 函数应用
(1) 头文件
#include string.h
(2) 函数原型
char *strstr(const char *haystack, const char *needle);
(3) 函数作用
1、strstr() 函数搜索一个字符串在另一个字符串中的第一次出现。
2、找到所搜索的字符串则该函数返回第一次匹配的字符串的地址
3、如果未找到所搜索的字符串则返回NULL。情景一
用于单次匹配 返回的是匹配成功的字符串以及后面的字符串
#include stdio.h
#include string.h
main()
{char *sGoldenGlobalView;char *llob;char *p;pstrstr(s,l);if(p)printf(%s,p);elseprintf(NotFound!);return 0;
}二、原理图设计
STC89C52RC/RD系列单片机串行口对应的硬件部分对应的管脚是P3.0/RxD和P3.1/TxD。 三、程序设计
3.1单片机接收上位机PC的命令
参数波特率9600 SMOD为0波特率不加倍定时器1工作模式28位自动重装。
具体功能发字符 a,开启LED1; 发字符 b,关闭LED1;
#include REGX52.H#define FOSC 11059200L //System frequency
#define BAUD 9600 //UART baudratesbit LED1 P2^0;int cmd 0;//命令
bit flag 0;void Uart_send(unsigned char dat);
void Uart_send_str(unsigned char *p);
void Delay500ms();void main()
{PCON 0x7F; //波特率不倍速SCON 0x50; //8-bit variable UARTTMOD 0x20;//0010 0000 //Set Timer1 as 8-bit auto reload modeTH1 TL1 -(FOSC/12/32/BAUD); //Set auto-reload vauleTR1 1; //Timer1 start runES 1; //Enable UART interruptEA 1; //Open master interrupt switchwhile(1){if(flag 1)//查询是否接收一字节的命令{flag 0;//标志位清零0if(cmd a){LED1 0;Uart_send(cmd);}else if(cmd b){LED1 1;Uart_send(cmd);} }}
}
void Uart_send(unsigned char dat)
{SBUF dat;while(!TI);TI 0;
}void Uart_send_str(unsigned char *p)
{while(*p!\0){Uart_send(*p); p; }
}void Uart_Isr() interrupt 4
{if (RI 1){RI 0; //Clear receive interrupt flag flag 1;cmd SBUF; }
}void Delay500ms() //11.0592MHz
{unsigned char i, j, k;i 4;j 129;k 119;do{do{while (--k);} while (--j);} while (--i);
}
3.2 字符串命令控制LED
具体功能发字符串open,开启LED1; 发字符串close,关闭LED1;
#include REGX52.H
#include stdio.h
#include string.h #define FOSC 11059200L //System frequency
#define BAUD 9600 //UART baudratesbit LED1 P2^0; typedef struct
{unsigned char buff[32]; //用于存放接收到的字符串unsigned char flag; //接收完成中断标志位unsigned char len; //用于偏移字符串指针,可以理解为长度,如果buff设得很长,对应这里需要改成u16
}REC;REC UART_rec{0}; //初始化结构体
const char *substr1 open;
const char *substr2 close; void Uart_send(unsigned char dat);
void Uart_send_str(unsigned char *p);
void Delay500ms();void main()
{PCON 0x7F; //波特率不倍速SCON 0x50; //8-bit variable UARTTMOD 0x20;//0010 0000 //Set Timer1 as 8-bit auto reload modeTH1 TL1 -(FOSC/12/32/BAUD); //Set auto-reload vauleTR1 1; //Timer1 start runES 1; //Enable UART interruptTI 1; EA 1; //Open master interrupt switchwhile(1){if(UART_rec.flag 1)//若接收完成{if (strstr(UART_rec.buff,substr1)! NULL){printf(开启LED1\n); LED1 0; }else if(strstr(UART_rec.buff,substr2)! NULL){printf(关闭LED1\n); LED1 1; }// printf(接收到了:%s\r\n,UART_rec.buff);UART_rec.flag 0; //接收标志位清零,准备接收下一字符串 }}
}void Uart_send(unsigned char dat)
{SBUF dat;while(!TI);TI 0;
}void Uart_send_str(unsigned char *p)
{while(*p!\0){Uart_send(*p); p; }
}void Uart_Isr() interrupt 4
{unsigned char temp 0; if (RI 1){ RI 0; //清除接收中断标志 temp SBUF; if(temp\r||temp\n||UART_rec.len 32) {UART_rec.buff[UART_rec.len]\0;UART_rec.flag 1 ; //数据包接收完成标志UART_rec.len0; //为下一个数据包做准备}else{UART_rec.buff[UART_rec.len] temp;}}
}void Delay500ms() //11.0592MHz
{unsigned char i, j, k;i 4;j 129;k 119;do{do{while (--k);} while (--j);} while (--i);
} 四、实验效果 五、仿真实现
5.1单片机接收的字符命令仿真 总结