您当前的位置:五五电子网电子知识单片机-工控设备AVR单片机mega162驱动TLC1543源代码 正文
mega162驱动TLC1543源代码

mega162驱动TLC1543源代码

点击数:7945 次   录入时间:03-04 11:57:49   整理:http://www.55dianzi.com   AVR单片机
   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 <iom162v.h>
#include <macros.h>
#include <eeprom.h>
#include <ctype.h>
#include <float.h>
#include <math.h>
#include <stdio.h>
#include <string.h>
//-----------------
#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<<CLOCK)
#define CLOCK_1  PORTC|=(1<<CLOCK)

#define D_IN_0  PORTC&=~(1<<D_IN)
#define D_IN_1  PORTC|=(1<<D_IN)

#define D_OUT_0  PORTC&=~(1<<D_OUT)
#define D_OUT_1  PORTC|=(1<<D_OUT)

#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;

[1] [2]  下一页


本文关键字:源代码  AVR单片机单片机-工控设备 - AVR单片机