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

📄 main.pas

📁 这我用delphi编写的AVR串口通信工具串口通信原代码
💻 PAS
📖 第 1 页 / 共 2 页
字号:
unit main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, Buttons;

type
  TForm1 = class(TForm)
    ComboBox1: TComboBox;
    ComboBox2: TComboBox;
    CheckBox1: TCheckBox;
    Memo1: TMemo;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Timer1: TTimer;
    ComboBox3: TComboBox;
    Label5: TLabel;
    BitBtn1: TBitBtn;
    Label6: TLabel;
    ComboBox4: TComboBox;
    CheckBox2: TCheckBox;
    GroupBox1: TGroupBox;
    CheckBox3: TCheckBox;
    CheckBox5: TCheckBox;
    CheckBox6: TCheckBox;
    CheckBox7: TCheckBox;
    CheckBox8: TCheckBox;
    CheckBox9: TCheckBox;
    CheckBox11: TCheckBox;
    BitBtn2: TBitBtn;
    GroupBox3: TGroupBox;
    LabeledEdit1: TLabeledEdit;
    ComboBox5: TComboBox;
    Label1: TLabel;
    CheckBox4: TCheckBox;
    GroupBox2: TGroupBox;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    CheckBox10: TCheckBox;
    CheckBox12: TCheckBox;
    CheckBox13: TCheckBox;
    CheckBox14: TCheckBox;
    CheckBox15: TCheckBox;
    CheckBox16: TCheckBox;
    CheckBox17: TCheckBox;
    CheckBox18: TCheckBox;
    CheckBox19: TCheckBox;
    ComboBox6: TComboBox;
    ComboBox7: TComboBox;
    LabeledEdit2: TLabeledEdit;
    ComboBox8: TComboBox;
    CheckBox20: TCheckBox;
    CheckBox21: TCheckBox;
    CheckBox22: TCheckBox;
    procedure FormShow(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
    procedure ComboBox1Change(Sender: TObject);
    procedure ComboBox2Change(Sender: TObject);
    procedure CheckBox1Click(Sender: TObject);
    procedure Label4MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure Label4MouseLeave(Sender: TObject);
    procedure Label4Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure ComboBox3Change(Sender: TObject);
    procedure BitBtn1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure BitBtn1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure ComboBox4Change(Sender: TObject);
    procedure CheckBox2Click(Sender: TObject);
    procedure ComboBox6Change(Sender: TObject);
    procedure ComboBox7Change(Sender: TObject);
    procedure CheckBox13Click(Sender: TObject);
    procedure CheckBox12Click(Sender: TObject);
    procedure CheckBox5Click(Sender: TObject);
    procedure CheckBox14Click(Sender: TObject);
    procedure CheckBox7Click(Sender: TObject);
    procedure CheckBox16Click(Sender: TObject);
    procedure CheckBox18Click(Sender: TObject);
    procedure CheckBox19Click(Sender: TObject);
    procedure CheckBox11Click(Sender: TObject);
    procedure CheckBox9Click(Sender: TObject);
    procedure CheckBox8Click(Sender: TObject);
    procedure CheckBox17Click(Sender: TObject);
    procedure CheckBox6Click(Sender: TObject);
    procedure CheckBox15Click(Sender: TObject);
    procedure CheckBox21Click(Sender: TObject);
    procedure CheckBox22Click(Sender: TObject);
    procedure CheckBox4Click(Sender: TObject);
    procedure CheckBox20Click(Sender: TObject);
    procedure ComboBox5Change(Sender: TObject);
    procedure ComboBox8Change(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  
  Fosc : Real;
  Baud0,Baud1 : integer;
  U2X0,U2X1  : integer;

  UCSR0A: integer;
  UCSR1A: integer;
  UCSR0B: integer;
  UCSR1B: integer;
  UCSR0C: integer;
  UCSR1C: integer;
  UBRR0 : integer;
  UBRR1 : integer;

implementation
uses   ShellAPI;
{$R *.dfm}

procedure TForm1.FormShow(Sender: TObject);
begin
  Form1.Width :=457;
  Memo1.Left :=224;
  GroupBox3.Left :=224;
  GroupBox2.Left :=528;
  BitBtn1.Left :=248;
  BitBtn2.Left :=344;
  Label4.Left :=72;
  Form1.Position :=poDesktopCenter;

  ComboBox1.ItemIndex :=5;
  ComboBox2.ItemIndex :=10;
  ComboBox3.ItemIndex :=1;
  ComboBox4.ItemIndex :=3;
  ComboBox5.ItemIndex :=0;
  ComboBox6.ItemIndex :=5;
  ComboBox7.ItemIndex :=3;
  ComboBox8.ItemIndex :=0;

  CheckBox3.Enabled := true;
  CheckBox4.Enabled := false;
  CheckBox6.Enabled := true;
  //CheckBox8.Enabled := false;
  CheckBox15.Enabled := true;
  CheckBox20.Enabled := false;

  CheckBox1.Checked := false;
  CheckBox2.Checked := false;
  CheckBox3.Checked := true;
  CheckBox4.Checked := false;
  CheckBox5.Checked := false;
  CheckBox6.Checked := false;
  CheckBox7.Checked := false;
  CheckBox8.Checked := false;
  CheckBox10.Checked := false;
  CheckBox15.Checked := false;
  CheckBox20.Checked := false;
  Memo1.Clear ;

  Fosc :=7.3728;
  Baud0 :=9600 ;
  Baud1 :=9600 ;  
  U2X0  :=2;
  U2X1  :=2;
  
  UBRR0 :=0;
  UCSR0A:=0;
  UCSR0B:=0;
  UCSR0C:=134;           //  10000110
  UBRR1 :=0;
  UCSR1A:=0;
  UCSR1B:=0;
  UCSR1C:=6;             //  10000110
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
var
  UBRR0L,UBRR1L : integer;
  UBRR0H,UBRR1H : integer;
  ubrr_t0,ubrr_t1: Real;
  Baud_c0,Baud_c1 : integer;
  Baud_t0,Baud_t1: Real;
  ubrr_s0,ubrr_s1 : string;
  wucha0,wucha1 : string;
  kkk   : string;
begin
  Memo1.Clear ;
      //ICC-AVR application builder : 2006-8-17 15:45:00
  Memo1.Lines.Add('/'+'/----------------------------------------------------------------------');
  Memo1.Lines.Add('/'+'/程序由AVR串口开发工具V1.0自动生成     ' );
  Memo1.Lines.Add('/'+'/MCU系统的处理器为:    '+ComboBox3.Text );
  Memo1.Lines.Add('/'+'/MCU系统的晶振频率:    '+FloatToStr(Fosc)+' Mhz');
  Memo1.Lines.Add('/'+'/-------------------------------------------------------------------');
  Memo1.Lines.Add('');

  kkk:=ComboBox3.Text ;
  if (kkk ='ATMega64') or (kkk ='ATMega128')then
  begin
     if CheckBox3.Checked =true then
     begin
        ubrr_t0 :=(Fosc*1000000/8/U2X0/Baud0)-1 ;
        ubrr_s0 :=Format('%2.0f',[ubrr_t0]);
        UBRR0 :=StrToInt(ubrr_s0) ;
        UBRR0L:=UBRR0 mod 256 ;
        UBRR0H:=trunc(UBRR0/256) ;
        Baud_t0:=Fosc*1000000/8/U2X0/(UBRR0+1) ;
        Baud_c0:=trunc(Baud_t0) ;
        wucha0 :=Format('%2.3f',[(Baud_c0-Baud0)*100/Baud0]);

        LabeledEdit1.Text :=ubrr_s0;
        Memo1.Lines.Add('/'+'/-------------------------------------------------------------------');
        Memo1.Lines.Add('/'+'/串口0初始化子程序');
        Memo1.Lines.Add('/'+'/字符长度:'+ComboBox4.Text );
        Memo1.Lines.Add('/'+'/奇偶校验:'+ComboBox5.Text );
        if CheckBox21.Checked =true then
           Memo1.Lines.Add('/'+'/通讯模式:同步' )
        else
           Memo1.Lines.Add('/'+'/通讯模式:异步' );
        if CheckBox6.Checked =true then
           Memo1.Lines.Add('/'+'/多处理器通讯模式' );
        Memo1.Lines.Add('/'+'/-------------------------------------------------------------------');
        Memo1.Lines.Add('void Uart0_Init(void)');
        Memo1.Lines.Add('{');
        Memo1.Lines.Add('    UCSR0B  =  0x00'+';  '+'   /'+'/disable while setting baud rate') ;
        Memo1.Lines.Add('    UCSR0A  =  0x'+IntToHex(UCSR0A,2)+';  '+'   /'+'/Bit1为1则倍速发送') ;
        Memo1.Lines.Add('    UCSR0C  =  0x'+IntToHex(UCSR0C,2)+';  ') ;
        Memo1.Lines.Add('    UBRR0L  =  0x'+IntToHex(UBRR0L,2)+';  '+'   /'+'/波特率:'+IntToStr(Baud0)+' Bps') ;
        Memo1.Lines.Add('    UBRR0H  =  0x'+IntToHex(UBRR0H,2)+';  '+'   /'+'/误差率:'+wucha0+'%') ;
        Memo1.Lines.Add('    UCSR0B  =  0x'+IntToHex(UCSR0B,2)+';  ') ;
        Memo1.Lines.Add('}');
        if CheckBox9.Checked =true then
        begin
           Memo1.Lines.Add('/'+'/-------------------------------------------------------------------');
           Memo1.Lines.Add('/'+'/串口0接收中断子程序');
           Memo1.Lines.Add('/'+'/-------------------------------------------------------------------');
           Memo1.Lines.Add('#pragma interrupt_handler Uart0_Rx_Isr:iv_USART0_RX');
           Memo1.Lines.Add('void Uart0_Rx_Isr(void)');
           Memo1.Lines.Add('{');
           Memo1.Lines.Add('/'+'/uart has received a character in UDR0');
           Memo1.Lines.Add('}');
        end;
        if CheckBox11.Checked =true then
        begin
           Memo1.Lines.Add('/'+'/-------------------------------------------------------------------');
           Memo1.Lines.Add('/'+'/串口0发送中断子程序');
           Memo1.Lines.Add('/'+'/-------------------------------------------------------------------');
           Memo1.Lines.Add('#pragma interrupt_handler Uart0_Tx_Isr:iv_USART0_TX');
           Memo1.Lines.Add('void Uart0_Tx_Isr(void)');
           Memo1.Lines.Add('{');
           Memo1.Lines.Add('/'+'/character has been transmitted');
           Memo1.Lines.Add('}');
        end;
        if CheckBox8.Checked =true then
        begin
           Memo1.Lines.Add('/'+'/-------------------------------------------------------------------');
           Memo1.Lines.Add('/'+'/串口0数据寄存器空中断子程序');
           Memo1.Lines.Add('/'+'/-------------------------------------------------------------------');
           Memo1.Lines.Add('#pragma interrupt_handler Uart0_Udre_Isr:iv_USART0_UDRE');
           Memo1.Lines.Add('void Uart0_Udre_Isr(void)');
           Memo1.Lines.Add('{');
           Memo1.Lines.Add('/'+'/Character transferred to shift register so UDR0 is now empty');
           Memo1.Lines.Add('}');
        end;
     end;
     if CheckBox10.Checked =true then
     begin
        ubrr_t1 :=(Fosc*1000000/8/U2X1/Baud1)-1 ;
        ubrr_s1 :=Format('%2.0f',[ubrr_t1]);
        UBRR1 :=StrToInt(ubrr_s1) ;
        UBRR1L:=UBRR1 mod 256 ;
        UBRR1H:=trunc(UBRR1/256) ;
        Baud_t1:=Fosc*1000000/8/U2X1/(UBRR1+1) ;
        Baud_c1:=trunc(Baud_t1) ;
        wucha1 :=Format('%2.3f',[(Baud_c1-Baud1)*100/Baud1]);

        LabeledEdit2.Text :=ubrr_s1;
        Memo1.Lines.Add('/'+'/-------------------------------------------------------------------');
        Memo1.Lines.Add('/'+'/串口1初始化子程序');
        Memo1.Lines.Add('/'+'/字符长度:'+ComboBox7.Text );
        Memo1.Lines.Add('/'+'/奇偶校验:'+ComboBox8.Text );
        if CheckBox22.Checked =true then
           Memo1.Lines.Add('/'+'/通讯模式:同步' )
        else
           Memo1.Lines.Add('/'+'/通讯模式:异步' );
        if CheckBox15.Checked =true then
           Memo1.Lines.Add('/'+'/多处理器通讯模式' );
        Memo1.Lines.Add('/'+'/-------------------------------------------------------------------');
        Memo1.Lines.Add('void Uart1_Init(void)');
        Memo1.Lines.Add('{');
        Memo1.Lines.Add('    UCSR1B  =  0x00'+';  '+'   /'+'/disable while setting baud rate') ;
        Memo1.Lines.Add('    UCSR1A  =  0x'+IntToHex(UCSR1A,2)+';  '+'   /'+'/Bit1为1则倍速发送') ;
        Memo1.Lines.Add('    UCSR1C  =  0x'+IntToHex(UCSR1C,2)+';  ') ;
        Memo1.Lines.Add('    UBRR1L  =  0x'+IntToHex(UBRR1L,2)+';  '+'   /'+'/波特率:'+IntToStr(Baud1)+' Bps') ;
        Memo1.Lines.Add('    UBRR1H  =  0x'+IntToHex(UBRR1H,2)+';  '+'   /'+'/误差率:'+wucha1+'%') ;
        Memo1.Lines.Add('    UCSR1B  =  0x'+IntToHex(UCSR1B,2)+';  ') ;
        Memo1.Lines.Add('}');
        if CheckBox18.Checked =true then
        begin
           Memo1.Lines.Add('/'+'/-------------------------------------------------------------------');
           Memo1.Lines.Add('/'+'/串口1接收中断子程序');
           Memo1.Lines.Add('/'+'/-------------------------------------------------------------------');
           Memo1.Lines.Add('#pragma interrupt_handler Uart1_Rx_Isr:iv_USART1_RX');
           Memo1.Lines.Add('void Uart1_Rx_Isr(void)');
           Memo1.Lines.Add('{');
           Memo1.Lines.Add('/'+'/Uart1 has received a character in UDR1');
           Memo1.Lines.Add('}');
        end;
        if CheckBox19.Checked =true then
        begin
           Memo1.Lines.Add('/'+'/-------------------------------------------------------------------');
           Memo1.Lines.Add('/'+'/串口1发送中断子程序');
           Memo1.Lines.Add('/'+'/-------------------------------------------------------------------');
           Memo1.Lines.Add('#pragma interrupt_handler Uart1_Tx_Isr:iv_USART1_TX');
           Memo1.Lines.Add('void Uart1_Tx_Isr(void)');
           Memo1.Lines.Add('{');
           Memo1.Lines.Add('/'+'/Character has been transmitted');
           Memo1.Lines.Add('}');
        end;
        if CheckBox17.Checked =true then
        begin
           Memo1.Lines.Add('/'+'/-------------------------------------------------------------------');
           Memo1.Lines.Add('/'+'/串口1数据寄存器空中断子程序');
           Memo1.Lines.Add('/'+'/-------------------------------------------------------------------');
           Memo1.Lines.Add('#pragma interrupt_handler Uart1_Udre_Isr:iv_USART1_UDRE');
           Memo1.Lines.Add('void Uart1_Udre_Isr(void)');
           Memo1.Lines.Add('{');
           Memo1.Lines.Add('/'+'/Character transferred to shift register so UDR1 is now empty');
           Memo1.Lines.Add('}');
        end;
     end;
  end
  else
  begin
     ubrr_t0 :=(Fosc*1000000/8/U2X0/Baud0)-1 ;
     ubrr_s0 :=Format('%2.0f',[ubrr_t0]);
     UBRR0 :=StrToInt(ubrr_s0) ;
     UBRR0L:=UBRR0 mod 256 ;
     UBRR0H:=trunc(UBRR0/256) ;
     Baud_t0:=Fosc*1000000/8/U2X0/(UBRR0+1) ;
     Baud_c0:=trunc(Baud_t0) ;
     wucha0 :=Format('%2.3f',[(Baud_c0-Baud0)*100/Baud0]);

     LabeledEdit1.Text :=ubrr_s0;
     Memo1.Lines.Add('/'+'/-------------------------------------------------------------------');
     Memo1.Lines.Add('/'+'/串口初始化子程序');
     Memo1.Lines.Add('/'+'/字符长度:'+ComboBox4.Text );
     Memo1.Lines.Add('/'+'/奇偶校验:'+ComboBox5.Text );
     if CheckBox21.Checked =true then
        Memo1.Lines.Add('/'+'/通讯模式:同步' )
     else
        Memo1.Lines.Add('/'+'/通讯模式:异步' );
     if CheckBox6.Checked =true then
        Memo1.Lines.Add('/'+'/多处理器通讯模式' );
     Memo1.Lines.Add('/'+'/-------------------------------------------------------------------');
     Memo1.Lines.Add('void Uart_Init(void)');
     Memo1.Lines.Add('{');
     Memo1.Lines.Add('    UCSRB  =  0x00'+';  '+'   /'+'/disable while setting baud rate') ;
     Memo1.Lines.Add('    UCSRA  =  0x'+IntToHex(UCSR0A,2)+';  '+'   /'+'/Bit1为1则倍速发送') ;
     Memo1.Lines.Add('    UCSRC  =  0x'+IntToHex(UCSR0C,2)+';  ') ;
     Memo1.Lines.Add('    UBRRL  =  0x'+IntToHex(UBRR0L,2)+';  '+'   /'+'/波特率:'+IntToStr(Baud0)+' Bps') ;
     Memo1.Lines.Add('    UBRRH  =  0x'+IntToHex(UBRR0H,2)+';  '+'   /'+'/误差率:'+wucha0+'%') ;
     Memo1.Lines.Add('    UCSRB  =  0x'+IntToHex(UCSR0B,2)+';  ') ;
     Memo1.Lines.Add('}');
     if CheckBox9.Checked =true then
     begin
        Memo1.Lines.Add('/'+'/-------------------------------------------------------------------');
        Memo1.Lines.Add('/'+'/串口接收中断子程序');
        Memo1.Lines.Add('/'+'/-------------------------------------------------------------------');
        Memo1.Lines.Add('#pragma interrupt_handler Uart_Rx_Isr:iv_USART_RX');
        Memo1.Lines.Add('void Uart_Rx_Isr(void)');
        Memo1.Lines.Add('{');
        Memo1.Lines.Add('/'+'/uart has received a character in UDR');
        Memo1.Lines.Add('}');
     end;
     if CheckBox11.Checked =true then
     begin
        Memo1.Lines.Add('/'+'/-------------------------------------------------------------------');
        Memo1.Lines.Add('/'+'/串口发送中断子程序');
        Memo1.Lines.Add('/'+'/-------------------------------------------------------------------');
        Memo1.Lines.Add('#pragma interrupt_handler Uart_Tx_Isr:iv_USART_TX');
        Memo1.Lines.Add('void Uart_Tx_Isr(void)');
        Memo1.Lines.Add('{');
        Memo1.Lines.Add('/'+'/character has been transmitted');
        Memo1.Lines.Add('}');
     end;
     if CheckBox8.Checked =true then
     begin
        Memo1.Lines.Add('/'+'/-------------------------------------------------------------------');
        Memo1.Lines.Add('/'+'/串口数据寄存器空中断子程序');
        Memo1.Lines.Add('/'+'/-------------------------------------------------------------------');
        Memo1.Lines.Add('#pragma interrupt_handler Uart_Udre_Isr:iv_USART_UDRE');
        Memo1.Lines.Add('void Uart_Udre_Isr(void)');
        Memo1.Lines.Add('{');
        Memo1.Lines.Add('/'+'/Character transferred to shift register so UDR is now empty');
        Memo1.Lines.Add('}');
     end;
  end;
end;

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
  Baud0 :=StrToInt(ComboBox1.Text);
end;

procedure TForm1.ComboBox2Change(Sender: TObject);
begin
  Fosc :=StrToFloat(ComboBox2.Text);
end;

procedure TForm1.CheckBox1Click(Sender: TObject);
begin
  if CheckBox1.Checked =true then
  begin
     U2X0   :=1;
     UCSR0A :=UCSR0A or 2;          //倍速
  end
  else
  begin
     U2X0   :=2;
     UCSR0A :=UCSR0A and 253;
  end;
end;

procedure TForm1.Label4MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  Label4.Font.Style:=Label4.Font.Style+[fsUnderline];
  Label4.Font.Color :=clBlue;
  Label4.Cursor :=crHandPoint;
end;

⌨️ 快捷键说明

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