找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1320|回复: 2
打印 上一主题 下一主题
收起左侧

关于上位机lab传输数据给51单片机,单片机进行DA转换的问题。

[复制链接]
跳转到指定楼层
楼主
ID:894654 发表于 2021-6-28 00:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大佬们,想问一下关于上位机lab传输数据给51单片机,单片机进行DA转换的问题。DA单独调试的时候可以成功,换成上位机发送数据存进数组,数组里的数据DA转换示波器就没反应了。想着可能是数组里面的元素是十六进制的问题,之前单独调试DA转换常规十进制数的时候,示波器上面可以显示波形。(单片机用的是stc8、工作频率22.1184M、DA转换用的是TLC5620)在此想请教大佬们几个问题:1、DA转换不能转换十六进制的数吗?比如说0X55?
2、如何要将数组类型进行转换,十六进制数组怎么转换为十进制数组呢?比如 unsigned char a[]={0X55,0X44,0X33,0X22}转为unsigned char b[]={85,68,51,34}。
3、这里想要实现2ms从上位机实时发送数据单片机,单片机实时进行DA转换2 ms输出连续波形,该怎么做呢? Labview 需要安装类似rt 驱动吗?
希望大佬们能帮忙解答一下。非常感谢


单片机部分代码贴上。

#include <STC8.H>
#include<intrins.h>
#include "delay.h"
#include "uart.h"

unsigned int count,state;
//定义I/O端口

sbit CLK=P1^0; //串行输数据
sbit DAT=P1^1; //串行时钟,
sbit LOAD=P1^2; //串行数据装载,下降沿有效
sbit LDAC=P1^3; //DAC更新锁存控制,下降沿有效
void Timer0Init(void)
{
    AUXR |= 0x80;
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:894654 发表于 2021-6-28 13:51 | 只看该作者
代码续附:
#include <STC8.H>
#include<intrins.h>
#include "delay.h"
#include "uart.h"

unsigned int count,state;
//定义I/O端口

sbit CLK=P1^0; //串行输数据
sbit DAT=P1^1; //串行时钟,
sbit LOAD=P1^2; //串行数据装载,下降沿有效
sbit LDAC=P1^3; //DAC更新锁存控制,下降沿有效
void Timer0Init(void)
{
    AUXR |= 0x80;                //疑问????1T??
        TMOD &= 0xF0;                //疑问??????
        TMOD |= 0x01;                //疑问??????
        TL0 = 0x33;                //疑问?????
        TH0 = 0x53;                //疑问?????
        TF0 = 0;                //疑问?TF0??

        TR0=1;//启动定时器T0
        ET0=1;//定时器T0允许中断
}
void time0() interrupt 1  //2毫秒
{

        TF0=0;
        TL0 = 0x33;                //疑问?????
        TH0 = 0x53;                //疑问?????
         if(recv_flag==1)
         {
         recv_flag=0;
         state=1;
         }       
}
void Dac1( unsigned char addr, bit rng, unsigned char dat)
{
        unsigned char n;
        n = 2;
        do
        {
                DAT = (bit)(addr & 0x02);
                addr <<=1;
                //addr:DAC通道地址,取值0~3,对应通道A~D;
                CLK = 0;
                CLK = 1;       
        }
        while ( --n != 0 );
        DAT = rng;
        CLK = 0;
        CLK = 1;
        n = 8;
        do
                {
                        DAT = (bit)(dat & 0x80);  //传送数据 高位开始传
                        dat <<= 1;
                        CLK = 0;
                        CLK = 1;
                }
                while( --n != 0 )
                        ;
                LOAD = 0;
                LOAD = 1;

}

void Init_TLC5620( ) // 选择的通道
{
        DAT = 1;
        CLK = 1;
        LDAC = 1;
        LOAD = 1;       
}

void main()
{
        unsigned char i;
       
  //定时器初始化
        Timer0Init();
    EA=1;        //开总中断
        Init_TLC5620();               
    UartInit();       

        DelayXms(10);
         while(1)
   {
                 if( state==1)
                 { state=0;
                           sendString(recv_buf);//处理数据
                                Dac1(0,0,recv_buf[i]);//有信号输出
//                P1=0;
//                                 DelayXms(10);
                                P1=P1&0x77; // 同步 先使P1^3和P1^7为0    P1&01110111
                                P1=P1|0x88; //同步  在使P1^3和P1^7为1    P1&10001000
                                i++;
                                //20210405  将 i>=247 改为number
                                if(i>=200)
                                {
                                        i=1;
                                       
                                }                                                                       
//        clr_recvbuffer(recv_buf);//清除缓冲BUFFER
                 }
               

}}
回复

使用道具 举报

板凳
ID:372815 发表于 2021-6-29 02:28 | 只看该作者
代码续附:
#include <STC8.H>
#include<intrins.h>
#include "delay.h"
#include "uart.h"

unsigned int count,state;
//定义I/O端口

sbit CLK=P1^0; //串行输数据
sbit DAT=P1^1; //串行时钟,
sbit LOAD=P1^2; //串行数据装载,下降沿有效
sbit LDAC=P1^3; //DAC更新锁存控制,下降沿有效
void Timer0Init(void)
{
    AUXR |= 0x80;                //疑问????1T??
        TMOD &= 0xF0;                //疑问??????
        TMOD |= 0x01;                //疑问??????
        TL0 = 0x33;                //疑问?????
        TH0 = 0x53;                //疑问?????
        TF0 = 0;                //疑问?TF0??

        TR0=1;//启动定时器T0
        ET0=1;//定时器T0允许中断
}
void time0() interrupt 1  //2毫秒
{

        TF0=0;
        TL0 = 0x33;                //疑问?????
        TH0 = 0x53;                //疑问?????
         if(recv_flag==1)
         {
         recv_flag=0;
         state=1;
         }      
}
void Dac1( unsigned char addr, bit rng, unsigned char dat)
{
        unsigned char n;
        n = 2;
        do
        {
                DAT = (bit)(addr & 0x02);
                addr <<=1;
                //addr:DAC通道地址,取值0~3,对应通道A~D;
                CLK = 0;
                CLK = 1;      
        }
        while ( --n != 0 );
        DAT = rng;
        CLK = 0;
        CLK = 1;
        n = 8;
        do
                {
                        DAT = (bit)(dat & 0x80);  //传送数据 高位开始传
                        dat <<= 1;
                        CLK = 0;
                        CLK = 1;
                }
                while( --n != 0 )
                        ;
                LOAD = 0;
                LOAD = 1;

}

void Init_TLC5620( ) // 选择的通道
{
        DAT = 1;
        CLK = 1;
        LDAC = 1;
        LOAD = 1;      
}

void main()
{
        unsigned char i;
      
  //定时器初始化
        Timer0Init();
    EA=1;        //开总中断
        Init_TLC5620();               
    UartInit();      

        DelayXms(10);
         while(1)
   {
                 if( state==1)
                 { state=0;
                           sendString(recv_buf);//处理数据
                                Dac1(0,0,recv_buf[i]);//有信号输出
//                P1=0;
//                                 DelayXms(10);
                                P1=P1&0x77; // 同步 先使P1^3和P1^7为0    P1&01110111
                                P1=P1|0x88; //同步  在使P1^3和P1^7为1    P1&10001000
                                i++;
                                //20210405  将 i>=247 改为number
                                if(i>=200)
                                {
                                        i=1;
                                       
                                }                                                                       
//        clr_recvbuffer(recv_buf);//清除缓冲BUFFER
                 }
               

}}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表