#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char 湖北中医学院学报
sbit clock=P0^1; //显示时钟线 能源污染
sbit CS=P2^1; //TLC1543与89c52的接口连接线路
sbit DOUT=P2^3; //AD串行数据线
sbit ADIN=P2^2; //AD地选择端 张思来
sbit CLOCK=P2^0; //AD时钟线
uint a,i,j,k,m,ad,mileage,cost;
unsigned char code szi[]={0X11,0X7D,0X23,0X29,0X4D,0X89,0X81,0X3D,0X01,0X09};//控制字0~9
void delay(uint z) //延时程序
{
uint x,y;
for(x=10;x>0;x--)
for(y=z;y>0;y--);
}
void display(uint x,uint y) //显示子程序
{
uchar a;
uint c;
m=y%10; //一个十位数 变成两个个位数显示
k=y/10;
j=x%10;
i=x/10;
for (c=0;c<4;c++) //每次送四个数字
{
if(c==0) a=szi[i]; //调用数组中的控制字 else if(c==1) a=szi[j] ;
else if(c==2) a=szi[k] ;
else a=szi[m];
for(i=0;i<8;i++) //每个数字需要送8位
{
clock=0; //clock=0和clock=1是给74ls164一个下降沿,每次下降沿送一个位 data1=a&1;
a=a>>1;
clock=1;
}
}
delay(10000);
}
uint readTLC1543(uchar port) //调用串行AD转换子程序
{
uint i;
uchar datah,datal; //datah表示十位有效数字中的高两位,datal表示十位数据中的低八位数据
CLOCK=0; //根据时序图分别设置CS,CLOCK,EOC
CS=0; //片选端
//EOC=1; //表明数据转换中
port<<=4; //用port的值来选择是哪个AD芯片的哪个通道
for(i=0;i<4;i++)//把通道写入TLC1543芯片中
{
ADIN=(bit)(port&0x80);
经济研究导刊
CLOCK=1;
CLOCK=0; //只需要CLOCK一个下降沿就能写入,其他接口的电平不变化
阻尼线 port<<=1; //根据时序图,先写入MSB即最高位,需要左移,然后继续写下一位
}
for(i=0;i<6;i++)//填充6个CLOCK
{
CLOCK=1;
CLOCK=0;
}
CS=1;
delay(10);
CS=0; //等待AD转换
for(i=0;i<2;i++) //取D9和D8位
{
CLOCK=1;
datah<<=1;
if(DOUT) datah|=0x01;
CLOCK=0;
}
for(i=0;i<8;i++)//取D7~D0位
{
CLOCK=1;
datal<<=1;
if(DOUT) datal|=0x01;
CLOCK=0;
}
//EOC=0; //表明数据转换传输完毕
CS=1;//片选关闭
ad=datah;//高两位值赋给变量ad
ad<<=8;//数据左移8加上一步的两位,构成是十位有效数字
ad|=datal;// 把datal的值赋给ad的第八位,这样构成十位有效数字,由datah和datal组成
ad=(ad*0.004887)*1000;//输出端数据十位二进制转换成对应的电压值,即0~1023对应0~5V电压
return(ad) ;
}
void main()
{
while(1)
{
a=readTLC1543(0x01);//这里送的0x01表示采样端口为第二端口 AND1
mileage=ad/100; //去前两位数字
湖北理工学院人文社科部 cost=ad%100;//去后两位数字
display(mileage,cost);//调用显示函数
}
}