【开发手记五】核心帖二:实现ZED与8051单片机的通信

说明:整理之前项目博客,此系列之前发表于与非网

http://www.openhw.org/module/forum/thread-552493-1-1.html

除了ZED与数据库的网络通信外,ZED8051的通信也是我们小组设计计划中另一重要部分,我们用8051模拟用电器工作,因此需要通过ZED来猜的8051的工作状态,经过处理后在通过网络传送至数据库。
我们的设计是ZED88051之间通过UART接口传输数据,因此首先实现Linux环境下PC8051的通信,再移植至ZED板,网上的教程有很多,我直接上程序。
PC(移植后的ZED板端)
#include
#include
#include
#include
#include
#include
#include
 
 
 
void init(int fd)
{
     struct termios new1,old;
 
    if (fd==-1)
    {
        printf("Error when open the com! \n");
        exit(-1);
    }
    tcgetattr(fd,&old);
 
    //得到串口缺省参数设置,以便用完后恢复缺省设置
    bzero(&new1,sizeof(new1));
 
    //设置波特率,8个数据位,本地链接
     new1.c_cflag=B4800|CS8|CLOCAL|CREAD;
     new1.c_iflag=IGNPAR;
     new1.c_oflag=0;
     new1.c_lflag=0;
 
    //设定每接收到一个字符立即读取
    new1.c_cc[VMIN]=1;
    new1.c_cc[VTIME]=0;
    tcflush(fd,TCIOFLUSH);            //清除输入输出缓冲流
    tcsetattr(fd,TCSANOW,&new1);    //设置立即生效
    }
int main(void)
{
    int fd=open("/dev/ttyUSB0",O_RDWR);
    char wbuf[800]="b101010",rbuf[800]="";
    init(fd);
    write(fd,wbuf,10);
    read(fd,rbuf,10);
    printf("read string is %s\n",rbuf);
    return 0;
}
 
8051端:
#include            //52系列单片机头文件
#define uchar unsigned char
#define uint unsigned int
 
uchar add,add1,c;           //
 
uchar  temp[5];
uchar  temp1[7];
uchar  seg4[4];       //暂存接收数据
uchar  led6[6];
uint flag1,flag2;
 
sbit  led0=P1^0;
sbit  led1=P1^1;
sbit  led2=P1^2;
sbit  led3=P1^3;
sbit  led4=P1^4;
sbit  led5=P1^5;
sbit  key1=P3^2;
sbit  key2=P3^3;
 
uchar code position[]={0xfe,0xfd,0xfb,0xf7};   //数码管位置数组
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};            //共阴极数码管编码
void display();  //声明子函数
void delay(uint z);                       //声明子函数
 
void Init();                //初始化函数
void main()
{
     Init();    
    display();
}
 
void display()
{     
     while(1)
     {
         if((temp[0]+48)=='a')
        {
         seg4[0]=temp[1];
         seg4[1]=temp[2];
         seg4[2]=temp[3];
         seg4[3]=temp[4];
        }
        P2=position[0];                         
        P0=table[seg4[0]];              //给第一个数码管送"a"
        delay(1);                 //延时1ms                      
        P2=position[1];
        P0=table[seg4[1]];              //给第二个数码管送"b"
        delay(1);                 //延时1ms
        P2=position[2];
        P0=table[seg4[2]];              //给第三个数码管送"c"
        delay(1);                 //延时1ms
        P2=position[3];                          
        P0=table[seg4[3]];              //给第三个数码管送"d"
        delay(1);
 
            if((temp1[0]+48)=='b')
            {
                    led6[0]=temp1[1];
                    led6[1]=temp1[2];
                    led6[2]=temp1[3];
                    led6[3]=temp1[4];
                    led6[4]=temp1[5];
                    led6[5]=temp1[6];
            }
            led0=led6[0];
            led1=led6[1];
            led2=led6[2];
            led3=led6[3];
            led4=led6[4];
            led5=led6[5];
    
     }                        //延时1ms
}
 
void delay(uint z)                   //延时子函数
{
    uint x,y;
    for(x=z;x>0;x--)
    for(y=110;y>0;y--);
}
 
 
/*******初始化函数**********/
void Init()                       
{
     TMOD=0x20;                     // 定时器1工作于8位自动重载模式, 用于产生波特率
     TH1=0xFD;                 // 波特率9600
     TL1=0xFD;
     SCON=0x50;               // 设定串行口工作方式
     PCON&=0xef;                    // 波特率不倍增     
     TR1=1;                        // 启动定时器1
     EA=1;                          //开总中断
     ES=1;                          //串行中断允许
 
     EX0  = 1;                           //打开外部中断0
     EX1  = 1;                           //打开外部中断1
     IT0  = 1;                             //外部中断0触发方式选择位: 72
     IT1  = 1;                 //外部中断1触发方式选择位
     IP   = 0x01;                       //外部中断0定义为高优先级中断
 
     P0=0x3f;
     P2=0x00;
     add=0;
     flag1=1;
     flag2=1;
}
 
 
void Serial_INT() interrupt 4               //串口中断
{
    c=SBUF;
     if(RI)
     {
            if(c=='a')
            {
                   add=0;
            }
        temp[add]=SBUF-48;
            RI=0;
            add++;
            if(add==5)
                   add=0;
 
            if(c=='b')
            {
                   add1=0;
            }
            temp1[add1]=SBUF-48;
            RI=0;
            add1++;
            if(add1==7)
                   add1=0;
     }
}
 
void EX_INT0() interrupt 0                           //外部中断0
{
     if(key1==0)
     {
         delay(10);
             if((key1==0)&&flag1)
             {
             led6[0]=0;
             ES=0;
             SBUF='1';
             flag1=0;
             temp1[0]='0';
             while(!TI);
             TI=0;
             ES=1;
             
             }
            else if((key1==0)&&(flag1==0))
         {
             led6[0]=1;
             ES=0;
             SBUF='2';
             flag1=1;
             temp1[0]='0';
             while(!TI);
             TI=0;
             ES=1;
             
             }
     }
}
void EX_INT1() interrupt 2                         //外部中断1
{
     if(key2==0)
     {
         delay(10);
             if((key2==0)&&flag2)
             {
             led6[1]=0;
             ES=0;
             SBUF='3';
             flag2=0;
             temp1[0]='0';
             while(!TI);
             TI=0;
             ES=1;
             
             }
            else if((key2==0)&&(flag2==0))
         {
             led6[1]=1;
             ES=0;
             SBUF='4';
             flag2=1;
             temp1[0]='0';
             while(!TI);
             TI=0;
             ES=1;
             
             }
     }
}
 
 
操作:
1.8051通过USB连接至电脑,在虚拟机中确定所占用com名称,修改相应程序部分。
2. server.cpp 目录下用管理员权限运行 ./server
3.8051上按键,会在8051的七段显示器上显示由PC发送的数据,在PC上的终端中也会打印出8051返回的数据。
4.交叉编译server.cpp得到server.out,拷贝至ZEDSD卡的FAT分区,操作方法一致。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Zed2双目相机C开发是一种基于NVIDIA Jetson TX2平台的深度感知解决方案。该相机是一个小型、轻便的设备,可以实现实时的深度感知以及三维重构功能。 Zed2双目相机C开发可以被应用于机器人技术、虚拟现实技术、自动驾驶技术等领域。对于机器人技术而言,该相机可以帮助机器人实现立体视觉和深度感知,从而更好地理解环境和完成任务。对于虚拟现实技术来说,该相机可以实现更高精度的位置追踪,提升用户体验。 此外,Zed2双目相机C开发还具有并行计算能力,可以实现实时深度感知和三维重构。同时,该相机还可以进行AI加速,加速数据处理速度,提升系统的实时性和响应速度。 总的来说,Zed2双目相机C开发为深度感知领域提供了一个全新的解决方案,具有多种优势,可以为众多应用领域提供更高的精度和效率。 ### 回答2: zed2双目相机是一款先进的双目立体成像设备,其采用高质量的成像技术,可以对物体进行全面、精准的测量和观察。在人工智能、机器人、自动驾驶等领域,具有重要的应用前景。 zed2双目相机c开发是一项非常复杂的任务,需要丰富的硬件和软件支持。在硬件方面,开发人员需要了解相机的基本结构、工作原理、信号传输等关键要素,以确保相机的高质量工作。在软件方面,开发人员需要开发相应的算法和程序,以实现数据采集、图像处理、测量分析等功能。 在开发zed2双目相机c时,需要注意以下几个方面: 1. 硬件设计。开发人员需要根据应用场景需求进行相应的硬件设计,如制作机械结构支持、电源管理模块等。 2. 软件编程。开发人员需要使用各种编程语言,如C、C++等,编写相应的程序,实现数据采集、图像处理、测量分析等功能。 3. 算法优化。开发人员需要使用各种算法来实现图像处理、测量分析等功能,并对其进行优化,以提高算法的效率和精度。 总之,zed2双目相机c开发是一项非常复杂的任务,需要开发人员具备深厚的硬件和软件技术知识,并进行深入研究和不断实践,以完善该设备的功能和性能,应对不断变化的市场需求。 ### 回答3: zed2是一种双目相机,可以将两个摄像头的影像数据融合,得到更精准的景深信息,在3D场景中应用广泛。zed2双目相机c开发,则是对于zed2相机的C语言开发。使用zed2相机进行3D影像采集需要一定的程序开发,通过C语言开发zed2相机的应用程序可以更加高效地处理图像数据,并且实现不同的应用功能。zed2双目相机c开发可以用于机器人、自动驾驶、医疗等领域。在机器人领域,zed2双目相机c开发可以用于3D地图的构建与导航,同时也可以用于机器人的实时定位与姿态估计。在自动驾驶领域,zed2双目相机c开发可以用于视觉辅助驾驶、交通标志识别等场景。在医疗领域,zed2双目相机c开发可以用于立体纹理重建、手术导航等场景。双目相机c开发使用C语言对zed2相机程序进行设计开发,需要了解相机硬件的具体参数和相关的开发工具,同时也需要对于图像处理算法、计算机视觉有较深的基础。越来越多的应用场景需要zed2双目相机c开发,对于开发人员来说也提供了更多的发展机会。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值