基于51单片机+TLC549芯片A_D转换器应用软件程序源码

/*
*程 序 最 后 修 改 时 间  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输出数码管的位选信号
        } 

    }

  

  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GJZGRB

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值