
/**//*
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;
}
}
本文介绍了一个使用TLC2543芯片进行模拟到数字转换的例子,主要采集AIN2通道的电压数据,并通过串口发送转换结果。文中详细展示了初始化设置及读取ADC转换值的方法。
3668

被折叠的 条评论
为什么被折叠?



