⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unit1.cpp

📁 AVR_Meag8模拟USB接口
💻 CPP
字号:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
 channels=2; //默认通道2
 dataleng=8; //默认8位
 vref=2;     //默认片内2.56V
 usbasp_open();
}
//---------------------------------------------------------------------------
__fastcall TForm1::~TForm1()
{
 usbasp_close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 unsigned char send[4];
 unsigned char buffer;
 if(Timer1->Enabled==false)
  {
   send[0]=channels;
   usbasp_transmit(USB_ENDPOINT_OUT,fID_channels,send,&buffer,0);
   send[0]=dataleng;
   usbasp_transmit(USB_ENDPOINT_OUT,fIDdatabit,send,&buffer,0);
   send[0]=vref;
   usbasp_transmit(USB_ENDPOINT_OUT,fID_Vref,send,&buffer,0);
   usbasp_transmit(USB_ENDPOINT_OUT,fIDstart,send,&buffer,0);
  }
 Timer1->Enabled=true;
 Button1->Enabled=false;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ComboBox1Change(TObject *Sender)
{
 int i;
 i=ComboBox1->ItemIndex;
 if(i==8 || i==9)
   i=6+i;
 channels=(unsigned char)i;
 Button2Click(Sender); //停止
 Button1Click(Sender); //重新开始  
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ComboBox2Change(TObject *Sender)
{
 int i;
 i=ComboBox2->ItemIndex;
 vref=(unsigned char)i;
 if(vref==0)
  ShowMessage("现在没有完成设置外部参考电压源功能");
 Button2Click(Sender); //停止
 Button1Click(Sender); //重新开始   
}
//---------------------------------------------------------------------------
//设置ADC数据长度
void __fastcall TForm1::RadioButton1Click(TObject *Sender)
{
 if(RadioButton1->Checked)
    dataleng=8;
 if(RadioButton2->Checked)
    dataleng=10;
 Button2Click(Sender); //停止
 Button1Click(Sender); //重新开始   
}
//---------------------------------------------------------------------------
//设置ADC数据长度
void __fastcall TForm1::RadioButton2Click(TObject *Sender)
{
 RadioButton1Click(Sender);
}
//-------------------------------------------------------------------------
//停止ADC
void __fastcall TForm1::Button2Click(TObject *Sender)
{
 unsigned char send[4];
 unsigned char buffer;
 Timer1->Enabled=false;
 Button1->Enabled=true;
 usbasp_transmit(USB_ENDPOINT_OUT,fIDstop,send,&buffer,0);
}
//---------------------------------------------------------------------------
//先获得传输字节数的大小,然后读取ADC转换的结果
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
 int i;
 unsigned char adccount;
 unsigned char send[4];
 unsigned char buffer[254];
 for(i=0;i<254;i++)
  buffer[i]=0;
 usbasp_transmit(USB_ENDPOINT_IN,fID_getcount,send,buffer,1);
 adccount=buffer[0]; //获取ADC已经转换数据的个数
 if(adccount>0)
  {
   if(dataleng==8)
      usbasp_transmit(USB_ENDPOINT_IN,fID_read,send,buffer,adccount);
   if(dataleng==10)
      usbasp_transmit(USB_ENDPOINT_IN,fID_read,send,buffer,2*adccount);
   display(buffer,adccount);
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::display(unsigned char *buffer,unsigned char leng)
{
  double adc;
  unsigned int temp;
  unsigned long int j;
  unsigned char i;
  j=0;
  if(dataleng==8)  //8 bit
   {
    for(i=0;i<leng;i++)
     {
       j=j+buffer[i];
     }
    j=j/leng;
   }
  if(dataleng==10) //10 bit
   {
    for(i=0;i<leng;i++)
     {
       temp=buffer[2*i]; //高8位
       temp=temp & 0x3;
       temp=temp<<8;
       temp=temp+buffer[2*i+1]; //低八位
       j=j+temp;
      }
     j=j/leng;
   }
  switch(vref)
   {
     case 0: break; //现在没有处理
     case 1: if(dataleng==8) //片内AVCC参考电压源
                adc=(j*4.65)/256; //这个4.65是根据电路上测量获得
             if(dataleng==10)
                adc=(j*4.65)/1024;
             break;
     case 2: if(dataleng==8) //片内2.56V参考电压源
                adc=(j*2.56)/256;
             if(dataleng==10)
                adc=(j*2.56)/1024;
             break;
     default: break;
   }
  AnsiString playstr;
  playstr=FloatToStr(adc);
  if(playstr.Length()>9)
     playstr=playstr.SubString(1,9);
  playstr+='V';
  Label1->Caption=playstr;
}
/////////////////////////////////////////////////////////////


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -