基于51单片机的TLC549数字电压表(数码管显示)
由最近,需要用到TLC549芯片。于是就用该芯片做了一个简易的数字电压表;
移植改一下对应管脚可直接使用;
代码如下
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
void delay(uchar ms); //延时函数
uchar TLC549_ADC(void); //TLC549模数转换
sbit LED1=P2^0;
sbit LED2=P2^1;
sbit LED3=P2^2;
sbit LED4=P2^3;
sbit DI = P1^0;
sbit CS = P1^1;
sbit CLK = P1^2;
uchar ad_0;
uint AD;
unsigned char sch[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0xC1};//数码管显示数字的数组
unsigned char num[]={0X40,0X79,0X24,0X70,0X59,0X92,0X82,0XF8,0X80,0X90,0xC1};//数码管显示数字的数组
void fun(char L,Number)
{
switch(L)//选择显示数码管
{
case 0:LED1=0;LED2=1;LED3=1;LED4=1;P0=num[Number];break;
case 1:LED1=1;LED2=0;LED3=1;LED4=1;P0=sch[Number];break;
case 2:LED1=1;LED2=1;LED3=0;LED4=1;P0=sch[Number];break;
case 3:LED1=1;LED2=1;LED3=1;LED4=0;P0=sch[Number];break;
}
delay(1);
}
//-------------------------------------
// 主函数
//-------------------------------------
void main()
{
while(1)
{
ad_0=TLC549_ADC();
AD=ad_0*1.97;
fun(0,AD%1000/100);
fun(1,AD%100/10);
fun(2,AD%10);
fun(3,10);
}
}
//----------------------------------
// 延时子程序
//----------------------------------
void delay(uchar ms)
{
uchar i ;
while(ms--)
{
for(i = 0 ; i<250;i++) ;
}
}
//-----------------------------------------
// TLC549模数转换
//-----------------------------------------
uchar TLC549_ADC(void)
{
uchar n, tmp;
CS = 1; //CS置高,片选无效
CLK = 0;
CS = 0; //CS置低,片选有效,同时DO输出高位
_nop_();
_nop_(); //适当延迟时间1.4us Setup Time
for(n = 0; n < 8; n++) //串行数据移位输入
{
tmp <<= 1;
tmp |= DI;
CLK = 1; //0.4us
_nop_(); //延迟0.1us
CLK = 0; //0.4us
}
CS = 1; //CS置高,片选无效
for(n = 17; n != 0; n--) _nop_(); //下一次转换需要延迟17us
return (tmp);
}