当前位置:主页 > AVR单片机 > tlc1549 ICC程序
201709/06

tlc1549 ICC程序

AVR单片机 Comments 围观:
// 串行数码管显示  TLC1549 AD转换值

// 芯片 ATMEGA16L 
// 时钟 4MHz 内部
// us延时 j=1;while(--j); 一个循环6个周期,4M晶振,延时1.5us

#include 

//164数据线置1
#define hc164_data_SET     PORTD |= 0x01  
//164数据线清0 
#define hc164_data_CLR     PORTD &= ~0x01 
//164时钟线置1 
#define hc164_clk_SET      PORTD |= 0x02  
//164时钟线清0 
#define hc164_clk_CLR      PORTD &= ~0x02 

void delay_nms(unsigned int);   //延时 n ms  
void hc164_send_byte (unsigned char byte); //164发送数据子程序
void leddisplay(void);          // 数码管显示子程序  

#define CLK1549    4    // tlc1549时钟线, PD4输出
#define DATA1549   5    // tlc1549数据线, PD5输入
#define CS1549    6    // tlc1549片选线 ,PD6输出
 
#define CLK1549_SET     PORTD |= 1< #define CLK1549_CLR     PORTD &= ~(1< #define DATA1549_IN     PIND&(1<TA1549)       // tlc1549数据线, PD5输入
#define CS1549_SET     PORTD |= 1< #define CS1549_CLR     PORTD &= ~(1<

unsigned int TLC1549_ADC (void);  //AD转换子程序

unsigned char ledxs[8]={16,16,16,16,0,0,0,0}; // 数码管显示缓冲区
                //   AD转换值  千位  百位   十位  个位  
const unsigned char tab[]={0xb7,0x12,0x67,0x76,0xd2,0xf4,0xf5,0x16,0xf7,0xf6,0xd7,0xf1,0xa5,0x73,0xe5,0xc5,0,0xff};
                          //共阴极代码 0-F,  全灭,全亮
void main(void)
{
   unsigned char j;   
   unsigned int ad_value;
   j=1;while(--j); // 一个循环6个周期,4M晶振,延时1.5us
   delay_nms(200); 
   PORTD &= ~(1<TA1549); // tlc1549数据线,上拉电阻无效
   DDRD = 0x53;            // PD0、PD1(164驱动)置为输出方式;  
                           // PD4、PD6(tlc1549时钟和片选)置为输出方式 ,PD5(tlc1549数据线)置为输入方式
   while(1)
   {
     ad_value = TLC1549_ADC();         // 读取AD转换值
  ledxs[4] = ad_value/1000;       // 求得AD转换值千位
     ledxs[5] = (ad_value%1000)/100; // 求得AD转换值百位
     ledxs[6] = (ad_value%100)/10;   // 求得AD转换值十位
     ledxs[7] = (ad_value%100)%10;   // 求得AD转换值个位
     leddisplay();                   // 串行显示
     delay_nms(1000);
   }
}
unsigned int TLC1549_ADC(void)
{
      unsigned int value=0;
      unsigned char i,j;
      CS1549_SET;
   j=2;while(--j);
      CLK1549_CLR;
      j=4;while(--j);
      CS1549_CLR;        //芯片起始
      j=4;while(--j);   //等待延时
      for(i=0;i<10;i++)  //输入采样转换时钟 (预采样)
      {
         CLK1549_SET;
   j=2;while(--j);
         CLK1549_CLR;
   j=2;while(--j);
      }
      CS1549_SET;       //开始转换
      j=20;while(--j); //等待转换结束

      CLK1549_CLR;
      j=4;while(--j);
      CS1549_CLR;       //开始读取转换结果
      j=4;while(--j);
      for(i=0;i<10;i++) // 读采样值
      {
         CLK1549_SET;
   j=2;while(--j);
         value<<=1;
   //if((PIND&(1<TA1549))==(1<TA1549))   value |= 0x01;//接收1位数据   
   if( DATA1549_IN )   value |= 0x01;  //接收1位数据  
         CLK1549_CLR;
   j=2;while(--j);
      }
      CS1549_SET;
      j=20;while(--j);
      return(value);  //返回转换结果
}
void leddisplay()     // 数码管显示子程序
{
  unsigned char i,j;
  for(i=0;i<8;i++)
  {
     hc164_send_byte (tab[ledxs[i]]);
     j=2;while(--j);
  }

void hc164_send_byte (unsigned char byte)  //164发送数据子程序
{
  unsigned char i;
   for(i=0;i<8;i++)
   {
      if( byte & ( 1 << i )) 
     hc164_data_SET;
   else 
     hc164_data_CLR;
      hc164_clk_SET;
      hc164_clk_CLR;   
   }  

void delay_nms(unsigned int k)  //延时 n ms
{
  while(k)   //4M晶振,一个循环1ms
  {
  int i;
  i=700;
  while(i--);
  k=k-1;
  }
}


文章作者:
本文地址:
版权所有 © 未注明“转载”的博文一律为原创,转载时必须以链接形式注明作者和原始出处!
如果你觉得文章不错,您可以推荐给你的朋友哦!

发表评论:                              


验证码:点击我更换图片

来看看其他人说了些什么?-----------------------------------------------------------------> 进入详细评论页