文档视界 最新最全的文档下载
当前位置:文档视界 › TLC电压

TLC电压

以下是本人设计的TLC549的51单片机程序,仅供参考!!!

/********************************************************
程序:TLC549 AD转换演示程序(基于TLC549的数字电压表设计)
制作:风沙星辰
日期:2009年10月11日
功能:通过TLC549 AD转换芯片进行电压采集,将采集到的信号
以电压的形式通过数码显示出来。
备注:STC89C52RC 11.0592M晶振
说明:学习TLC549 AD转换芯片的和51内部定时器的使用
********************************************************/

/* 头文件和必要声明及数码管的值 */
#include
#include

#define led P0
#define uchar unsigned char
#define uint unsigned int

uint Volt; //电压换算并扩大1000倍
uchar num;

uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
/** 0 1 2 3 4 5 6 7 8 9 */
uchar code table1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
/** 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. */

/* TLC549和数码管为选声明 */
sbit CLK = P2^6; //时钟
sbit DO = P2^5; //数据输出
sbit CS = P2^4; //片选
sbit w1 = P2^0;
sbit w2 = P2^1;
sbit w3 = P2^2;
sbit w4 = P2^3;

/* 延时1ms函数 */
void delay(uint z) // 延时函数
{
uint x,y;
for(x = z; x > 0; x--)
for(y = 110; y > 0; y--);
}

/* 串口初始化函数 */
void init()
{
TMOD=0x01; //设置定时器0为工作方式1(0000 0001)
TH0=(65536-45872)/256; //装初值50ms一次中断
TL0=(65536-45872)%256;
EA=1; //开总中断
ET0=1; //开定时器0中断
TR0=1; //启动定时器0
}

/* TLC549芯片AD转换模块 */
uchar TLC549_ADC(void) //TLC549转换函数

{
uchar i, tmp;
CS = 1; //CS置高,片选无效
CLK = 0;
CS = 0; //CS置低,片选有效 ,同时DO输出最高位
_nop_();
_nop_(); //适当延迟时间1.4us 等待启动(大概需要内部系统时钟的两个上升沿和其后的下降沿)
for(i = 0; i < 8; i++) //串行数据移位输入
{
tmp <<= 1;
tmp |= DO;
CLK = 1; //在CLK的下降沿读取数据
_nop_(); //CLK保持低电平一段时间等待数据读出
CLK = 0;
}
CS = 1; //CS置高,DO处于高阻状态,且CLK禁止 (转换完成系统必须马上把CS置高
for(i = 17; i != 0; i--) _nop_(); //转换周期最大17us
return (tmp);

}

/* AD 读数转十进制函数 */
void Data_Conversion(void)
{
uchar AD_Data;
AD_Data = TLC549_ADC();
Volt = 5.0 / 256 * AD_Data * 1000; //扩大1000倍以输出小数
}

/* 数码管显示函数 */
void display()
{
uchar i,j,k;
i = Volt / 1000 ; //个位加小数点
j = Volt / 100 % 10; //十分位
k = Volt / 10 % 10; //百分位
//l = Volt % 10; //个


w1=0;
led=table1[i];
delay(1);
w1=1;
w2=0;
led=table[j];
delay(1);
w2=1;
w3=0;
led=table[k];
delay(1);
w3=1;
w4=0;
led=0xc1; //V符号,电压单位
delay(1);
w4=1;
}

/* 主函数 */
void main()
{
init();
while(1)
{
display();
}
}

/* 定时器0服务函数 */
void T0_time() interrupt 1
{
TH0=(65536-45872)/256; //重装初值
TL0=(65536-45872)%256;
num++;
if(num==10) //0.5进行一次采样
{
num=0; //然后把num清0重新计时
Data_Conversion();
}
}


相关文档