找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 519|回复: 0
打印 上一主题 下一主题
收起左侧

TLC549转换器应用模真+仿真C语言源代码-已测可用

[复制链接]
跳转到指定楼层
楼主
TLC549转换器电路Proteus仿真原理图如下:




单片机源程序如下:
  1. /*
  2. *软 件 标 题:TLC549 AD采样子程序
  3. *软 件 说 明:从TLC549读取采样值
  4. *_________________________________________
  5. *
  6. */
  7. #include <REGX51.H>//头文件
  8. #include "intrins.h"

  9. #define    Wait1us        _nop_();
  10. #define    Wait2us        {_nop_();_nop_();}
  11. #define    Wait4us        {Wait2us;Wait2us;}
  12. #define    Wait8us        {Wait4us;Wait4us;}
  13. #define    Wait10us      {Wait8us;Wait2us;}
  14. #define    Wait30us      {Wait10us;Wait8us;Wait4us;Wait2us;}


  15. /************定义接口总线**************/
  16. sbit Clock = P1 ^ 5; //时钟口线
  17. sbit DataOut = P1 ^ 4; //数据输出口线
  18. sbit ChipSelect = P1 ^ 3; //片选口线
  19. /************接口总线定义结束**********/


  20. /*********函数名称:ADCSelChannel********
  21. *
  22. *功能:转换指定通道的模拟量为数字量
  23. *
  24. *说明:
  25. *
  26. *位置:1
  27. *
  28. ****************************************/
  29. unsigned char ADCSelChannel(void)
  30. {
  31.       unsigned char ConvertValue = 0;
  32.       unsigned char i;
  33.       ChipSelect = 1; //芯片复位
  34.       ChipSelect = 0;
  35.       ChipSelect = 1;
  36.       Clock = 0;
  37.       Wait4us;
  38.       ChipSelect = 0; //芯片起始
  39.       Wait4us; //等待延时
  40.       for (i = 0; i < 8; i ++) //输入采样转换时钟
  41.       {
  42.             Clock = 1;
  43.             Clock = 0;
  44.       }
  45.       ChipSelect = 1; //开始转换
  46.       Wait10us; //等待转换结束
  47.       ChipSelect = 0; //读取转换结果
  48.       Wait4us;
  49.       for (i = 0; i < 8; i ++) //
  50.       {
  51.             Clock = 1;
  52.             ConvertValue <<= 1;
  53.             if (DataOut)
  54.             {
  55.                    ConvertValue = 0x1;
  56.             }
  57.             Clock = 0;
  58.       }
  59.       ChipSelect = 1;
  60.       return (ConvertValue); //返回转换结果
  61. }



复制代码

  1. #include <REGX51.H>//头文件
  2. #include "intrins.h"//空操作文件
  3. #include<stdio.h>
  4. #include<stdlib.h>
  5. #define  uchar unsigned char//宏定义char
  6. #define  uint          unsigned int//宏定义int
  7. void delay(long i){while(i--);}
  8. uchar code tb[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数码管段选
  9. uchar code seg_bit_scan[]={0xef,0xdf,0xbf,0x7f}; //各个数码管对应的位选数据

  10. sbit data_temp=P1^4;//数据线(读出数据)
  11. sbit cs=P1^3;//片选
  12. sbit sclk=P1^5;//io口时钟


  13. uint j;        uchar qian,bai,shi,ge;

  14. void chuli(uint num)          //显示程序
  15. {  
  16.   
  17.   qian=num/1000%10;              //千,百,十,个处理
  18.   bai=num/100%10;
  19.   shi=num/10%10;
  20.   ge=num%10;

  21.   }
  22. uint ad_549()                    //TLC549处理
  23. {
  24.   uchar i;
  25.   uint data_ad=0;
  26.   cs=1;//先拉高电平 //初始化,启动
  27.   sclk=0;//clk拉低电平
  28.   cs=0;//cs拉低电平
  29.   _nop_();//空操作 5微妙                    
  30.   
  31.    for(i=8;i>0;i--)//循环读取8位A/D转换结果
  32.         {
  33.                 data_ad<<=1;
  34.                 data_ad=data_temp|data_ad;
  35.                 sclk=1;
  36.                 _nop_();_nop_();
  37.                 sclk=0;
  38.                 _nop_();
  39.         }//循环八次 读到一个8个2进制数         
  40.   cs=1;//cs拉高电平
  41. sclk=0;
  42.            if (data_ad==0xff) data_ad=data_ad+1.953125 ;
  43.            data_ad=data_ad*19.53125;//采集到的0--255,对应0--5V


  44.   return(data_ad);//返回ad的数据
  45. }
  46. void timer0_isr(void)  interrupt 1//定时器的0中断服务函数
  47. {
  48.                                                                               
  49.         TR0=0;//关闭定时器0                                                        
  50.         TL0=(65536-10000)%256;//赋初值
  51.         TH0=(65536-10000)/256;//赋初值
  52.         j++;                                                      
  53.         if(j>=4) //变量j加一次 //如果j大于4
  54.         j=0;//j等于0
  55.                                                                
  56.            TR0=1;//重新启动定时器0
  57. }
  58. void timer0_init (void)//定时器0中断初始化函数
  59. {
  60.         EA=0;//关闭总中断                     
  61.         TMOD=0x01;//确定定时器0的工作方式为1            
  62.         TR0=0;//关闭定时器0                     
  63.         TL0=(65536-10000)%256;//赋初值
  64.         TH0=(65536-10000)/256;//赋初值                  
  65.         PT0=1;//                     
  66.         ET0=1;//打开定时器0的中断开关                     
  67.         EA=1;//打开总中断开关                     
  68.         TR0=1;//启动定时器0                     
  69. }                                                
  70. void main(void)//主程序
  71. {  
  72.         
  73.         uint i;//变量i
  74.         timer0_init ();//初始化定时器0 启动定时器0
  75.                
  76.         while(1)//循环函数
  77.         {  
  78.             P0=0xff;        
  79.                 i=ad_549();//把ad_549读到的数赋给i
  80.                 chuli(i);//显示最终结果(启动ad_549转换)
  81.         
  82.                 switch(j)
  83.                 {
  84.                         case 0: P0 = tb[ge]; break;         
  85.                         case 1: P0 = tb[shi]; break;         
  86.                         case 2: P0 = tb[bai];break;
  87.                         case 3: P0 = tb[qian]&0x7f; break;
  88.             default: break;
  89.                 }
  90.                  
  91.                 P2 = seg_bit_scan[j];      //与j对应,P2输出数码管的位选信号
  92.                  delay(8);
  93.                 }
  94.         }

  95.                
复制代码

仿真程序下载: A_D转换器应用-已测可用.zip (334.45 KB, 下载次数: 10)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表