找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 1667|回復(fù): 2
收起左側(cè)

關(guān)于上位機(jī)lab傳輸數(shù)據(jù)給51單片機(jī),單片機(jī)進(jìn)行DA轉(zhuǎn)換的問(wèn)題。

[復(fù)制鏈接]
ID:894654 發(fā)表于 2021-6-28 00:19 | 顯示全部樓層 |閱讀模式
大佬們,想問(wèn)一下關(guān)于上位機(jī)lab傳輸數(shù)據(jù)給51單片機(jī),單片機(jī)進(jìn)行DA轉(zhuǎn)換的問(wèn)題。DA單獨(dú)調(diào)試的時(shí)候可以成功,換成上位機(jī)發(fā)送數(shù)據(jù)存進(jìn)數(shù)組,數(shù)組里的數(shù)據(jù)DA轉(zhuǎn)換示波器就沒(méi)反應(yīng)了。想著可能是數(shù)組里面的元素是十六進(jìn)制的問(wèn)題,之前單獨(dú)調(diào)試DA轉(zhuǎn)換常規(guī)十進(jìn)制數(shù)的時(shí)候,示波器上面可以顯示波形。(單片機(jī)用的是stc8、工作頻率22.1184M、DA轉(zhuǎn)換用的是TLC5620)在此想請(qǐng)教大佬們幾個(gè)問(wèn)題:1、DA轉(zhuǎn)換不能轉(zhuǎn)換十六進(jìn)制的數(shù)嗎?比如說(shuō)0X55?
2、如何要將數(shù)組類型進(jìn)行轉(zhuǎn)換,十六進(jìn)制數(shù)組怎么轉(zhuǎn)換為十進(jìn)制數(shù)組呢?比如 unsigned char a[]={0X55,0X44,0X33,0X22}轉(zhuǎn)為unsigned char b[]={85,68,51,34}。
3、這里想要實(shí)現(xiàn)2ms從上位機(jī)實(shí)時(shí)發(fā)送數(shù)據(jù)單片機(jī),單片機(jī)實(shí)時(shí)進(jìn)行DA轉(zhuǎn)換2 ms輸出連續(xù)波形,該怎么做呢? Labview 需要安裝類似rt 驅(qū)動(dòng)嗎?
希望大佬們能幫忙解答一下。非常感謝


單片機(jī)部分代碼貼上。

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

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

sbit CLK=P1^0; //串行輸數(shù)據(jù)
sbit DAT=P1^1; //串行時(shí)鐘,
sbit LOAD=P1^2; //串行數(shù)據(jù)裝載,下降沿有效
sbit LDAC=P1^3; //DAC更新鎖存控制,下降沿有效
void Timer0Init(void)
{
    AUXR |= 0x80;
回復(fù)

使用道具 舉報(bào)

ID:894654 發(fā)表于 2021-6-28 13:51 | 顯示全部樓層
代碼續(xù)附:
#include <STC8.H>
#include<intrins.h>
#include "delay.h"
#include "uart.h"

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

sbit CLK=P1^0; //串行輸數(shù)據(jù)
sbit DAT=P1^1; //串行時(shí)鐘,
sbit LOAD=P1^2; //串行數(shù)據(jù)裝載,下降沿有效
sbit LDAC=P1^3; //DAC更新鎖存控制,下降沿有效
void Timer0Init(void)
{
    AUXR |= 0x80;                //疑問(wèn)????1T??
        TMOD &= 0xF0;                //疑問(wèn)??????
        TMOD |= 0x01;                //疑問(wèn)??????
        TL0 = 0x33;                //疑問(wèn)?????
        TH0 = 0x53;                //疑問(wèn)?????
        TF0 = 0;                //疑問(wèn)?TF0??

        TR0=1;//啟動(dòng)定時(shí)器T0
        ET0=1;//定時(shí)器T0允許中斷
}
void time0() interrupt 1  //2毫秒
{

        TF0=0;
        TL0 = 0x33;                //疑問(wèn)?????
        TH0 = 0x53;                //疑問(wèn)?????
         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,對(duì)應(yīng)通道A~D;
                CLK = 0;
                CLK = 1;       
        }
        while ( --n != 0 );
        DAT = rng;
        CLK = 0;
        CLK = 1;
        n = 8;
        do
                {
                        DAT = (bit)(dat & 0x80);  //傳送數(shù)據(jù) 高位開(kāi)始傳
                        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;
       
  //定時(shí)器初始化
        Timer0Init();
    EA=1;        //開(kāi)總中斷
        Init_TLC5620();               
    UartInit();       

        DelayXms(10);
         while(1)
   {
                 if( state==1)
                 { state=0;
                           sendString(recv_buf);//處理數(shù)據(jù)
                                Dac1(0,0,recv_buf[i]);//有信號(hào)輸出
//                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
                 }
               

}}
回復(fù)

使用道具 舉報(bào)

ID:372815 發(fā)表于 2021-6-29 02:28 | 顯示全部樓層
代碼續(xù)附:
#include <STC8.H>
#include<intrins.h>
#include "delay.h"
#include "uart.h"

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

sbit CLK=P1^0; //串行輸數(shù)據(jù)
sbit DAT=P1^1; //串行時(shí)鐘,
sbit LOAD=P1^2; //串行數(shù)據(jù)裝載,下降沿有效
sbit LDAC=P1^3; //DAC更新鎖存控制,下降沿有效
void Timer0Init(void)
{
    AUXR |= 0x80;                //疑問(wèn)????1T??
        TMOD &= 0xF0;                //疑問(wèn)??????
        TMOD |= 0x01;                //疑問(wèn)??????
        TL0 = 0x33;                //疑問(wèn)?????
        TH0 = 0x53;                //疑問(wèn)?????
        TF0 = 0;                //疑問(wèn)?TF0??

        TR0=1;//啟動(dòng)定時(shí)器T0
        ET0=1;//定時(shí)器T0允許中斷
}
void time0() interrupt 1  //2毫秒
{

        TF0=0;
        TL0 = 0x33;                //疑問(wèn)?????
        TH0 = 0x53;                //疑問(wèn)?????
         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,對(duì)應(yīng)通道A~D;
                CLK = 0;
                CLK = 1;      
        }
        while ( --n != 0 );
        DAT = rng;
        CLK = 0;
        CLK = 1;
        n = 8;
        do
                {
                        DAT = (bit)(dat & 0x80);  //傳送數(shù)據(jù) 高位開(kāi)始傳
                        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;
      
  //定時(shí)器初始化
        Timer0Init();
    EA=1;        //開(kāi)總中斷
        Init_TLC5620();               
    UartInit();      

        DelayXms(10);
         while(1)
   {
                 if( state==1)
                 { state=0;
                           sendString(recv_buf);//處理數(shù)據(jù)
                                Dac1(0,0,recv_buf[i]);//有信號(hào)輸出
//                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
                 }
               

}}
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表