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号元素不停往下存取数据   
    }
}

下一讲我们再教大家如何实践操作,代码可以了解了解意思先。

点赞(0)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)