EDN首页   博客首页

最新日志

发表于:2007-7-21 8:57:42
标签:心情  

1

即将实际应用

经过半年多的时间

我的第一个控制器,基本成型了,

这其中涉及了PCB,从未知,到实际应用发了不少时间。

近期将上传一些图片供大家看看。

系统分类: 自由话题   |    用户分类:    |    来源: 原创

评论(0) | 阅读(553)
发表于:2007-1-13 20:37:50
标签:ds18b20  

1

单片温度采集DS18B20

项           目:        DS18B20_TEST
编   译      器:        AVR Studio_4.12sp4+winAVR412
目  标   芯  片:        ATmega16
时           钟:        外部 8000000hz

#define DS18b20_PORT PORTB
#define DS18b20_DDR  DDRB
#define DS18b20_PIN  PINB

#define DS18b20      PB4 

#define SETBIT(x,y) (x|=(1<<y))     
#define CLRBIT(x,y) (x&=(~(1<<y)))  
#define CHKBIT(x,y) (x&(1<<y))    

#define  BIT_INV(x,y)    x^=(1<<y)
/********************************************************************************
                             DS18B20操作定义
********************************************************************************/
#define  CLR_DS18B20  CLRBIT(DS18b20_PORT,DS18b20)  //数据线强制拉低
#define  SET_DS18B20  SETBIT(DS18b20_PORT,DS18b20)  //数据线强制拉高,上拉
#define  HLD_DS18B20  SETBIT(DS18b20_DDR,DS18b20)  //Mega16控制总线
#define  RLS_DS18B20  CLRBIT(DS18b20_DDR,DS18b20)      //释放总线
#define  STU_DS18B20  CHKBIT(DS18b20_PIN,DS18b20)  //数据线的状态
 

/*********************************************************************************************
延时函数
**********************************************************************************************/

void delay_1us(void)                 //1us延时函数
  {
   asm("nop");
  }

void delay_nus(unsigned int n)       //N us延时函数
  {
   unsigned int i=0;
   for (i=0;i<n;i++)
   delay_1us();
  }
void delay_1ms(void)                 //1ms延时函数
  {
   unsigned int i;
   for (i=0;i<400;i++);
  }
  
void delay_nms(unsigned int n)       //N ms延时函数
  {
   unsigned int i=0;
   for (i=0;i<n;i++)
   delay_1ms();
  }

void init_1820(void) 

    HLD_DS18B20;      //设置PC2 为输出
    SET_DS18B20;  
    CLR_DS18B20; 
    delay_nus(180);    //480us以上 
    SET_DS18B20; 
    RLS_DS18B20; 
    delay_nus(10);     //15~60us 
    while(STU_DS18B20); 
    HLD_DS18B20; 
    SET_DS18B20; 
    delay_nus(40);   //60~240us 

void write_1820(unsigned char x) 
{    
     unsigned char m; 
    for(m=0;m<8;m++) 
    { 
       CLR_DS18B20; 
       if(x&(1<<m))    //写数据了,先写低位的!
       SET_DS18B20; 
       else 
       {CLR_DS18B20;} 
       delay_nus(10);   //15~60us 
       SET_DS18B20; 
    } 
     SET_DS18B20; 

unsigned char read_1820(void) 
{     
    unsigned char temp,k,n; 
    temp=0; 
    for(n=0;n<8;n++) 
       { 
      CLR_DS18B20; 
      SET_DS18B20; 
      RLS_DS18B20; 
      k=(STU_DS18B20);    //读数据,从低位开始 
      if(k) 
      temp|=(1<<n); 
      else 
      temp&=~(1<<n); 
      delay_nus(30); //60~120us     
      HLD_DS18B20; 
   } 
   return (temp); 
}  

void gettemp(unsigned char k[])         //读取温度值

     unsigned char temh,teml,wm0,wm2; 
     init_1820();        //复位18b20 
     write_1820(0xcc);   // 发出转换命令 
     write_1820(0x44);
     delay_nms(20);  
     init_1820(); 
     write_1820(0xcc);  //发出读命令 
     write_1820(0xbe); 
     teml=read_1820();  //读数据 
     temh=read_1820();
  wm0=teml;
     wm0&=0x0F;
     teml=teml>>4;       
     temh=temh<<4;
     wm2=teml|temh;      
     k[0]=(wm2/10)+48;   
     k[1]=(wm2%10)+48;
  k[3]=(wm0*6)/10+48;
}
int main()
{  
    unsigned char p[]={"  . 'C"}; 
 while(1)
 {        
    gettemp(p);
 //处理

 delay_nms(10);
                                                           
    }                                                   
 }

系统分类: 单片机   |    用户分类:    |    来源: 无分类

评论(2) | 阅读(939)
发表于:2007-1-2 23:40:47
标签:DS1302  

1

实时时钟DS1302应用

#define DS1302_PORT PORTC
#define DS1302_DDR  DDRC
#define DS1302_PIN  PINC

#define SETBIT(x,y) (x|=(1<<y))     
#define CLRBIT(x,y) (x&=(~(1<<y)))  
#define CHKBIT(x,y) (x&(1<<y))
/************************************************************************/
/* 初始化                                                               */
/************************************************************************/
//1302管脚初始化
void initialize_1302(void)
{
  SETBIT(DS1302_PORT,T_CLK);
  SETBIT(DS1302_PORT,T_IO);
  SETBIT(DS1302_PORT,T_RST);
  SETBIT(DS1302_DDR,T_CLK);
  SETBIT(DS1302_DDR,T_IO);
  SETBIT(DS1302_DDR,T_RST);
  delay_nus(1);
  write_1302(0x8e,0x00);
  write_1302(0x90,0xA5);
  write_1302(0x80,0x00);
}
//1302写一bit数据函数
void ds1302_write_a_byte(unsigned char ucDa)
{
  unsigned char i;
  for(i=8; i>0; i--)
  {
      CLRBIT(DS1302_PORT,T_CLK);
   if (ucDa&1) SETBIT(DS1302_PORT,T_IO);
       else CLRBIT(DS1302_PORT,T_IO);
   SETBIT(DS1302_PORT,T_CLK);
   ucDa>>=1;
  }
}

//1302读一bit数据
unsigned char ds1302_read_a_byte(void)
{
  unsigned char i,t=0;
  CLRBIT(DS1302_DDR,T_IO);
  CLRBIT(DS1302_PORT,T_IO);
  for(i=8; i>0; i--)
  {
      t>>=1;
   SETBIT(DS1302_PORT,T_CLK);
   delay_nus(1);
   CLRBIT(DS1302_PORT,T_CLK);
   delay_nus(1);
   if(CHKBIT(DS1302_PIN,T_IO))t|=0x80;
  }
  SETBIT(DS1302_DDR,T_IO);
  return(t);
}
//往DS1302写入数据
void write_1302(unsigned char ucAddr, unsigned char ucDa)
{

  CLRBIT(DS1302_PORT,T_RST);                //T_RST=0

  CLRBIT(DS1302_PORT,T_CLK);            //T_CLK=0;

  SETBIT(DS1302_PORT,T_RST);          //T_RST=1

  ds1302_write_a_byte(ucAddr);          // 地址,命令
  CLRBIT(DS1302_PORT,T_CLK);
  ds1302_write_a_byte(ucDa);             // 写1Byte数据
  CLRBIT(DS1302_PORT,T_CLK);                    //T_CLK=1

  CLRBIT(DS1302_PORT,T_RST);              //T_RST=0
}
//读取DS1302某地址的数据
unsigned char read_1302(unsigned char ucAddr)
{
  unsigned char ucDa;
  CLRBIT(DS1302_PORT,T_RST);

  CLRBIT(DS1302_PORT,T_CLK);

  SETBIT(DS1302_PORT,T_RST);


  ds1302_write_a_byte(ucAddr);               // 地址,命令
  ucDa = ds1302_read_a_byte();               // 读1Byte数据
  CLRBIT(DS1302_PORT,T_CLK);

  CLRBIT(DS1302_PORT,T_RST);

  return(ucDa);
}
///写某一位的时钟/////////////////////////////////////////////
void v_Setdd1302(unsigned char ucAddr,unsigned char pSecDa)   //写某一位的时钟
{

  write_1302(0x8e,0x00);             //控制命令,WP=0,写操作?

  write_1302(ucAddr,pSecDa);         //

  write_1302(0x8e,0x80);             // 控制命令,WP=1,写保护?
}
// 读取DS1302当前时间
void v_Get1302(unsigned char ucCurtime[])
{
  unsigned char i;
  unsigned char ucAddr = 0x81;
  for (i=0;i<7;i++)
  {
      ucCurtime[i] = read_1302(ucAddr);  //格式为: 秒 分 时 日 月星期 年
      ucAddr += 2;
  }
  CLRBIT(DS1302_PORT,T_CLK);
}

系统分类: 单片机   |    用户分类:    |    来源: 原创

评论(0) | 阅读(1241)
发表于:2006-12-27 16:55:20
标签:1602液晶源程序  

1

h1602c液晶显示函数

/*************************************************************************************
项           目:        1602液晶显示实验
编   译      器:        AVR Studio_4.12sp4+winAVR412
目  标   芯  片:        ATmega16
时           钟:        内部RC 8000000hz
建  立  日   期:        2006-11-12
最 后 修改 日期:       
*****************************************************************************************/
/*---------------------------------------------------------------------------------------
LCD引脚定义
------------------------------------------------------------------------------------------
1602pin 1    2   3    4   5    6     7   8    9    10    11    12    13    14   15   16
        地  Vcc  VL   Rs  Rw   En   D0   D1   D2   D3    D4    D5    D6    D7   灯+  灯-
                      |   |    |                          |     |     |    |
M16                  PA1  PA2  PA3                       PA4    PA5    PA6  PA7 

*****************************************************************************************/
/*------------------------------------------------------------------------------------------
头文件
------------------------------------------------------------------------------------------*/

#include               
/*-----------------------------------------------------------------------------------------
管脚宏定义
------------------------------------------------------------------------------------------*/
#define LCD_EN_PORT    PORTA  
#define LCD_EN_DDR     DDRA
#define LCD_RW_PORT    PORTA
#define LCD_RW_DDR     DDRA
#define LCD_RS_PORT    PORTA  
#define LCD_RS_DDR     DDRA
#define LCD_DATA_PORT  PORTA  
#define LCD_DATA_DDR   DDRA    
#define LCD_DATA_PIN   PINA
#define LCD_RS         (1<#define LCD_RW         (1<#define LCD_EN         (1<#define LCD_DATA       ((1<#define LCD_BUSY       (1</*--------------------------------------------------------------------------------------------
函数说明
---------------------------------------------------------------------------------------------*/
void LCD_init(void);
void LCD_en_write(void);
void LCD_wait_Ready(void);
void LCD_write_command(unsigned char command,unsigned char mang,unsigned char mingdata);
void LCD_set_xy (unsigned char x, unsigned char y);
void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s);
void LCD_write_char(unsigned char X,unsigned char Y,unsigned char data);
void delay_nus(unsigned int n);
void delay_nms(unsigned int n);
/*-------------------------------------------------------------------------------------------
延时函数
----------------------------------------------------------------------------------------------*/
void delay_1us(void)                 //1us延时函数
  {
   asm("nop");
  }

void delay_nus(unsigned int n)       //N us延时函数
  {
   unsigned int i="0";
   for (i=0;i   delay_1us();
  }
void delay_1ms(void)                 //1ms延时函数
  {
   unsigned int i;
   for (i=0;i<1140;i++);
  }
  
void delay_nms(unsigned int n)       //N ms延时函数
  {
   unsigned int i="0";
   for (i=0;i   delay_1ms();
  }
/*----------------------------------------------------------------------------------------------
液晶使能
-----------------------------------------------------------------------------------------------*/
void LCD_en_write(void)  
{
  LCD_EN_PORT|=LCD_EN;                          //EN=1
  delay_nus(1);  
  LCD_EN_PORT&=~LCD_EN;                          //EN=0
}
/*---------------------------------------------------------------------------------------------
测忙
---------------------------------------------------------------------------------------------*/
void LCD_wait_Ready(void)                               //等待LCD空闲
  {
    LCD_DATA_DDR&=~LCD_BUSY;                               //忙位设置为输入
    LCD_RW_PORT|=LCD_RW;                                 //RW=1
    LCD_RS_PORT&=~LCD_RS;                                  //RS=0
    LCD_EN_PORT|=LCD_EN;                                  //EN=1                        
    while(!( LCD_DATA_PIN&LCD_BUSY)==0);                 //读忙位,为0表示空闲;
    LCD_EN_PORT&=~LCD_EN;                                //EN=0
    LCD_DATA_DDR|=LCD_BUSY;                             //数据口方向为输出         
  }
/*---------------------------------------------------------------------------------------------
写指令或数据
-----------------------------------------------------------------------------------------------*/
void LCD_write_command(unsigned char command,unsigned char mang,unsigned char mingdata) 
   {
  
     if(mang==1)LCD_wait_Ready();                           //检测是否测忙!
        if(mingdata==1)LCD_RS_PORT&=~LCD_RS;              //RS=0 //判断是数据还是命令
           else LCD_RS_PORT|=LCD_RS;                 //RS=1
                      LCD_RW_PORT &=~LCD_RW;                 //RW=0
                   LCD_DATA_PORT&=0X0f;                 //清高四位
                            LCD_DATA_PORT|=command&0xf0;         //写高四位
                            LCD_en_write();
                            command="command"<<4;                 //低四位移到高四位
                            LCD_DATA_PORT&=0x0f;                //清高四位
                            LCD_DATA_PORT|=command&0xf0;        //写低四位
                            LCD_en_write();   
    }
/*----------------------------------------------------------------------------------------------
液晶初始化
-----------------------------------------------------------------------------------------------*/
void LCD_init(void)         
{
  LCD_DATA_DDR|=LCD_DATA;               //数据口方向为输出
  LCD_EN_DDR|=LCD_EN;                   //设置EN方向为输出
  LCD_RS_DDR|=LCD_RS;                   //设置RS方向为输出
  LCD_RW_DDR|=LCD_RW;
  delay_nms(15);                          //初始化三次
  LCD_write_command(0x28,0,1);           
  delay_nms(5);
  LCD_write_command(0x28,0,1); 
  delay_nms(5);
  LCD_write_command(0x28,1,1);           //4位显示
  LCD_write_command(0x0c,1,1);            //显示开
  LCD_write_command(0x06,1,1);
  LCD_write_command(0x01,1,1);            //清屏 
}
/*------------------------------------------------------------------------------------------------
写地址
-----------------------------------------------------------------------------------------------------*/
void LCD_set_xy( unsigned char x, unsigned char y )  
{
    unsigned char address;
    if (y ==0) address =0x80 + x;
    else   address = 0xc0 + x;
    LCD_write_command(address,1,1);
}
/*-----------------------------------------------------------------------------------------------------
英文字符串写入函数
-----------------------------------------------------------------------------------------------------*/
void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s) //列x=0~15,行y=0,1
   {
         LCD_set_xy( X, Y );                                  //写地址    
         while (*s)                                         // 写显示字符
          {
                LCD_write_command(*s,1,0);
                s ++;
          }   
   }
/*-----------------------------------------------------------------------------------------------------
单个字符写入函数
--------------------------------------------------------------------------------------------------------*/
void LCD_write_char(unsigned char X,unsigned char Y,unsigned char data) //列x=0~15,行y=0,1
   {
       LCD_set_xy( X, Y );                                               //写地址
       LCD_write_command( data,1,0);   
    }
/****************************************************************************************************
主函数
*********************************************************************************************************/
int main(void)
{
      unsigned char  j;
       LCD_init();
    while(1)                                                  //循环
       {
     LCD_write_command(0x01,1,1);                    //清屏
     LCD_write_string(15,0,"WOXIAN ");             //第一行显示
        LCD_write_string(15,1,"ThankS");            //第二行显示
     delay_nms(500);
     for(j=0;j<22;j++)                                 //向左移动16 格
            {
   if(j==10)
   {
           LCD_write_command(0x08,1,1);
            delay_nms(100);
   LCD_write_command(0x0c,1,1);
   delay_nms(200);
   }

                LCD_write_command(0x18,1,1);                        //字符同时左移一格
                 delay_nms(250);                                      //控制移动时间
              }
       }
}
/******************************************************************************************************/

系统分类: 单片机   |    用户分类:    |    来源: 原创

评论(0) | 阅读(655)
发表于:2006-11-9 12:48:20
标签:单片机  

2

初学单片机

从现在开始......

系统分类: 生活点滴   |    用户分类:    |    来源: 无分类

评论(3) | 阅读(940)
总共 , 当前 /