资讯详情

AVR与VB通信模拟量输入简单程序

//---------------------------------------- 代码------------------------ #include #include #define uchar unsigned char #define uint unsigned int uchar seg[10]={0x3f,0x06,0x5b, //共阴极 0~9的字形码 0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; uchar tab[4]={0xfe,0xfd,0xfb,0xf7};//4位共阴极数码管的位选码 #define UDRE 5 #define RXC 7 uchar datt; //接受到的数据比较变量 uchar adc_val; //模拟量转换值 void delay(uint k) { while(k--); } void port_init() { PORTA=0x7f; // 通道7作为模拟量输入 A=0x7f; PORTB=0xff; DDRB=0xff; PORTC=0xff; DDRC=0xff; PORTD=0xff; DDRD=0xff; } void adc_init() //模拟量初始化 { A SRA=0xe3; A UX=0xc7; } uint adc_vert() { uint temp1,temp2; temp1=(uint)ADCL; temp2=(uint)ADCH; temp2=(temp2<<8)+temp1; return temp2; } void time0_init() //定时器0初始化 { TC 0=0x83; TCCR0=0x03; MSK=0x01; //定时器0溢出中断 } #pragma vector = 0x24 __interrupt void time0_vef() { static uchar i; TCNT0=0x83; i++; if(i>3)i=0; switch(i) { case 0:PORTA=seg[adc_val%10];PORTC=tab[0];break; case 1:PORTA=seg[adc_val%100/10];PORTC=tab[1];break; case 2:PORTA=seg[adc_val%1000/100];PORTC=tab[2];break; case 3:PORTA=seg[adc_val/1000];PORTC=tab[3];break; default:break; } } void uart_init() { UCSRB=0x00; //串口不使能 UCSRA=0x02; //串口倍速模式 UCSRC=0x06; //数据长度设置为8位 UBRRL=0x67; //串口设置为9600波特率 UBRRH=0x00; UCSRB=0x98; //串口接受和发送使能,接受中断使能 } void uart_send(uchar k) //串口发送函数 { while(!(UCSRA&(1<<UDRE))); UDR=k; } uchar uart_receive() { while(!(UCSRA&(1<<RXC))); //接受结束读出数据 return UDR; } void send_number(uint k) { uart_send((uchar)(k>>8)); uart_send((uchar)(k)); } #pragma vector = 0x2c __interrupt void uart_rxc() { datt=UDR; if(datt=='a')PORTB=0xff; else PORTB=0x00; } void main() { port_init(); uart_init(); time0_init(); adc_init(); SREG=0x80; while(1) { adc_val=adc_vert(); delay(50000); delay(50000); delay(50000); send_number(adc_val); } } //----------------------VB代码---------------------------- Private Sub Command1_Click() MSComm1.CommPort = 4 MSComm1.PortOpen = True MSComm1.InputMode = comInputModeBinary MSComm1.InputLen = 0 Private Sub MSComm1_OnComm() Dim bytereceive() As Byte '定义字节数组 Dim strbuf As String '定义字符串变量 Select Case MSComm1.CommEvent Case comEvReceive '接受事件发生 Text2 = MSComm1.InBufferCount '显示接受缓冲区字节数 strbuf = MSComm1.Input '从输入缓冲区读取字符 bytereceive() = strbuf '字符串赋值给字符数组,低字节在前,高字节在后 Dim i As Integer For i = 0 To UBound(bytereceive) 'UBound返回数组可用的最大长度 If Len(Hex(bytereceive(i))) = 1 Then strdata = strdata & "0" & Hex(bytereceive(i)) Else strdata = strdata & Hex(bytereceive(i)) End If Next Text1.Text = strdata '十六进制显示 Text3.Text = Val("&H" & strdata) '十进制显示 strdata = "" End Select End Sub -电子元器件采购网(www.ruidan.com)是本土元器件目录分销商,采用“小批量、现货、样品”销售模式,致力于满足客户多型号、高质量、快速交付的采购需求。 自建高效智能仓储,拥有自营库存超过50,000种,提供一站式正品现货采购、个性化解决方案、选型替代等多元化服务。
锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台