1.题目要求
作为本教程最后一个例程,我们也不打算写的太复杂,这次还是运用串口的知识,实现用串口往EEPROM写入数据,同时也能用串口读出EEPROM里的数据出来显示在电脑端的窗口上。根据前几讲的串口与液晶屏的代码理解,这一讲的例程也不难理解。
2.main.c测试代码
#include <reg52.h> #include <function.h> //详见第六章第8讲 #include <uart.h> //详见第十章第4讲 #include <iic.h> //详见第十二章第3讲 u8 uart_i=0; u8 pdata RXDBUF[130]; void COUNT_TIMES() { TMOD&=0xF0; //清0低四位 TMOD|=0x01; //设置定时器0为工作模式1 } void UART_E2Write() { u8 j,k; u8 E2_add; u8 pdata E2BUF[102];//存取从RXDBUF[12]开始后的数据,RXDBUF[0]~RXDBUF[11]是字符串“E2Write:xxx,”(xxx表示地址) if( RXDBUF[0]=='E'&&RXDBUF[1]=='2'&&RXDBUF[2]=='W'&&RXDBUF[3]=='r' &&RXDBUF[4]=='i'&&RXDBUF[5]=='t'&&RXDBUF[6]=='e'&&RXDBUF[7]==':') { E2_add=(RXDBUF[8]-'0')*100+(RXDBUF[9]-'0')*10+(RXDBUF[10]-'0'); //确定要开始写入的地址 k=uart_i-12; //由于uart_i在“InterruptUART()”函数中的最后自加了一次, //所以“k=uart_i-12;”表示的是收到要写入EEPROM的字符串的个数 for(j=0; j<k; j++)E2BUF[j]=RXDBUF[j+12]; //把接收到要写入EEPROM的字符串存储在E2BUF数组中 E2Write(E2BUF,E2_add,k); //把内容写入进EEPROM中 printf_str("\r\n写入完成!\r\n"); printf_str("地址写到了"); printf_num( (u32)E2_add+j-1 ); //打印出此时EEPROM写到了哪个地址位置了,因为要传入的参数为u32类型,所以必须强制转换 printf_rn(); } } void UART_E2Read() { u8 E2_add,n; u8 pdata E2BUF[102];//接收缓冲区,最多能接收50个汉字 if( RXDBUF[0]=='E'&&RXDBUF[1]=='2'&&RXDBUF[2]=='R'&&RXDBUF[3]=='e' &&RXDBUF[4]=='a'&&RXDBUF[5]=='d'&&RXDBUF[6]==':') { E2_add=(RXDBUF[7]-'0')*100+(RXDBUF[8]-'0')*10+(RXDBUF[9]-'0'); //确定要开始读出的地址 n=(RXDBUF[11]-'0')*100+(RXDBUF[12]-'0')*10+(RXDBUF[13]-'0'); //确定要读出的个数 E2Read(E2BUF,E2_add,n); E2BUF[n]='\0'; //添加结束符 printf_str(E2BUF); //打印出从EEPROM读出的数据 } } void main() { u8 x; EA = 1; //闭合总中断开关 COUNT_TIMES(); //初始化计数器 ConfigUART(9600); while(1) { if(TH0>=200) //判断是否把数据接收完毕 { TR0=0; //关闭定时器,停止计时 UART_E2Write(); //查看串口发送来的信息是否满足EEPROM写入数据的命令 UART_E2Read(); //查看串口发送来的信息是否满足EEPROM读出数据的命令 uart_i=0; //uart_i归0是为了下次接收新的字符串是从RXDBUF[0]开始存取数据 TH0=0; //清零定时器的寄存器,下次再从0开始计时 TL0=0; for(x=0;x<64;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号元素不停往下存取数据 } }
下一讲我们再教大家如何实践操作,代码可以了解了解意思先。
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程