//利用TLC1549采集电压,由数码管输出采集的值(小数点后有效数两位),输入电压由可调电阻调节
#define uchar unsigned char //定义一下方便使用
#define uint unsigned int
#define ulong unsigned long
#include <reg52.h> //包括一个52标准内核的头文件
#include <intrins.h> //一个可以使用移位函数的头文件,如_nop_
sbit CS=P3^0; //定义IO口
sbit DAT=P3^1;
sbit CLK=P3^2;
ulong temp;
uchar ldelay=0;
ulong remd1,remd2;
ulong addat[10];
uchar disbit[3];
void ad_read(); //TLC1549转换数据读取函数
void trans(); //采集数据转换函数
void display(); //数码管显示函数
void main(void)
{
TMOD=0x01; //定时器0为工作方式1,16位计数
TH0=0xfc; //置计数初值,扫描时间为256*4=1024个机器时钟,约1ms
TL0=0x00;
TR0=1; //启动定时器0
ET0=1; //打开定时器0中断
EA=1; //打开总中断
P0 = 0xff; //P0口初始状态全高
temp = 0; //采集变量初始状态0
ldelay = 0; //数码管定时扫描标志位为0
while(1)
{
ad_read();
temp=addat[0]*512+addat[1]*256+addat[2]*128+addat[3]*64+addat[4]*32+addat[5]*16+addat[6]*8+addat[7]*4+addat[8]*2+addat[9];
//将采集上来的各位数据通过移位,赋给变量temp
trans();
display();
}
}
//TLC1549转换数据读取函数
void ad_read()
{
uint n=0;
CS=0;
while(n<10)
{
CLK=0;
addat[n]=DAT;
n++;
CLK=1;
}
CS=1;
}
void trans()
{
uchar code num[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
disbit[0]=num[temp/205]; //整数位
disbit[0]&=0x7f; //加上小数点
remd1=temp%205;
disbit[1]=num[remd1*10/205]; //小数第一位
remd2=(remd1*10)%205;
disbit[2]=num[remd2*10/205]; //小数第二位
}
//数码管扫描显示函数
void display()
{
uchar code disp[]={0xfb,0xfd,0xfe};
P0=disbit[ldelay];
P2=disp[ldelay];
}
//使用定时器进行数码显示的扫描
timer0() interrupt 1 //定时器0的中断号是1
{
TH0=0xfc; //重置计数初值,扫描时间为256*4=1024个机器时钟,约1ms
TL0=0x00;
ldelay++;
if(ldelay==3)
ldelay=0;
}