mega162驱动TLC1543源代码

发布者:anluran最新更新时间:2017-12-15 来源: eefocus关键字:mega162  驱动TLC1543 手机看文章 扫描二维码
随时随地手机看文章

   mega162具有以下特性:1. 双USART; 2. 低能耗,工作电压低; 3. 多个I/O可以当作外部中断,相比之下M16只有3个外部中断可用。 

    当初选型mega162的时候是看中了它的双USART的功能;但是它却没集成A/D,当想要扩展A/D功能的时候,只有外部挂接A/D芯片了;这本不是AV先生的初衷,因为许多AVR 单片机 集成了A/D、EEPROM。 


    外部A/D芯片选用TI公司的TLC1543,这是一个11通道、10位的A/D,速度38ksps,应用非常广泛,下面是根据51BBS龙版主的C源码转嫁过来的。设计主要注意以下几个方面: 

    1。AVR具有 1指令/时钟周期的特性,同时又可以预取指令,提高了指令执行速度(1Mips/MHz);传统51是每 1指令/6个时钟周期。使在同样外部晶振的条件下,ADD和DEC的执行时间,AVR比51快了6倍(这个可能不太严格,由于内核构架的不同),所以在用nop或者i++/i--做芯片时序延时的时候,要考虑时间是否够。 

    2。AVR的端口是可设置方向的,相对于TLC为进的端口,AVR要设置为出,反之亦然。 

    3。AVR的端口逻辑有专门的寄存器,比如PINA是PA口的寄存器,这个寄存器只读,当判断AVR的端口电平高低的时候,只能访问它。 

     下面是我的代码:由于网页原因,格式总靠左。本来我是参照“华为编程规范”做的。 

/*----------------------------------------------------------------     
*File Name: UPSSpyMain_AD.c                                  - 
*Description: 从TLC1543读取采样值,形参port是采样的通道号       - 
*Project:                                                        - 
*MCU type: Mega162           7.3728mhz                                - 
                                                                 - 
*Company: WY                                               - 
*Compiler: ICCAVR6.30                                       - 
*MODIFY:        郭准 06.3.19                                     - 
-----------------------------------------------------------------*/ 
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  
//----------------- 
#define uchar unsigned char 
#define uint  unsigned int 
#define ulint unsigned long int 


#define  nop()  NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP(); 

//-----------------TLC1543 端口定义 
#define CLOCK  0   //PORTC的0位 
#define D_IN   1   //PORTC的1位 
#define D_OUT  2   //PORTC的2位 
#define _CS    3   //PORTC的3位 
//-----------------端口电平变化的 定义 
#define CLOCK_0  PORTC&=~(1<#define CLOCK_1  PORTC|=(1<
#define D_IN_0  PORTC&=~(1<#define D_IN_1  PORTC|=(1<
#define D_OUT_0  PORTC&=~(1<#define D_OUT_1  PORTC|=(1<
#define _CS_0  PORTC&=~(1<<_CS) 
#define _CS_1   PORTC|=(1<<_CS) 

//------------------------------------------------------ 
//功能:从TLC1543读取采样值 
//入口:channel = 通道号 .0:0通道;1:1通道。。。。。。。 
//出口: 
//设计:郭准,伟业,2006/3/19 
//------------------------------------------------------ 
uint read1543(uchar channel) 

   uint  ad; 
   uint  i; 
   uchar al=0; 
   uchar ah=0; 
//----------------端口方向   
   PORTC = 0xFF; //PC0,PC1,PC3推挽1输出;PC2  I/O带上拉电阻输入 
   DDRC  = 0xFB; // 

   CLOCK_0;                    //时钟源初始为低 
   _CS_0;                      //片选为低,选中芯片 
//---------------等待一个设置时间+两个内部系统时钟的下降沿   
  for(i=0;i<21;i++) 
  {;} 
//---------------把通道号打入1543  
   channel<<=4;                    //左移4位的作用是为了,下面高位比较方便 
   al=0;ah=0;                     
   for (i=0;i<4;i++)  
   {    
       if((channel&0x80)) 
   { 
       D_IN_1; 
   nop(); 
   } 
   else 
   { 
       D_IN_0; 
   nop(); 
   } 
       CLOCK_1;                //时钟的下降沿 锁存数据,地址移入 
   nop(); 
       CLOCK_0; 
       channel<<=1; 
   } 
    
//---------------//填充6个CLOCK 
   for (i=0;i<6;i++)            //采样一直持续6个 I/O CLOCK周期 
   { 
       CLOCK_1; 
   nop(); 
       CLOCK_0;  
   nop();   
   } 
   nop(); 
//---------------//等待AD转换 
   _CS_1;                      
   for(i=0;i<12;i++) //多个单周期延时nop,微秒级延时 
   { 
      nop(); 
   }                   
   _CS_0; 
   nop(); 
//---------------//取D9,D8 
   for (i=0;i<2;i++)  
   { 
//       D_OUT_1; 
       ah<<=1; 
   CLOCK_1; 

       if (PINC&(1<   { 
       ah|=0x01; 
   } 
    
       CLOCK_0; 
   }  
//---------------//取D7--D0 
   for (i=0;i<8;i++) 
   { 
   al<<=1; 
       CLOCK_1;     
       
       if (PINC&(1<   { 
       al|=0x01; 
   } 
       CLOCK_0; 
   }  

   _CS_1;      // 关闭1543 
//---------------//得到AD值 
   ad=(uint)ah; 
   ad<<=8; 
   ad|=al; 
    
   return (ad); 


关键字:mega162  驱动TLC1543 引用地址:mega162驱动TLC1543源代码

上一篇:软件产生PWM控制直流电机C程序
下一篇:ICCAVR实现存储空间分布

小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • Linux内核移植
    实验步骤:(1)准备工作(2)修改顶层Makefile(3)修改falsh 分区(4)配置编译内核下面以Linux2 6 30 4内核移植到gec2440为例:一、准备 ...
  • S5PV210 PWM定时器
    第一节 S5PV210的PWM定时器S5PV210共有5个32bit的PWM定时器,其中定时器0、1、2、3有PWM功能,定时器4没有输出引脚。PWM定时器使用PCLK_PS ...
  • S5PV210 NAND Flash
    NAND Flash关于NAND FlashS5PV210的NAND Flash控制器有如下特点:1) 支持512byte,2k,4k,8k的页大小2) 通过各种软件模式来进行NAND Fl ...
  • S5PV210串口
    串口设置之输入输出字符S5PV210 UART相关说明 通用异步收发器简称UART,即UNIVERSAL ASYNCHRONOUS RECEIVER AND TRANSMITTER,它用来 ...
  • S5PV210按键控制LED
    原理图如图所示:查询用户手册得到:程序例子:(完整代码见“代码下载链接”)1、轮询的方式查询按键事件 *main c* 核心代码如下:while(1 ...
  • S5PV210控制蜂鸣器
  • S5PV210的启动过程
  • S5PV210点亮LED
  • S5PV210启动过程详解
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved