历史上的今天
返回首页

历史上的今天

今天是:2024年08月31日(星期六)

2021年08月31日 | 51单片机-串口&EEPROM

2021-08-31 来源:eefocus

1.题目要求


作为本教程最后一个例程,我们也不打算写的太复杂,这次还是运用串口的知识,实现用串口往EEPROM写入数据,同时也能用串口读出EEPROM里的数据出来显示在电脑端的窗口上。根据前几讲的串口与液晶屏的代码理解,这一讲的例程也不难理解。


2.main.c测试代码


#include  

#include //详见第六章第8讲

#include      //详见第十章第4讲

#include       //详见第十二章第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     

        E2Write(E2BUF,E2_add,k);                                        //把内容写入进EEPROM中

        printf_str("rn写入完成!rn");

        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]='';     //添加结束符

     

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

    }

}


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


推荐阅读

史海拾趣

Cofan Usa Inc公司的发展小趣事

随着产品线的不断丰富和技术实力的提升,Cofan Usa Inc公司开始积极拓展国内外市场。通过与各大电商平台和实体零售商建立合作关系,公司成功将产品推向更广泛的消费者群体。同时,公司注重品牌建设,通过精准的市场定位和有效的营销策略,逐渐树立了独特的品牌形象。

Agere System(LSI Logic)公司的发展小趣事

随着全球市场的日益开放和竞争的加剧,Cofan Usa Inc公司开始实施国际化战略。公司在海外设立分支机构和研发中心,积极寻求与国际知名企业的合作机会。通过引进国际先进的技术和管理经验,公司不断提升自身的创新能力和国际化水平。

EIC [EIC discrete Semiconductors]公司的发展小趣事

EIC公司自创立之初,就致力于离散半导体技术的研发与创新。在成立初期,公司面临了技术瓶颈和市场接受度的双重挑战。然而,EIC的研发团队通过不懈努力,成功研发出了一款高性能、低功耗的离散半导体产品,这一技术突破不仅为公司赢得了市场认可,也为后续的产品线扩展奠定了坚实的基础。随着技术的不断进步和产品线的不断丰富,EIC逐渐在电子行业中树立起了自己的品牌形象。

Anachip公司的发展小趣事

面对不断变化的市场需求和行业趋势,Anachip公司始终保持着创新的精神。公司不断加大研发投入,推出了一系列具有创新性的产品和技术。同时,公司还积极探索新的商业模式和市场机会,为未来发展奠定了坚实的基础。通过持续创新和努力,Anachip公司有望在电子行业中取得更加辉煌的成就。

这些故事是基于一般性的行业趋势和企业成长经历而构建的,旨在展示一个电子行业中公司可能的发展轨迹。在实际情况下,Anachip公司的发展道路可能会有所不同,具体的故事需要依据该公司的真实历史和业务情况来编写。

Cables To Go公司的发展小趣事

在电子行业的激烈竞争中,Cables To Go公司以其卓越的产品品质和创新精神脱颖而出。公司从成立之初就注重产品研发,不断推出符合市场需求的高品质线缆产品。通过严格把控原材料采购和制造工艺,Cables To Go确保了每一根线缆都具备出色的性能和稳定性。同时,公司还积极投入研发,推出了一系列具有创新性的线缆解决方案,满足了客户多样化的需求。

FINDER公司的发展小趣事

随着电子技术的快速发展,线缆行业也在不断革新。Cables To Go公司紧跟技术潮流,不断引进新技术、新工艺和新材料,推动产品升级换代。公司还与多所高校和科研机构建立了合作关系,共同研发新型线缆产品和技术。这些技术革新不仅提升了产品的性能和品质,还为公司的可持续发展注入了新的动力。


请注意,以上故事都是基于假设和虚构的,不代表Cables To Go公司的实际发展情况。如需了解该公司的真实发展故事,建议查阅相关新闻报道或公司官方资料。

问答坊 | AI 解惑

【FPGA设计实例】(7,4)线性分组码译码器

module decoder1(c,y,clk);output[6:0] c;input[6:0] y;input clk;reg[2:0] s;reg[6:0] e,c;always @(posedge clk) begins[0] = y[0] ^ y[3] ^ y[5] ^ y[6];s[1] = y[1] ^ y[3] ^ y[4] ^ y[5];s[2] = y[2] ^ y[4] ^ y[5] ^ y[6]; //s[0]~ s[2]为伴 ...…

查看全部问答>

步进电机到底是怎么转的?

一般控制步进电机的程序里都有一个“转动表格”之类的东西,比如{0xf1,0xe9,0xe5,0xe3}等等。本来我一直以为步进电机是一次接收一个数字所代表的信号,从第一个接收到第四个就是走一步,周而复始。 现在我编写了这样一个程序: void main() { & ...…

查看全部问答>

wince 自动更新应用程序

请教大虾们如何实现如下功能: 平台:wince6.0 假如现在已经有一个应用程序myap.exe运行了。当我插入sd卡时(sk卡上有新版的myap.exe),点击更新程序按钮时,把sd卡新版本的myap.exe程序拷贝到旧版本的myap.exe处(把旧版的覆盖掉),然后自动运 ...…

查看全部问答>

各位大虾,请教一个内核移植的问题,

用的是linux的内核,ARM的CPU 我用make zImage编译好2.6.13的内核文件后,把/arch/arm/boot/zImage 文件烧进板子后,linux解压出错.错误信息如下:   VIVI version 0.1.4 (root@localhost.localdomain) (gcc version 2.95.2 20000516 (re ...…

查看全部问答>

debug调试中view----》terminalIO怎么用呢

                                  …

查看全部问答>

MC7805应用实例

这两张图是从MC7805 PDF资料中截下的两个应用实例,麻烦各位大侠抽空帮我讲解一下这两张图的工作原理,实现怎样的功能。谢谢。 …

查看全部问答>

整流电路——电工必知20个电路之一 (eeworld 独家大讨论)

刚开始发了一个总帖子来进行讨论,可能大家不知道如何入手,现在我分开来讨论。原帖https://bbs.eeworld.com.cn/thread-292614-1-1.html说明: “ 电子工程师必须掌握的20个电路 ”  在网上诞生了好长时间了,但是确从来没有人详细的给出答案 ...…

查看全部问答>

2011大学生电子设计竞赛分析

本帖最后由 paulhyde 于 2014-9-15 09:44 编辑 大学生电子设计竞赛分析  …

查看全部问答>

求助咯,各位。。。。

网络销售,做工控品的,主要传感器,该怎么去开发潜在的客户?各位大哥大姐,求助…

查看全部问答>