⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tlc25431.c

📁 TLC2543模数转换驱动。。。电子设计大赛设计的模数转换驱动。。。调试可用
💻 C
字号:
#include<reg51.h>
#include <intrins.h> 
#define uchar unsigned char
#define uint  unsigned int

sbit CLOCK=P2^7; 	/*2543时钟*/
sbit D_IN=P2^6;  	/*2543输入*/
sbit D_OUT=P2^4; 	/*2543输出*/
sbit _CS=P2^5;   	/*2543片选*/

sbit E=P3^4;	 	/*使能端 高电平有效*/
sbit RS=P3^5;	 	/*'1'为数据 '0'为命令*/
sbit RW=P3^6;	 	/*'1'为读取 '0'为写入*/
const uchar NoDisp=0;
const uchar NoCur=1;
const uchar CurNoFlash=2;
const uchar CurFlash=3;

void mdelay(uint z)	/*1ms延时子程序*/
{
	uint x,y;
	for(x=z;x>0;x--)
		for(y=110;y>0;y--);
}

void delay(uchar n)	/*2543中的延时子程序*/
{
	uchar i;
	for(i=0;i<n;i++)
	{
	   _nop_();
	}
}

//~~~~~~~~~~~~~~~~~~~液晶显示驱动~~~~~~~~~~~~~~~~~~~~
void WaitIdle()
{
	
	RS=0;
	RW=1;
	_nop_(); 			  
	E=1;
	mdelay(5);
	while((P0&0x80)==0x80)//控制字最高位为'1' 才能允许读写操作
	{
		 E=0;   		  //这两句protues仿真必须加;仿真器仿真也通过。
		 E=1;  
	};
	E=0;
}

void LcdWcn(uchar c)	//无忙时检测 向液晶写入命令
{
	RS=0;
	RW=0;
	P0=c;
	mdelay(5);
	E=1;
	mdelay(5);
	E=0;
}

void LcdWc(uchar c)		//有忙时检测 向液晶写入命令		
{
	WaitIdle();
	LcdWcn(c);
}

void LcdWd(uchar c)		//有忙时检测 向液晶写入数据
{
	WaitIdle();
	RS=1;
	RW=0;
	P0=c;
	mdelay(5);
	E=1;
	mdelay(5);
	mdelay(5);
	E=0;
}

void ClrLcd()			//显示清屏
{
	LcdWc(0x01);
}

void RstLcd()			//初始化
{
	E=0;
	LcdWc(0x38);		//显示模式设置 16*2
	LcdWc(0x0f);		//开显示 开光标 光标闪烁
	LcdWc(0x06);		//读或写一个字节侯 光标加1 指针加1
	LcdWc(0x01);		//显示清屏
}

void SetCur(uchar Para)				
{
	mdelay(2);
	switch(Para)
	{								//光标模式设置
		case 0:LcdWc(0x08);break;	// NoDisp
		case 1:LcdWc(0x0c);break;	// NoCur
		case 2:LcdWc(0x0e);break;	// CurNoFlash
		case 3:LcdWc(0x0f);break;	// CurFlash
		default:break;
	}
}

void LcdPos(uchar xPos,uchar yPos)
{
	uchar tmp;
	xPos&=0x0f;			//列定位 最大为16列
	yPos&=0x01;			//行定位 最大为2行
	if(yPos==0)
		tmp=xPos;
	else
		tmp=xPos+0x40;	//第二行第一列的地址为 0x80+0x40
	tmp|=0x80;			//第一行第一列的地址为 0x80
	LcdWc(tmp);
}

void WriteChar(uchar c,uchar xPos,uchar yPos) 
{						//在指定位置写入一个字符
	LcdPos(xPos,yPos);
	LcdWd(c);
}

void WriteString(uchar *s,uchar xPos,uchar yPos)
{						//在指定位置写入一个字符串
	uchar i;
	if(*s==0)
		return;
	for(i=0;;i++)
	{
		if(*(s+i)==0)
			break;
		WriteChar(*(s+i),xPos,yPos);
		xPos++;
		if(xPos>=15)
			break;	
	}
}

/**************************************
  名称:read2543
  功能:TLC2543驱动模块
  输入参数:port通道号
  输出参数:ad转换值
*************************************/
/*uint read2543(uchar port)
{
	uint ad=0,i;
	CLOCK=0;
	_CS=0;
	port<<=4;				  //通道号左移4位
	for(i=0;i<12;i++)		  //没有设置控制字,默认输出数据为12位,高位先送出,输出数据的格式为2进制
	{
		if(D_OUT) ad|=0x01;	  //转换后的值高位先送出
		D_IN=(bit)(port&0x80);//通道值高位先送出
		CLOCK=1;
		delay(3);
		CLOCK=0;
		delay(3);
		port<<=1;
		ad<<=1;
	}
	_CS=1;
	ad>>=1;					  //输出数据在循环中多左移了一位
	return ad; 
}
*/
uint read2543(uchar port) //从TLC1543读取采样值,形参port是采样的通道号
{
	uchar mRetADHi,mRetADLo;  //返回的测量值的高4位、低8位
	uchar mTemp;
	CLOCK=0;
	_CS=0;
	mRetADHi=0;
	mRetADLo=0;
	//把通道号(4位)打入2543    **代码虽然麻烦,但编译后的执行速度很快**
	D_IN=(bit)(port&0x08);
	CLOCK=1;
	mTemp=(uchar)D_OUT;
	mRetADHi|=mTemp<<3;
	CLOCK=0;
	D_IN=(bit)(port&0x04);
	CLOCK=1;
	mTemp=(uchar)D_OUT;
	mRetADHi|=mTemp<<2;
	CLOCK=0;
	D_IN=(bit)(port&0x02);
	CLOCK=1;
	mTemp=(uchar)D_OUT;
	mRetADHi|=mTemp<<1;
	CLOCK=0;
	D_IN=(bit)(port&0x01);
	CLOCK=1;
	mTemp=(uchar)D_OUT;
	mRetADHi|=mTemp;
	CLOCK=0;
	
	
	//参数设定开始
	//注意:参数的设定只对下一周期的测量有效,对本次取样没有作用
	D_IN=0;
	CLOCK=1;
	mTemp=(uchar)D_OUT;
	mRetADLo|=mTemp<<7;
	CLOCK=0;   //选择12位的数据长度
	D_IN=0;
	CLOCK=1;
	mTemp=(uchar)D_OUT;
	mRetADLo|=mTemp<<6;
	CLOCK=0;
	D_IN=0;
	CLOCK=1;
	mTemp=(uchar)D_OUT;
	mRetADLo|=mTemp<<5;
	CLOCK=0;  //高位在前输出
	D_IN=0;
	CLOCK=1;
	mTemp=(uchar)D_OUT;
	mRetADLo|=mTemp<<4;
	CLOCK=0;  //单极性输出
	//参数设定结束
	
	CLOCK=1;   //填充4个任意位
	mTemp=(uchar)D_OUT;
	mRetADLo|=mTemp<<3;
	CLOCK=0;
	CLOCK=1;
	mTemp=(uchar)D_OUT;
	mRetADLo|=mTemp<<2;
	CLOCK=0;
	CLOCK=1;
	mTemp=(uchar)D_OUT;
	mRetADLo|=mTemp<<1;
	CLOCK=0;
	CLOCK=1;
	mTemp=(uchar)D_OUT;
	mRetADLo|=mTemp;
	CLOCK=0;

	_CS=1;
	
	return (uint)(mRetADHi*256+mRetADLo);
}

void main()
{
	uint ad0=0;
	uchar xPos0,yPos0,xPos1,yPos1;
	uchar A1,A2,A3;
	uchar * s0;
	RstLcd();
	ClrLcd();
	SetCur(NoCur);

	xPos0=0;yPos0=0;			//显示模拟通道'0'转化数据 
	s0="channel0:";
	WriteString(s0,xPos0,yPos0);
	xPos1=10;yPos1=0;			//显示小数点
	WriteChar('.',xPos1,yPos1);
	xPos1=13;yPos1=0;			//显示'V'
	WriteChar('V',xPos1,yPos1);

	xPos0=0;yPos0=1; 			
	s0="channel1:";
	WriteString(s0,xPos0,yPos0);
	xPos1=10;yPos1=1; 			
	WriteChar(0x2e,xPos1,yPos1);
	xPos1=13;yPos1=1;
	WriteChar('V',xPos1,yPos1);

	while(1)
	{
		ad0=read2543(0); 	 //0通道
		ad0=ad0*1.0/4096*500;//注意这一步不能写成 ad=ad*500/4096
		ad0=ad0*2;			 // 0通道扩展量程0~10V

		A1=ad0/100;			//百位
	   	A2=ad0%100/10;  	//十位
	   	A3=ad0%10;			//个位

		xPos1=9;yPos1=0;
		WriteChar(0x30+A1,xPos1,yPos1);
		xPos1=11;yPos1=0;
		WriteChar(0x30+A2,xPos1,yPos1);
		xPos1=12;yPos1=0;
		WriteChar(0x30+A3,xPos1,yPos1);


		ad0=read2543(1); //1通道
		ad0=ad0*1.0/4096*500;//注意这一步不能写成 ad=ad*500/4096
		
		A1=ad0/100;//百位
	   	A2=ad0%100/10;//十位
	   	A3=ad0%10;//个位
		
		xPos1=9;yPos1=1;
		WriteChar(0x30+A1,xPos1,yPos1);
		xPos1=11;yPos1=1;
		WriteChar(0x30+A2,xPos1,yPos1);
		xPos1=12;yPos1=1;
		WriteChar(0x30+A3,xPos1,yPos1);
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -