AD转换与数据采集
x=TLC549ADC(); y=x*50; m=y/255; P3=~tab[x/16];S0=1; delay(400); S0=0;//选通第一位数码管显示 P3=~tab[x%16];S1=1; delay(400); S1=0;//选通第二位数码管显示 P3=~tab[m/10]+0x80;S2=1; delay(400); S2=0; P3=~tab[m%10];S3=1; delay(400); S3=0; } } 调节电位器,电压从 0V 到 5V 变化,记录数码管的显示数值。记录到表中。
LCD_WRITE(table1[num],LCD_DAT); time(10); } } void write_TLC549ADC(uchar add,uchar x) { uchar ge,shi,bai,m,zh,po; uint y; bai=x/100; shi=(x%100)/10; ge=x%10; y=x*50; m=y/255; zh=m/10; po=m%10; LCD_WRITE(0x80+0x40+add,LCD_COM); LCD_WRITE(0x30+bai,LCD_DAT); LCD_WRITE(0x30+shi,LCD_DAT); LCD_WRITE(0x30+ge,LCD_DAT); LCD_WRITE(0x80+0x46+add,LCD_COM); LCD_WRITE(0x30+zh,LCD_DAT); LCD_WRITE(0x80+0x48+add,LCD_COM); LCD_WRITE(0x30+po,LCD_DAT); } void main() { uchar x;
sclk=~sclk; CLK=sclk; }
void main() {
unsigned int x; EA=1; //开总中断 ET0=1; //开定时器 0 中断 TMOD=0x22;//定时器 T1,T0 都设置为工作方式 2(8 位初值自动重装的 8 位定 时/技术器) TH0=55; TL0=55; TR0=1;//启动定时器 0,
/*********AD0809 初始化*****************/
ALE=0;
START=0;
OE=0;
CSA=1;
CSB=1;
CSC=1;
EOC=1;
while(1)
{ ALE=1; //地址锁存允许,ALE=1;A、B、C 地址被锁存
ALE=0; START=1; //正脉冲有效,上升沿逐次逼近寄存器清零,下降沿开始 AD 转换
time(120);// 设置开显示,不显示光标
LCD_WRITE(0x80,LCD_COM); for(num=0;num<15;num++) { LCD_WRITE(table[num],LCD_DAT); time(10); } LCD_WRITE(0x80+0x40,LCD_COM); for(num=0;num<14;num++) {
uchar i; uint x; CLK=0; DAT=1; CS=0; for(i=0;i<12;i++) {
CLK=1; x<<=1; if(DAT==1) x++; CLK=1; } CS=1; return (x); }
/********************************************/
7、 附加要求 实用 LTC1292、MCP3208、ADC0808 等 A/D 转换器实现此实验,或实验 LCD1602 进行上述
实验的结果显示。 /******************* TLC549ADC 转换程序******************************/
sbit CLK=P1^5; sbit DAT=P1^6; sbit CS =P1^7; uchar TLC549ADC(void) {
while(t--); }
char code tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07, 0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
void main() {
uchar x,m; uint y; while(1) {
START=0; while(!EOC); OE=1; x=P0;
//EOC=0 时,AD 正在转换 //输出允许,OE=1,转换结果可通过数据总线被读走
//读取 P0 口数据
OE=0; x=(x*50)/255; //读数扩大 10 倍
P1=x%10+(x/10%10)*16;
}
} 一、工作方式寄存器 TMOD
输入电压 V 0 0.5 1 1.5 2 2.5 3 3.5 4 4.5 5
A/D 结果 00 1A 33 4D 66 80 99 B3 CD E6 FF
显示电压 V
V=N*5/255
00 0.5 1.0 1.5 2.0 2.5 5.0 3.5 4.0 4.5 5.0
TLC549 数据采集与 LCD 显示
工作方式寄存器 TMOD 用于设置定时/计数器的工作方式,低四位用于 T0,高四位用于 T1。其格式如下
TLC549 数据采集与数码管 SEG 显示
实验程序: #include <reg52.h> #define uchar unsigned char #define uint unsigned int sbit DAT=P1^7; sbit CS=P1^6; sbit CLK=P1^5; sbit S0 =P2^7; sbit S1 =P2^6; sbit S2 =P2^5; sbit S3 =P2^4; uchar TLC549ADC(void) {
uchar i,x; CLK=0; DAT=1; CS=0; for(i=0;i<8;i++) {
CLK=1; //clk 为高电平时,读取数据 x<<=1;//串行读取数据 if(DAT==1) x++; CLK=0; } CS=1;
return (x); }
void delay(uint t) {
实验一 A/D 转换与数据采集
/*****************1000810134
1、 实验目的 (1) 掌握 A/D 转换与单片机的接口方法; (2) 掌握 A/D 芯片 TLC549 的编程方法; (3) 掌握数据采集程序的设计方法;
徐战辉************/
2、 实验内容 利用实验开发装置上的 TLC549 做 A/D 转换器,对电位器提供的模拟电压信号进行定时
实验程序:
#include <reg52.h> #define uchar unsigned char #define uint unsigned int sbit DAT=P1^7; sbit CS=P1^6; sbit CLK=P1^5;
uchar TLC549ADC(void)
{
uchar i,x;
uchar code table[]="LTC1292 Test...";
uchar code table1[]="AD= V= . v";
uchar num;
sbit LcdRS=P2^7;
CLK=0; DAT=1; CS=0;
for(i=0;i<8;i++)
{
CLK=1;
x<<=1;
if(DAT==1) x++;
CLK=0;
}
CS=1;
return (x);
} /********1000810134
徐战辉**********/
#define uchar unsigned char
#define uint unsigned int #define LCD_COM 0 // Command #define LCD_DAT 1 // Data uchar code table[]="TLC549 Test..."; uchar code table1[]="AD= V= . v"; uchar num; sbit LcdRS=P2^7; sbit LcdRW=P2^6; sbit LcdEN=P2^5;
void time(unsigned int t) {
unsigned int i; for(i=0;i<t;i++); }
void LCD_WRITE(unsigned char x,bit WS) {
P3=x; //将要写的命令字'x'送到 P3 数据总线上 LcdRW=0; LcdRS=WS;//WS=0,写命令模式;ws=1,写数据模式 LcdEN=1; time(50); LcdEN=0; }
采样,结果在数码管上进行显示。
3、 I/O 地址 A/D 转换芯片 TLC549 CLK P1.5 时钟位 DAT P1.7 数据位 CS P1.6 选片位
4、 实验线路 将 TLC549 的 CLK 接 P1.5、DAT 接 P1.7、CS 接 P1.6,将模拟电压输入端连到电位器的
电压输出端,并接万用表进行输入电压测量。
LCD_Initial(); while(1) {
time(20); x=TLC549ADC(); write_TLC549ADC(0x03,x); } }
LTC1292 采样与 LCD 显示
实验程序:
#include <reg52.h> #define uchar unsigned char #define uint unsigned int sbit DAT=P1^7; sbit CS=P1^6; sbit CLK=P1^5; void time(unsigned int t); /*******LTC1292ADC 采样程序*********/ uint LTC1292ADC(void) {