用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);
}
}