/*
*程 序 最 后 修 改 时 间 06-8-9 22:08
*软 件 标 题:TLC549 AD采样子程序
*软 件 说 明:从TLC549读取采样值
*_________________________________________
*
*/
#include "intrins.h"
#define Wait1us _nop_();
#define Wait2us {_nop_();_nop_();}
#define Wait4us {Wait2us;Wait2us;}
#define Wait8us {Wait4us;Wait4us;}
#define Wait10us {Wait8us;Wait2us;}
#define Wait30us {Wait10us;Wait8us;Wait4us;Wait2us;}
/************定义接口总线**************/
sbit Clock = P1 ^ 5; //时钟口线
sbit DataOut = P1 ^ 4; //数据输出口线
sbit ChipSelect = P1 ^ 3; //片选口线
/************接口总线定义结束**********/
/*********函数名称:ADCSelChannel********
*
*功能:转换指定通道的模拟量为数字量
*
*说明:
*
*位置:1
*
****************************************/
unsigned char ADCSelChannel(void)
{
unsigned char ConvertValue = 0;
unsigned char i;
ChipSelect = 1; //芯片复位
ChipSelect = 0;
ChipSelect = 1;
Clock = 0;
Wait4us;
ChipSelect = 0; //芯片起始
Wait4us; //等待延时
for (i = 0; i < 8; i ++) //输入采样转换时钟
{
Clock = 1;
Clock = 0;
}
ChipSelect = 1; //开始转换
Wait10us; //等待转换结束
ChipSelect = 0; //读取转换结果
Wait4us;
for (i = 0; i < 8; i ++) //
{
Clock = 1;
ConvertValue <<= 1;
if (DataOut)
{
ConvertValue = 0x1;
}
Clock = 0;
}
ChipSelect = 1;
return (ConvertValue); //返回转换结果
}
#include <REGX51.H>//头文件
#include "intrins.h"//空操作文件
#define uchar unsigned char//宏定义char
#define uint unsigned int//宏定义int
uchar code tb[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数码管段选
uchar code seg_bit_scan[]={0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; //各个数码管对应的位选数据
sbit data_temp=P1^5;//数据线(读出数据)
sbit cs=P1^4;//片选
sbit sclk=P1^1;//io口时钟
uchar qian,bai,shi,ge;
uint j;
void chuli(uint num) //显示程序
{
qian=num/1000; //千,百,十,个处理
bai=num/100%10;
shi=num/10%10;
ge=num%10;
}
uint ad_549() //TLC549处理
{
uchar i;
uint data_ad=0;
cs=1;//先拉高电平 //初始化,启动
sclk=0;//clk拉低电平
cs=0;//cs拉低电平
_nop_();//空操作 5微妙
for(i = 0;i < 8;i++) //读取采集数据,读取的是上一次采集数据(读八次)
{
sclk=1;//时钟线拉高电平
if(data_temp)//如果开始读数据
data_ad|=0x01;//读到的数据和00000001与一下 例如 读到的是0 和0x01与了之后就是0 读到什么,就是什么
sclk=0;//时钟线拉低电平
data_ad=data_ad<<1;//ad的数据自动右移一位
}//循环八次 读到一个8个2进制数
cs=1;//cs拉高电平
data_ad=data_ad *(500/256);//把数据乘(500除256)
return(data_ad);//返回ad的数据
}
void timer0_isr(void) interrupt 1//定时器的0中断服务函数
{
TR0=0;//关闭定时器0
TL0=(65536-10000)%256;//赋初值
TH0=(65536-10000)/256;//赋初值
j++;//变量j加一次
if(j>=4)//如果j大于4
j=0;//j等于0
TR0=1;//重新启动定时器0
}
void timer0_init (void)//定时器0中断初始化函数
{
EA=0;//关闭总中断
TMOD=0x01;//确定定时器0的工作方式为1
TR0=0;//关闭定时器0
TL0=(65536-10000)%256;//赋初值
TH0=(65536-10000)/256;//赋初值
PT0=1;//
ET0=1;//打开定时器0的中断开关
EA=1;//打开总中断开关
TR0=1;//启动定时器0
}
void main(void)//主程序
{
uint i;//变量i
timer0_init ();//初始化定时器0 启动定时器0
while(1)//循环函数
{
i=ad_549();//把ad_549读到的数赋给i
chuli(i);//显示最终结果(启动ad_549转换)
P0=0xff;//P0输出0xff
switch(j)//选择函数
{
case 0: P0 = tb[ge]; break;//如果j为0 P0输出tb【ge】;结束
case 1: P0 = tb[shi]; break;//如果j为1 P0输出tb【shi】;结束
case 2: P0 = tb[bai]&0x7f; break;//如果j为2 P0输出tb【bai】;结束
case 3: P0 = tb[qian]; break;//如果j为3 P0输出tb【qian】;结束
}
P2=seg_bit_scan[j];//与j对应,P2输出数码管的位选信号
}
}