/**/ /* TLC2543芯片AD转换例子,采集第2通道AIN2的电压数据,并通过串口发送转换结果 发送格式为:“转换结果,毫伏数值”。每隔150ms闪亮LED灯。*/ #include < mega8535.h > #include < delay.h > #include < stdio.h > #define uchar unsigned char #define uint unsigned int #define _LED PORTD.6 #define TXEN 3 #define TCL2543_EOC PINB.4 // EOC输出信号 #define TCL2543_CLK PORTB.3 // 时钟信号 #define TCL2543_ADIN PORTB.2 // 数据输入端 #define TCL2543_DOUT PINB.1 // 数据输出端 #define TCL2543_CS PORTB.0 // 片选信号 #define TCL2543_DDR 0x0D // 0000 1101 uchar ct = 0 ; void Init( void ) ... { DDRD = 0xFF; PORTD = 0xFF; DDRB = TCL2543_DDR; PORTB = 0xFF; // T = 1024*108/11.0592 = 10000us = 10ms TCCR0 = 0x05; // 1024分频, 11.0592M, 10ms定时 TCNT0 = 148; // 初值。计数=256-148 = 108 TIMSK |= 0x01; // T/C0 溢出中断使能 UBRRH = 0; UBRRL = 71; // 9600bps, 11.0592MHz UCSRB = (1<<TXEN); // 发送器使能 SREG.7 = 1; // 全局中断使能 TCL2543_CS = 0; //初始化TLC2543 TCL2543_CS = 1; TCL2543_CLK = 0;} void delay(uchar n) ... { uchar i; for(i=0; i<n; i++) #asm("nop"); } // 功能:TLC2543驱动模块 // 输入参数:port通道号 // 输出参数:ad转换值 uint read2543(uchar port) ... { uint ad=0, i; if(TCL2543_EOC == 0) return 0; // 转换没有结束或不允许转换 TCL2543_CLK=0; TCL2543_CS=0; port<<=4; for(i=0;i<12;i++) ...{ if(TCL2543_DOUT) ad |= 0x01; if(port&0x80) TCL2543_ADIN = 1; else TCL2543_ADIN = 0; TCL2543_CLK=1; delay(3); TCL2543_CLK=0; delay(3); port<<=1; ad<<=1; } TCL2543_CS=1; ad>>=1; return(ad); } void main( void ) ... { uint t; float p; Init(); while(1) ...{ delay_ms(250); t = read2543(2);// 得到转换结果 p = (float)t; p = p/4096.0; p = 5000.0*p; // 转换为毫伏数值,参考电压为5000mV printf("%d,", t); t = (uint)p; printf("%d ", t); } } // 10ms定时 interrupt [TIM0_OVF] void Timer0( void ) ... { TCNT0 = 148; if(++ct == 15) // 150ms ...{ ct = 0; _LED = ~_LED; }}