AD TCL549

用51控制的AD数模转换,单片机通过7个IO口控制四位数码管,其中利用HC595减少对IO口的利用,代码如下:

#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int

uchar str1[]={"        "};  
uchar str2[]={"        "};  

/*-------------------------------------------------------------*/

//TLC549管脚定义与开发板硬件对应

sbit CLK=P2^4;//时钟

sbit DO=P2^2;//数据输出

sbit CS=P2^3;//片选
sbit RCK=P2^5;
sbit SCK=P2^6;
sbit SI=P2^7;
sbit D1=P1^0;
sbit D2=P1^1;
sbit D3=P1^2;
sbit D4=P1^3;
uchar code table0[]={0xaf,0x22,0x9b,0xba,0x36,0xbc,0xbd,0x2a,0xbf,0xbe};
uchar code table[]={0xef,0x62,0xdb,0xfa,0x76,0xfc,0xfd,0x6a,0xff,0xfe};	 
void hc595(dat)
{
	uchar i;
	i=0;
	for(i=0;i<8;i++)
	{
	if((dat<<i)&0x80)
	    SI=1;
	else SI=0;
		SCK=0;
		_nop_();
	    _nop_();
		SCK=1;
	}
	RCK=0;
	_nop_();
    _nop_();
	RCK=1;
}

//获得数据

uchar TLC549_ADC(void)

{

uchar i,tmp;
CS=1;//CS置高,片选无效

CLK=0;

CS=0;//CS置低,片选有效,同时DO输

_nop_();

_nop_();//适当延迟时间1.4usSetupTime

for(i=0;i<8;i++)//串行数据移位输入

{

tmp<<=1;

tmp|=DO;

CLK=1;//0.4us

_nop_();//CLKtransitiontimeMax0.1us

CLK=0;//0.4us

}

CS=1;//CS置高,片选无效

for(i=17;i!=0;i--)
_nop_();//NextCoversion需要延迟时间17us

return(tmp);

}
/*-------------------------------------------------------------*/
void delay_ms(uint ms)
{
	 uchar i;  
          while(ms--)  
          {  
                    for(i = 0; i< 150; i++)  
                    {  
                              _nop_();  
                              _nop_();  
                              _nop_();  
                              _nop_();  
                    }  
          }  

}


void display1(int b)
{
		uchar i,qian,bai,shi,ge;
		qian=b/1000;//&0x7f;//千位加小数点
		bai=b/100%10;//百位
		shi=b/10%10;//十位
		ge=b%10;//个位
		str1[0] = table[qian];   
    	str1[1] = table0[bai];    
    	str1[2] = table0[shi];
		str1[3] = table0[ge]; 
		for(i=0;i<4;i++)
		{
			hc595(str1[i]);
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			switch (i)
			{
				case 0: D1=0;	D2=1;	D3=1;	D4=1;	break;
				case 1: D1=1;	D2=0;	D3=1;	D4=1;	break;
				case 2: D1=1;	D2=1;	D3=0;	D4=1;	break;
				case 3: D1=1;	D2=1;	D3=1;	D4=0;	break;				
			}
			delay_ms(1);
		}				
}
void main()
{
	uint a,q;
	D1=1;
	D2=1;
	D3=1;
	D4=1;
	while (1)
	{
	a=TLC549_ADC();
	q=5.0/255*a*1000;
	display1(q);
	}
}


 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值