电子产业
数字化服务平台

扫码下载
手机洽洽

  • 微信小程序

    让找料更便捷

  • 扫码下载手机洽洽

    随时找料

    即刻洽谈

    点击下载PC版
  • 华强电子网公众号

    电子元器件

    采购信息平台

  • 华强电子网移动端

    生意随身带

    随时随地找货

  • 华强商城公众号

    一站式电子元器件

    采购平台

  • 芯八哥公众号

    半导体行业观察第一站

mega162驱动TLC1543源代码

来源:-- 作者:-- 浏览:292

标签:

摘要: mega162具有以下特性:1. 双USART; 2. 低能耗,工作电压低; 3. 多个I/O可以当作外部中断,相比之下M16只有3个外部中断可用。 当初选型mega162的时候是看中了它的双USART的功能;但是它却没集成A/D,当想要扩展A/D功能的时候,只有外

   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;
   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<<D_OUT)) 
   {
       ah|=0x01;
   }
   
       CLOCK_0;
   } 
//---------------//取D7--D0
   for (i=0;i<8;i++)
   {
   al<<=1;
       CLOCK_1;    
      
       if (PINC&(1<<D_OUT))// if (PINC&(1<<D_OUT))
   {
       al|=0x01;
   }
       CLOCK_0;
   }     _CS_1;      // 关闭1543
//---------------//得到AD值
   ad=(uint)ah;
   ad<<=8;
   ad|=al;
   
   return (ad);
}
型号 厂商 价格
EPCOS 爱普科斯 /
STM32F103RCT6 ST ¥461.23
STM32F103C8T6 ST ¥84
STM32F103VET6 ST ¥426.57
STM32F103RET6 ST ¥780.82
STM8S003F3P6 ST ¥10.62
STM32F103VCT6 ST ¥275.84
STM32F103CBT6 ST ¥130.66
STM32F030C8T6 ST ¥18.11
N76E003AT20 NUVOTON ¥9.67