历史上的今天
返回首页

历史上的今天

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

2020年09月08日 | 单片机双机串口通信原理图

2020-09-08 来源:51hei

主机程序:

#include

unsigned char i=1;

unsigned char ACK=1;

void delay()                               //延时函数

{

   unsigned char i,j;

   for(i=255;i>0;i--)

   for(j=100;j>0;j--){}

}


unsigned char kbscan()          //键盘扫描函数

{

   unsigned char sccode,recode;  //定义行、列

   P1=0xf0;                       //高四位作为输入先写1

   if((P1&0xf0)!=0xf0)                          //判断是否按键按下

      {                                                 

            delay();                                  //延时消抖

                if((P1&0xf0)!=0xf0)                  //再次判断判断有没有按键按下

                  {

                    sccode=0xfe;

                    while((sccode&0x10)!=0)

                         {

                          P1=sccode;

                          if((P1&0xf0)!=0xf0) //判断当前行是否有按键按下

                           {

                            recode=P1&0xf0;   //保留高四位输入值

                                sccode=sccode&0x0f; //保留第低四位的值

                                return(recode+sccode);

                           }

                           else

                            sccode=(sccode<<1)|0x01;

                         }

                  }

          }

          return 0;

}

send()interrupt 4      //串行口通信中断

{

  if(TI==1&&ACK==1)

  {

    TI=0;

    if(i==0||i==0x22||i==0x44||i==0x66||i==0x88||i==0xaa||i==0xcc||i==0xdd||i==0xee)                        //有按键按下,需要修改波特率

    {

          ACK=0;

          SBUF=i;                //发送数据

        }

    else if(i==11)                         //循环发送,发了十一个字符后重新发

        {

       i=1;

           SBUF=1;

        }

        else

        {

      i++;

      SBUF=i;                     //发送数据

    }

  }

  else if(RI==1)                         //接收回应的信号

    {

           RI=0;

           ACK=SBUF;                         //接收回应信号 修改初值 触发串口通信中断

           TI=1;

           TH1=TL1=i;

           i=1;

        }

}

void main()

{

  TMOD=0x20;

  TH1=0x00;TL1=0x00;   //置初值

  TR1=1;EA=1;ES=1;    //使T1开始工作;开总中断、串行中断

  SCON=0x50;          //使T1工作在工作方式1

  SBUF=i;  

  while(1)

  {

    while(kbscan())

           {

            switch(kbscan())                                        //不同的按键对应不同的波特率

                {

            case 0xeb:i=0x00;break;

                case 0xdb:i=0x22;break;

                case 0xbb:i=0x44;break;

                case 0xed:i=0x66;break;

                case 0xdd:i=0x88;break;

                case 0xbd:i=0xaa;break;

                case 0xee:i=0xcc;break;

                case 0xde:i=0xdd;break;

                case 0xbe:i=0xee;break;

          }

        }

  }

}

复制代码


丛机程序:

#include

#define LCD_DATA P0

sbit LCD_BUSY=LCD_DATA^7;

sbit LCD_RW=P3^3;

sbit LCD_RS=P3^2;

sbit LCD_EN=P3^4;

sbit P20=P2^0;

sbit P21=P2^1;

sbit P22=P2^2;

sbit P23=P2^3;

sbit P24=P2^4;

sbit P25=P2^5;

sbit P26=P2^6;

sbit P27=P2^7;

sbit P30=P3^0;

sbit P31=P3^1;

sbit P32=P3^2;

sbit P33=P3^3;

sbit P34=P3^4;

sbit P35=P3^5;

sbit P36=P3^6;

sbit P37=P3^7;


unsigned char i=0;

void LCD_check_busy(void)        //检测LCD状态

{

  while(1)

  {

   

   LCD_RS=0;

   LCD_RW=1;

   LCD_EN=0;

   LCD_DATA=0xff;

   LCD_EN=1;

   if(!LCD_BUSY)break;

   LCD_EN=0;

  }

}


void LCD_cls(void)  //LCD清屏

{

  LCD_check_busy();

  LCD_EN=0;

  LCD_RS=0;

  LCD_RW=0;

  LCD_DATA=0x01;

  LCD_EN=1;

  LCD_EN=0;

}


void LCD_write_instruction(unsigned char LCD_instruction)//写指令到LCD

{

LCD_check_busy();

LCD_EN=0;

LCD_RS=0;

LCD_RW=0;

LCD_DATA=LCD_instruction;

LCD_EN=1;

LCD_EN=0;

}


void LCD_write_data(unsigned char LCD_data)//输出一个字节数据到LCD

{

  LCD_check_busy();

  LCD_EN=0;

  LCD_RS=1;

  LCD_RW=0;

  LCD_DATA=LCD_data;

  LCD_EN=1;

  LCD_EN=0;

}


void LCD_initial()

{

   LCD_write_instruction(0x38);          //两行显示

   LCD_write_instruction(0x0C);                 //显示开

   LCD_write_instruction(0x06);             //光标加1

   LCD_write_instruction(0x01);                  //清屏

}


re() interrupt 4                                   //串行口通信中断

{

  if(RI==1)

  {

    RI=0;

    i=SBUF;                                                   // 接收数据

    if(i==0||i==0x22||i==0x44||i==0x66||i==0x88||i==0xaa||i==0xcc||i==0xdd||i==0xee)

    {

          SBUF=1;                                           //接收发过来 要修改的初值

       

    }

    else                                                   //接收正常通信的数据

    {

      LCD_write_instruction(0x80+i);

      LCD_write_data('0'+i);

      if(i==11)LCD_initial();

    }

  }

  else if(TI==1)

  {

    TI=0;

        TH1=i;TL1=i;                                 //发送确认信号后 修改初值

  }

}

void main()

{

  TMOD=0x20;

  TH1=0x00;TL1=0x00;   //置初值

  TR1=1;EA=1;ES=1;    //使T1开始工作;开总中断、串行中断

  SCON=0x50;          //使T1工作在工作方式1


推荐阅读

史海拾趣

DMEL Inc公司的发展小趣事

为了提升产品质量和用户体验,DMEL Inc不断加大对生产过程的管控力度。公司引进了先进的生产设备和管理系统,建立了严格的质量检测体系。同时,DMEL Inc还加强了与供应商的合作,确保原材料的质量和供应的稳定性。这些措施的实施,使得DMEL Inc的产品质量得到了显著提升,赢得了消费者的信赖和好评。

GigPeak公司的发展小趣事

为了进一步增强市场地位和扩大产品线,GigPeak在2010年实施了一项重要的并购战略。公司成功收购了另一家在光纤通信领域具有深厚技术积累的企业,这次并购不仅为GigPeak带来了先进的产品线和研发资源,还显著提升了其在全球市场的份额。通过整合双方的优势资源,GigPeak在光纤通信领域的技术实力和市场份额均实现了质的飞跃。

Brite-Led Optoelectronics Inc公司的发展小趣事

随着市场竞争的加剧,Brite-Led意识到单凭自身力量难以持续保持领先。于是,公司积极寻求与其他企业和研究机构的合作研发机会。通过与一家知名高校的合作,Brite-Led成功开发出一种新型的LED封装技术,大幅提高了产品的可靠性和耐用性。这一合作不仅加强了Brite-Led的技术实力,也为其带来了更多的商业机会和合作伙伴。

CYAN公司的发展小趣事

随着5G技术的兴起,CYAN敏锐地捕捉到了市场的变化。公司投入大量研发资源,成功开发出一款基于5G技术的高性能网络路由器。这款路由器不仅具有超高的数据传输速度和稳定性,还具备智能管理和安全保护功能,满足了市场对高性能网络设备的需求。

Hilscher Gesellschaft für Systemautomation mbH公司的发展小趣事

随着在高压电源领域的深入发展,HVPSI逐渐参与到行业标准的制定工作中。公司凭借其在技术上的深厚积累和市场经验,为行业标准的制定提供了宝贵的建议和数据支持。这些标准的出台不仅规范了市场秩序,也进一步巩固了HVPSI在行业内的领先地位。

Accuride公司的发展小趣事

在经营过程中,Accuride公司也进行了一系列子公司出售和业务调整。例如,它曾宣布出售其子公司Fabco汽车公司。这一举措有助于Accuride公司更加专注于其核心业务,优化资源配置,提升整体运营效率。同时,通过出售子公司,Accuride也获得了一定的资金回流,为公司的未来发展提供了资金支持。

问答坊 | AI 解惑

EEWORLD社区5月明星人物出台喽!

5月的社区明星火热出炉~~~~:D 本月优秀工程师(依据发帖数排名): 最佳风度奖:quanzx 最佳主人奖:wangjiafu1985 最具奉献奖: richiefang 本月博客之星:chbaaic 优秀版主:gaoxiao 请当选的朋友发表感言,并将联系方式(姓 ...…

查看全部问答>

自己写的一个彩色led字符+颜色转换工具

本帖最后由 paulhyde 于 2014-9-15 08:58 编辑 LCD显示好帮手 基于.net的应用程序,请安装.net库方能正常使用 支持各种能输入的文字和符号,转换为点阵。支持颜色转换成相应代码。  …

查看全部问答>

AVR ATmega16 矩阵键盘 问题

以下是在基于ATmega16写的程序,行是B口的低4位,列是B口的高4位。 程序功能:读取键值,然后通过数码管显示键值。 程序看过很多遍了,没有问题,但就是不能正确的显示健值(12,13,14,15键值能正常显示,其它的键值在数码管的十位会显示0,个 ...…

查看全部问答>

关于6410开发板设备识别问题

最近在搞三星6410开发板,将6410的bsp中bootloader/eboot/文件夹下的usb.C文件中加入加入键盘的报告描述符,并加入散转的代码case report_descriptor...........,并修改idproduct=ox0001,idvender=ox8888;然后编写返回代码。 用vs2005构建系统, ...…

查看全部问答>

基于ARM的人脸识别门禁系统

大家有对ARM开发很熟悉的么,我是通信专业的,毕业设计做这东西,对人脸识别算法了解点,对这个MFC编程完全白痴,希望有牛人可以交流下啊~我邮箱zhangtengxss@163.com 希望大家联系我啊…

查看全部问答>

播放视频如果用WMP控件的话能全屏幕播放吗?

另外可以实现获得播放过程中的单侦画面吗?就是实现逐贞播放 播放视频有什么其它方法吗,除了自己解码…

查看全部问答>

关于遥控器(空调,彩电等)的控制芯片

我表哥有个小厂专门做遥控器之类的,由于不能自己开发芯片,多数要高价外出购买,所以我想能不能自己学学这方面的知识,或许可以帮他一些忙。 我现在在搞C#,不知道要达成能自己开发这些芯片需要学习些什么?请大家不吝赐教啊! 分数可以再加,分 ...…

查看全部问答>

s3c44b0+ucosii的中断初始化问题

我以前用ucosii在s3c44b0上面做的程序,一直运行正常。很来又做了一个不带ucosii的支持外部中断2的程序,使用ISR,工作也正常,但将这个程序写到原 先带ucosII的程序上后,就每次开机就死机。不知道为什么。 我原先不带外部中断2的程序的初始化代 ...…

查看全部问答>

LM3S811真么就这么容易锁死?!跪求解决方法

我用的是EK-LM3S811开发板,在移植uCOS的过程中,测试了两个管脚,分别是PB1和PC5(没有复用JTAG管脚),下载调试几次都是可以的,但突然就提示“Could not initialize target device! Please power cycle the board and try again”的典型锁死提示 ...…

查看全部问答>

AD转换出现故障

本帖最后由 dontium 于 2015-1-23 11:26 编辑 对于TMS320F2802,我测得的ADCREFP和ADCREFM分别是,1.01V和0.48V,AD采样老是1768。请问这是为什么呀? …

查看全部问答>