这一次我们将上一讲的代码作为基础,要实现的任务就是电脑端发送过来的字符串单片机把它们显示在液晶屏上,由于液晶屏只能显示ASCII码的字符,无法显示汉字,所以电脑端发送过来的字符串也必须是英文输入法下打出的字符。
当单片机接收完字符串之后液晶屏显示“Reception Complete!”表示接收完成,持续一秒之后,蜂鸣器响一下,然后把接收到的字符串显示在液晶屏上,发送过来的字符串的字符数不能超过32个,因为液晶屏的显示范围只有32个格。
#include <reg52.h> #include <function.h> //详见第六章第8讲 #include <lcd.h> //详见第十一章第3讲 #include <uart.h> //详见第十章第4讲 u8 uart_i=0; u8 pdata RXDBUF[64]; void COUNT_TIMES() { TMOD&=0xF0; //清0低四位 TMOD|=0x01; //设置定时器0为工作模式1 } void main() { u8 x; u16 n,j; //用来实现蜂鸣器鸣叫定义的变量 EA = 1; //闭合总中断开关 COUNT_TIMES(); //初始化计数器 ConfigUART(9600); InitLcd1602(); //初始化液晶屏 while(1) { if(TH0>=200) //判断是否把数据接收完毕 { TR0=0; //关闭定时器,停止计时 LcdFullClear(); //整屏清除 LcdShowStr(3, 0, "Reception"); //显示“接收完成”的英文字幕 LcdShowStr(3, 1, "Complete!"); while(uart_i<32) //液晶屏能显示的有32个字符,尽管接收到的字符串没有32个字节也要把RXDBUF数组的前32个元素补充空格字符的字节,避免液晶屏显示乱码 { RXDBUF[uart_i]=' '; //增加空格 uart_i++; } TH0=0; //清零定时器的寄存器,下次再从0开始计时 TL0=0; delay_ms(1000); //停顿1秒 for(j=0;j<1000;j++) //蜂鸣器鸣叫一下 { BEEP=!BEEP; for(n=0;n<25;n++); //延时接近0.125ms,给P1.6保持了0.125ms高电平时间 } LcdFullClear(); //整屏清除 LcdShowStr_len(0, 0,RXDBUF, 16); //显示前16个字符 LcdShowStr_len(0, 1,RXDBUF+16, 16); //显示后16个字符 uart_i=0; //uart_i归0是为了下次接收新的字符串是从RXDBUF[0]开始存取数据 for(x=0;x<32;x++)RXDBUF[x]=0x00; //内存区全部清除数据,统一改为0x00以便下次接收新的字符串 } } } void InterruptUART() interrupt 4 { if (RI) //接收到字节 { RI = 0; TH0=0;//每接收到一个字节数据就清0寄存器的值,定时时间又是从0开始计时,直到TH0大于等于200的时候, TL0=0;//时间超过50ms,也就是没有再接收到数据,因为接收到数据都会进入“if (RI)”把TH0和TL0清0,TH0大于等于200, //超出了等待时间,证明后面没有数据发送过来了 TR0=1;//接收到第一个数据就打开定时器开始计时,后面接收到第二,第三个数据照样打开定时器计时,直到在主函数里面被关闭为止 RXDBUF[uart_i]=SBUF; //接收一个字节数据 uart_i++; //RXDBUF从0号元素不停往下存取数据 } }
下载完程序进去时会有蜂鸣器响一下,大家复位一下开发板就可以了,这是因为我们下载程序进去也是通过串口下进去的,所以会触发程序里的接收完成部分的代码而使蜂鸣器鸣叫一声。
我们试着发送一下这个字符串“LcdShowStr_len(0, 0,RXDBUF, 16);”给单片机,看看液晶屏有什么显示
本文固定URL:https://www.dotcpp.com/course/405
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程