竞赛题名称:基于C语言的89C51与TLC2543AD转换器的驱动程序的设计
队员名称:
评阅人签名:
设计思路:
硬件部分基于80C51单片机和TLC2543组成多路数据采集系统,采用89C51作为控制部件,控制数据的采集、显示、传输,它是整个系统的核心。由TLC2543作为此数据采集系统的A/D转换芯片,进行模数转换得到模拟信号测量值,它使用开关电容逐次逼近技术完成A/D转换过程由于是串行输入结构,能够节省51系列单片机的I/O资源。硬件设计的主要任务是TLC2543和单片机的接口电路设计,输入信号的调理电路设计。
软件部分主要涉及A/D转换程序的编写,1602LCD驱动的编写,从TLC2543所接收数据的处理等。
原理框图:见图1。
图1 模数转换系统框图
图2 模数转换系统原理图
算法1:
for(i=0;i<6;i++)
{
ad_result=AD_Conver(0);
sum+=ad_result;
}
ad=sum*5.0/4096/6;
说明:对TLC2543的返回值ad_result进行求和,然后取平均数。
算法2:
num[0]=ad_result/10000+'0';
num[2]=ad_result%10000/1000+'0';
num[3]=ad_result%1000/100+'0';
num[4]=ad_result%100/10+'0';
num[5]=ad_result%10+'0';
说明:分别求出LCD显示数值各位的数值。
1602LCD程序流程图,见图3。
图3 1602LCD程序流程图
主程序流程图,见图4。
图4 主程序流程图
由探针对模拟信号输入端口进行电压测量,数值为2.71192V,见图5。
图5
对模拟信号采样并处理,得模拟信号输入端口电压测量值为2.7111V,见图6。
图6
滑动滑动变阻器改变模拟输入端口电压,共测得数据5组数据,见表1。
表1
测试数据分析:
=0.0008
=0.0001
=0.0012 (舍去)
=0.0002
=0.0005
误差平均值:+++
0.0008
结论:由以上计算结果可知,该系统误差较小,能满足日常所需的测量精度要求,同时反映出TLC2543模数转换芯片具有误差小,分辨率较高,因此在仪器仪表中有较为广泛的应用。
附件一:程序源代码
- #include
- #include
- #define uchar unsigned char
- #define uint unsigned int
- ***it RS=P3^5;
- ***it RW=P3^6;
- ***it E=P3^4;
- ***it BF=P0^7; //1602忙碌标志位
- void delay1ms()
- {uchar i,j;
- for(i=0;i<10;i++)
- for(j=0;j<33;j++)
- ; }
- void delay(uchar n) //延时n毫秒
- {uchar i;
- for(i=0;idelay1ms();}
- unsigned char BusyTest(void) //result=1为忙碌;result=0为不忙碌
- {bit result;
- RS=0;
- RW=1; //高电平进行读操作
- E=1; //E=1,才允许读写
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- result=BF;
- E=0;
- return result;}
- void WriteInstruction (uchar dictate) //写指令
- { while(BusyTest()==1);
- RS=0; //RS和R/W同时为低电平时,可以写入指令
- RW=0;
- E=0;
- _nop_();
- _nop_();
- P0=dictate;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- E=1;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- E=0;}
- void WriteAddress(uchar x) //写地址
- {WriteInstruction(x|0x80); //显示位置的确定方法规定为"80H+地址码x"
- }
- void WriteData(uchar y)
- { while(BusyTest()==1);
- RS=1; //RS为高电平,RW为低电平时,写入数据
- RW=0;
- E=0;
- P0=y;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- E=1;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- E=0;}
- void LcdInitiate(void) //初始化
- {delay(15);
- WriteInstruction(0x38); //显示模式设置:16×2显示,5×7点阵,8位数据接口
- delay(5);
- WriteInstruction(0x38);
- delay(5);
- WriteInstruction(0x38);
- delay(5);
- WriteInstruction(0x0f); //显示模式设置:显示开,有光标,光标闪烁
- delay(5);
- WriteInstruction(0x06); //显示模式设置:光标右移,字符不移
- delay(5);
- WriteInstruction(0x01); //清屏幕指令,将以前的显示内容清除
- delay(5);}
- ***it CLOCK=P1^3;
- ***it DATA_IN=P1^1;
- ***it DATA_OUT=P1^0;
- ***it CS=P1^2;
- void delay1()
- {int i=5;
- while(i--);}
- uint AD_Conver(uchar channel) //选择输入通道
- {uchar i;
- int ad_value=0;
- CLOCK=0;
- CS=1;
- delay1();
- CS=0;
- channel<<=4; //左移4位
- for(i=0;i<12;i++)
- { if(DATA_OUT)ad_value|=1;
- DATA_IN=(bit)(channel&0x80);
- CLOCK=1;
- delay1();
- CLOCK=0;
- channel<<=1;
- ad_value<<=1;}
- CLOCK=1;
- ad_value>>=1;
- return ad_value; //返回转换数据
- }
- void main()
- { int ad_result;
- uint i;
- float ad;
- uint num[]={'0','.','0','0','0','0','V',' ',' ',' ',' ',' '};
- uint csu[]={' ',' ',' ',' ',' ','C',' ','S',' ','U',' ',' ',' ',' ',' '};
- ad_result=AD_Conver(0);
- delay(100);
- while(1)
- {uint sum;
- sum=0;
- for(i=0;i<6;i++)
- {
- ad_result=AD_Conver(0);
- sum+=ad_result;}
- ad=sum*5.0/4096/6; //4096为2的12次方,6为求平均数
- ad_result=(int)(ad*10000); //转换为整形变量
- num[0]=ad_result/10000+'0';
- num[2]=ad_result%10000/1000+'0';
- num[3]=ad_result%1000/100+'0';
- num[4]=ad_result%100/10+'0';
- num[5]=ad_result%10+'0';
- LcdInitiate();
- WriteAddress(0x80); //第一行第一列显示
- for(i=0;i<15;i++)
- {WriteData(num);
- delay(850);}
- WriteAddress(0xc0); //第二行第一列显示
- for(i=0;i<15;i++)
- {WriteData(csu);
- delay(850);}
- delay(10000);}
- }
附件二:TLC2543时序图
完整版本的论文请下载附件:
|