Board logo

标题: 适合单片机初学者的aTmega16学习板 [打印本页]

作者: sujin5    时间: 2010-10-11 09:07     标题: 适合单片机初学者的aTmega16学习板

atmega16.jpg
此板是一块非常适合单片机初学者的学习板,我先将此板的一些功能先大致的介绍一下,具体的每个功能我们近期将会推出,请各位学者多多关注,当然,也希望各位学者说出自己的见解。

1、DS18B20温度检测芯片(单总线方式实现)

2、1路A/D(电位器模拟实现)

3、DS1302实时时钟

4、1路串口(max3232实现)

5、3*3点阵键盘


6、1个无源蜂鸣器(以脉冲驱动)
7、1个直流小电机
8、4位共阳动态扫描LED数码管
9、5个LED灯
另:所有IO口全部引出,方便扩展实验及测试

图片附件: atmega16.jpg (2010-10-11 08:57, 340.2 KB) / 下载次数 1044
http://bbs.hymcu.com/attachment.php?aid=17&k=e886f538c562a3f75880f9336e3e84f2&t=1714117016&sid=67nGG8


作者: andylee    时间: 2010-10-11 09:16

板子非常不错!希望可以斑竹尽快把相关原理图PDF文件、有关学校资料上传过来,以便广大学习爱好者共享。
作者: sujin5    时间: 2010-10-13 17:17

为了让初学者更容易上手,更好的学习画原理图、做PCB板,我将在这里公布atmega 16学习板的原理图和封装库。 aTmega 16.pdf (91.83 KB) atmega16封装库.rar (6.56 KB)

附件: [atmega 16学习板原理图] aTmega 16.pdf (2010-10-13 17:15, 91.83 KB) / 下载次数 1212
http://bbs.hymcu.com/attachment.php?aid=77&k=491cdd7375efe1017d9b7878a1e52705&t=1714117016&sid=67nGG8

附件: [atmega 16学习板所用到的库] atmega16封装库.rar (2010-10-13 17:15, 6.56 KB) / 下载次数 2629
http://bbs.hymcu.com/attachment.php?aid=78&k=b6055bd2cade272e140bd684fd640719&t=1714117016&sid=67nGG8
作者: sujin5    时间: 2010-10-14 21:32

本帖最后由 sujin5 于 2010-10-15 13:28 编辑

为了让各位学习atmega 16板的朋友更方便的学习,我在网上找来了atmega 16的中文手册及板子上其他所用到的芯片手册,放在这方便大家提起: atmega16-16L.pdf (2.78 MB) 18B20温度传感器中文资料.pdf (2.28 MB) DS1302中文资料.pdf (265.4 KB) MAX232中文资料.pdf (568.75 KB) MAX3232中文资料.pdf (770.03 KB)

附件: [aTmega16中文手册] atmega16-16L.pdf (2010-10-14 21:31, 2.78 MB) / 下载次数 3638
http://bbs.hymcu.com/attachment.php?aid=98&k=85bf5654d6afae3b394fcfdb11d5f750&t=1714117016&sid=67nGG8

附件: [18B20温度传感器中文资料] 18B20温度传感器中文资料.pdf (2010-10-15 13:19, 2.28 MB) / 下载次数 3529
http://bbs.hymcu.com/attachment.php?aid=110&k=8cc13a9ab8766eb4134a8d37090694f1&t=1714117016&sid=67nGG8

附件: [DS1302中文资料] DS1302中文资料.pdf (2010-10-15 13:22, 265.4 KB) / 下载次数 3618
http://bbs.hymcu.com/attachment.php?aid=111&k=5829fbeeb00432ed2be01b275e6e83ae&t=1714117016&sid=67nGG8

附件: [MAX232中文资料] MAX232中文资料.pdf (2010-10-15 13:22, 568.75 KB) / 下载次数 3573
http://bbs.hymcu.com/attachment.php?aid=112&k=0d911912e666d4a10885373af369ca76&t=1714117016&sid=67nGG8

附件: [MAX3232中文资料] MAX3232中文资料.pdf (2010-10-15 13:23, 770.03 KB) / 下载次数 3560
http://bbs.hymcu.com/attachment.php?aid=113&k=fa75c49d8d0a9092ad7e55543781c6fd&t=1714117016&sid=67nGG8
作者: sujin5    时间: 2010-10-14 22:03

本帖最后由 sujin5 于 2010-10-14 22:12 编辑

5路流水灯简介

由图可知要想点亮对应的LDE的话,I/O口需输出一个低电平

5路流水灯实验程序如下:

#define ALL_ON {PORTA&=0X1F;ORTC&=0XFC;}
    #define ALL_OFF {PORTA|=~0X1F;ORTC|=~0XFC;}
    #define LED1_ON PORTA&=0XDF

#define LED2_ON PORTA&=0XBF

#define LED3_ON PORTA&=0X7F

#define LED4_ON PORTC&=0XFD

#define LED5_ON PORTC&=0XFE

#define LED1_OFF PORTA|=~0XDF

#define LED2_OFF PORTA|=~0XBF

#define LED3_OFF PORTA|=~0X7F

#define LED4_OFF PORTC|=~0XFD

#define LED5_OFF PORTC|=~0XFE

void Gpio_Init(void)
{

   DDRA|=0XE0;
   PORTA&=0X1F;
   DDRC|=0X03;
   PORTC&=0XFC;
}

void led (void)
{
   LED1_ON;
   delay_nms(200);

LED2_ON;
   delay_nms(200);
   LED3_ON;
   delay_nms(200);
   LED4_ON;
   delay_nms(200);
   LED5_ON;
   delay_nms(200);
   LED1_OFF;
   delay_nms(200);
   LED2_OFF;
   delay_nms(200);
   LED3_OFF;
   delay_nms(200);
   LED4_OFF;
   delay_nms(200);
   LED5_OFF;
   delay_nms(200);
}





图片附件: [流水灯] 5路LED灯.png (2010-10-14 22:00, 58.69 KB) / 下载次数 547
http://bbs.hymcu.com/attachment.php?aid=99&k=344571cd7f03e6d17ae4be710d9f9bce&t=1714117016&sid=67nGG8


作者: andylee    时间: 2010-10-15 16:42

不顶不行,非常不错!
作者: 火儿    时间: 2010-10-15 17:13

电路板很漂亮!!
作者: sujin5    时间: 2010-10-16 09:23

3*3矩阵键盘简介

具体的实现方法我将在下面的软件代码里说明:


#define  GET_L1  !(PINC&0X04)
#define  GET_L2  !(PINC&0X08)
#define  GET_L3  !(PINC&0X10)
#define  GETS  GET_L1|GET_L2|GET_L3
void delay_nms(int a);

int GET_S1=0,GET_S2=0,GET_S3=0,GET_S4=0,GET_S5=0,GET_S6=0,GET_S7=0,GET_S8=0,GET_S9=0;
void GETS_INIT(void)
{
   GET_S1=0;
  GET_S2=0;
  GET_S3=0;
  GET_S4=0;
  GET_S5=0;
  GET_S6=0;
  GET_S7=0;
  GET_S8=0;
  GET_S9=0;
}
void key(void)
{
   PORTC&=0X1F;   //设置输出PC5,6,7为低
  if(GETS)
   delay_nms(5);
  if(GETS)     //如果输入时PC2,3,4为低,即有按键被按下           
  {
    if(GET_L1)       //如果输入时PC3为低,即第二列有按键被按下
   {
   PORTC|=0XC0;
   PORTC&=0XDF; //设置输出PC5为低,PC6,7为高
      if(GET_L1)     
      {
        GET_S1=1;     //S4键按下
      }
      else if(!GET_L2)
      {
     PORTC&=0X1F;
      PORTC|=0XA0;
    PORTC&=0XBF;    //设置PC6低,PC5,7为高
      if(GET_L1)   
      {
           GET_S2=1;    //S5键按下了
      }
      else if(!GET_L1)
      {
           GET_S3=1;      //S6键按下了
      }
   }
     }
   if(GET_L2)       //如果输入时PC3为低,即第二列有按键被按下
   {
   PORTC|=0XC0;
   PORTC&=0XDF; //设置输出PC5为低,PC6,7为高
      if(GET_L2)     
      {
        GET_S4=1;     //S4键按下
      }
      else if(!GET_L2)
      {
     PORTC&=0X1F;
      PORTC|=0XA0;
    PORTC&=0XBF;    //设置PC6低,PC5,7为高
      if(GET_L2)   
      {
           GET_S5=1;    //S5键按下了
      }
      else if(!GET_L2)
      {
           GET_S6=1;      //S6键按下了
      }
   }
     }
  
   if(GET_L3)       //如果输入时PC4为低,即第三列有按键被按下
   {
   PORTC|=0XC0;
   PORTC&=0XDF; //设置输出PC5为低,PC6,7为高
      if(GET_L3)
      {
        GET_S7=1;     //S7键按下
      }
      else if(!GET_L3)     
      {
     PORTC&=0X1F;
      PORTC|=0XA0;
    PORTC&=0XBF;    //设置PC6低,PC5,7为高
      if(GET_L3)   
      {
           GET_S8=1;    //S8键按下了
      }
      else if(!GET_L3)   
      {
           GET_S9=1;    //S9键按下了
      }
   }
     }
}
}



图片附件: [3*3矩阵键盘] QQ截图未命名.png (2010-10-16 09:19, 92.22 KB) / 下载次数 536
http://bbs.hymcu.com/attachment.php?aid=115&k=54236a892c240d1258e60233550c7c1f&t=1714117016&sid=67nGG8


作者: sujin5    时间: 2010-10-17 09:31

串口通信简单

相应的MAX232引脚上的电容和TX,RX的接法大家可以参照一下。我们的串口是以直连的方式连接的。下面我把我们的串口通信程序和大家分享下:


/********************************************************************
*  函数库说明:RS232总线驱动函数库                                  *
*  版本说明:  1.0 Bate                                             *
*  作者:      andylee                                              *
*  日期:      2006年7月                                            *
*  平台:      mega16  16M                                          *
*  说明:      为上层提供RS232的基本读写函数                        *
********************************************************************/
#define F_CPU       16000000                     // 16MHz processor
#define UART_DEFAULT_BAND_RATE     19200           //default baud rate for UART
unsigned char receive_data=0;

/*************************************
*  函数说明:串口接收中断            *
*  输入:无                          *
*  输出:无                          *
************************************/
#pragma interrupt_handler RX_ISR:12
void RX_ISR(void)      
{
  unsigned char comm_tempRec;
  comm_tempRec=UDR;
  receive_data= comm_tempRec;
}
/*************************************
*  函数说明:波特率设置函数          *
*  输入:波特率                      *
*  输出:无                          *
*************************************/
void uartSetBaudRate(unsigned long  baudrate)
{
    unsigned int baudratDiv;

    baudratDiv = (F_CPU/(baudrate*16L)-1);
    UBRRH=(unsigned char)(baudratDiv>>8);
    UBRRL=(unsigned char)baudratDiv;
}
/*************************************
*  函数说明:串口化函数              *
*  输入:无                          *
*  输出:无                          *
*************************************/
void uartInit(void)
{
   UCSRA=0X00;
   //enable RxD/TxD and interrupts
   //UCSRB|=(1<<RXCIE)|(0<<TXCIE)|(1<<RXEN)|(1<<TXEN);
   UCSRB=0XD8;
   //设置波特率
   uartSetBaudRate(UART_DEFAULT_BAND_RATE);
   
   //设置帧格式: 8 个数据位, 2 个停止位
   //UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
   UCSRC=0X86;
   UCSRB|=0X80;
   SEI();
}

/************************************
*  函数说明:查询方式发送一个字节    *
*  输入:无                          *
*  输出:无                          *
*************************************/
void uartSendByte(unsigned char txData)
{
    while(!(UCSRA&(1<<UDRE)));
    // send byte
    UDR=txData;
}
/*************************************
*  函数说明:串口接收例程            *
*  输入:无                          *
*  输出:接受到的数据                *
*************************************/
unsigned char uartReceiveService(void)
{
    unsigned char c;
    c=UDR;
    uartSendByte(c);
    return UDR;
}
/*************************************
*  函数说明:查询方式串口接收例程    *
*  输入:无                          *
*  输出:无                          *
*************************************/
unsigned char uart_receive( void )
{
unsigned char c;
/* 等待接收数据*/
while ( !(UCSRA & (1<<RXC)) )
{
//rst_wdog();
}
/* 从缓冲器中获取并返回数据*/
c=UDR;
//uartSendByte(c);
return c;
}

图片附件: [串口通信原理图] QQ截图未命名.png (2010-10-17 09:23, 90.43 KB) / 下载次数 559
http://bbs.hymcu.com/attachment.php?aid=120&k=669ca7abf38c7b3d2aa57e71a97dffae&t=1714117016&sid=67nGG8


作者: sujin5    时间: 2010-10-19 18:44

直流小电机简介

当输出高电平时驱动,对应的程序代码如下:

void Motor_Init(void)
{
   DDRD|=0X40;
  PORTD&=0XBF;
void motor_go(void)
{
   PORTD=0X40;//开启小电机
}
void motor_stop(void)
{
   PORTD=0X00;//关闭小电机
}




蜂鸣器简介

由原理图上同样可以看出,当输出高电平时蜂鸣器响,对应的程序代码如下:
int mortor=1;
void speak_up(void)
{
   PORTD|=0X80;
}
void speak_down(void)
{
   PORTD&=0X7F;
}
void speak_go(void)
{  
  mortor=1;
  while(mortor)
  {
     speak_up();
  LED1_ON;
    delay_nus(300);
    speak_down();
  LED1_OFF;
    delay_nus(300);
  key();
  if(GET_S2)
  {
    mortor=0;
  }
  }
}
void speak_stop(void)
{
   mortor=0;
}



图片附件: dj.png (2010-10-19 18:33, 52.57 KB) / 下载次数 538
http://bbs.hymcu.com/attachment.php?aid=138&k=15423410baba6082ebe80aea1c49c2b0&t=1714117016&sid=67nGG8



图片附件: [蜂鸣器原理图] fm.png (2010-10-19 18:39, 57.89 KB) / 下载次数 539
http://bbs.hymcu.com/attachment.php?aid=140&k=f604100195dff50b66d2145d360c0d67&t=1714117016&sid=67nGG8


作者: andylee    时间: 2010-10-20 21:20

呵呵,对于初学AVR单片机的人而言,这个板子不错,资料也全。
作者: sujin5    时间: 2010-10-22 18:03

数码管简介

我们采用的是共阳数码管,我会在下面给出我们所做的对应的程序代码:

/*选择数码管显示字符*/
#define CHOICE4  PORTA=0XFE
#define CHOICE3  PORTA=0XFD
#define CHOICE2  PORTA=0XFB
#define CHOICE1  PORTA=0XF7
#define CHOICEALL  PORTA=0XF0
#define CHOICENOCE  PORTA=0XFF
/*数码管显示不同的字符*/
#define SMALL_OFF  PORTB=0XFF
#define SMALL_ON  PORTB=0X00  
#define SET_0  PORTB=0x14
#define SET_1  PORTB=0XD7
#define SET_2  PORTB=0X4C
#define SET_3  PORTB=0X45
#define SET_4  PORTB=0X87
#define SET_5  PORTB=0X25
#define SET_6  PORTB=0X24
#define SET_7  PORTB=0X57
#define SET_8  PORTB=0X04
#define SET_9  PORTB=0X05
#define SET_A  PORTB=0X06
#define SET_B  PORTB=0XA4
#define SET_C  PORTB=0X3C
#define SET_D  PORTB=0XC4
#define SET_E  PORTB=0X2C
#define SET_F      PORTB=0X2E
void Smled_Init(void)
{
   DDRA|=0X0F;
  PORTA&=0XFF;
  DDRB=0XFF;
  PORTB=0X00;
}
void SET_led(int n,char m)   //第n个数码管 显示m
{
SMALL_OFF;
switch(n)
{
  case 1:CHOICE1;break;
  case 2:CHOICE2;break;
  case 3:CHOICE3;break;
  case 4:CHOICE4;break;
  default : SMALL_ON;
}
switch(m)
{   
  case '0':SET_0;break;
  case '1':SET_1;break;
  case '2':SET_2;break;
  case '3':SET_3;break;
  case '4':SET_4;break;
  case '5':SET_5;break;
  case '6':SET_6;break;
  case '7':SET_7;break;
  case '8':SET_8;break;
  case '9':SET_9;break;
  case 'A':SET_A;break;
  case 'B':SET_B;break;
  case 'C':SET_C;break;
  case 'D':SET_D;break;
  case 'E':SET_E;break;
  
  
  case 'F':SET_F;break;
  default : SMALL_ON;
}

   
}
void SET_all(char a,char b,char c,char d)    //  在数码管上显示一串字符
{
SET_led(1,a);
  delay_nms(2);
SET_led(2,b);
  delay_nms(2);
SET_led(3,c);
  delay_nms(2);
SET_led(4,d);
  delay_nms(2);
}


图片附件: [4位动态数码管原理图] SM.png (2010-10-22 17:48, 109.25 KB) / 下载次数 549
http://bbs.hymcu.com/attachment.php?aid=170&k=292ac2ca6da9615cccd5a9dc24b294e1&t=1714117016&sid=67nGG8


作者: sujin5    时间: 2010-10-23 18:53

DS18b20温度传感器简介

采集外部温度,通过A/D模数转换把采集到的温度显示在数码管上,下面是对应的程序代码:
//PD5至低         
#define  CLR_DS18B20  PORTD&=~(1<<PD5)   
//PD5至高
#define  SET_DS18B20  PORTD|=(1<<PD5)      
//读PD5
#define  STU_DS18B20  STU_DS18B20_R()  
unsigned char  STU_DS18B20_R(void)
{
  unsigned char  a;
  //DDRD&=0XDF;
//delay_nus(100);
a=PIND;
//DDRD|=0X20;
a&=0x20;

return a;
}

BYTE resetDS18B20(void)
{
BYTE errTime=0;
unsigned char a=0;
RLS_DS18B20();  //释放总线,总线自动上拉
delay_nus(2);
HLD_DS18B20();   //Maga16控制总线
CLR_DS18B20;   //强制拉低
delay_nus(210);  //209.42us
delay_nus(210);  //209.42us
delay_nus(184);  //83.28us
//以上的三个延时大于480us
RLS_DS18B20();  //释放总线,总线自动上拉

while(STU_DS18B20)
{
  delay_nus(6);
  //Delay(6);   //5.15us
  errTime++;
  if(errTime>20)
  return(0xbb);  //如果等带大于约 5.15us*20就返回0x00,报告复位失败(实际上只要等待15-60us)
}
errTime=0;
while(!(STU_DS18B20))
{
  delay_nus(6);
  //Delay(6);   //5.15us
  errTime++;
  if(errTime>50)
  return(0xcc);  //如果等带大于约 5.15us*50就返回0x00,报告复位失败(实际上只要等待60-240us)
}
return(0xAA);
}

/**********************************************************************
functionName: BYTE readByteDS18B20(void)
description :读DS18B20一个字节
**********************************************************************/
BYTE readByteDS18B20(void)
{
BYTE i;
BYTE retVal=0;
RLS_DS18B20();  //释放总线
for(i=8;i>0;i--)
{
   retVal>>=1;
     HLD_DS18B20(); //控制总线
  CLR_DS18B20; //强制拉低
  delay_nus(2);
  //Delay(2);   //延时大于1us
   
  RLS_DS18B20();  //释放总线,DS18B20会将总线强制拉低
  delay_nus(2);
  //Delay(2);
  if(STU_DS18B20)
  retVal|=0x80;
  delay_nus(15);
  delay_nus(15);
// Delay(15);   //14.92us
// Delay(15);   //14.92us
  RLS_DS18B20();  //释放总线
  delay_nus(30);
// Delay(30);   //30.38us
}
delay_nus(2);
// Delay(3);    //2.71us(大于1us就行了)
return(retVal);
}

/**********************************************************************
functionName: BYTE readByteDS18B20(void)
description :写DS18B20一个字节
**********************************************************************/
void writeByteDS18B20(BYTE wb)
{
BYTE i;
BYTE temp;
SET_DS18B20;  //释放总线
for(i=0;i<8;i++)
{
  HLD_DS18B20();  //Maga16控制总线
  CLR_DS18B20;  //强制拉低
  delay_nus(2);     //15us
  temp=wb>>i;
  temp&=0x01;
  if(temp) // !temp
  //RLS_DS18B20();  //释放总线
  SET_DS18B20;
  else
  CLR_DS18B20;  //强制拉低
  delay_nus(30);   //15us
  delay_nus(30);     //31us
  SET_DS18B20;  //释放总线
  delay_nus(2);     //2us

}
//SysTickDelay(2);
// Delay(2);
}

/**********************************************************************
functionName: unsigned int readTempDS18B20(void)
description :读DS18B20温度
**********************************************************************/
unsigned int readTempDS18B20(void)
{
BYTE tempL,tempH;
WORD x=0;
resetDS18B20();
writeByteDS18B20(0xcc);  //跳过ROM
writeByteDS18B20(0x44);  //启动温度转换


delay_nms(800);

// Delay(1);
resetDS18B20();
writeByteDS18B20(0xcc);  //跳过ROM
writeByteDS18B20(0xbe);  //读数据
tempL=readByteDS18B20();
tempH=readByteDS18B20();
x=(tempH<<8)|tempL;
return(x);
}
void HLD_DS18B20(void)
{
DDRD|=(1<<PD5);//PD5输出
}
void RLS_DS18B20(void)
{
DDRD&=~(1<<PD5);//PD5输入
}


图片附件: [ds18b20温度传感器原理图] wd.png (2010-10-23 18:48, 59.97 KB) / 下载次数 553
http://bbs.hymcu.com/attachment.php?aid=173&k=8fe7f4d86b71d1210c83f51c5b865b3f&t=1714117016&sid=67nGG8


作者: sujin5    时间: 2010-10-23 19:08

实时时钟简介

采用三线接口与CPU进行同步通信,下面我将给出我们板子对应的程序代码:


#ifndef DS1302_H
#define DS1302_H
unsigned char year=0;
unsigned char month=0;
unsigned char day=0;
unsigned char hour=0;
unsigned char minute=0;
unsigned char second=0;
#define ds1302_rst PD4
#define ds1302_io PD3
#define ds1302_sclk PD2
#define set_ds1302_rst_ddr() DDRD|=1<<ds1302_rst
#define set_ds1302_rst()  PORTD|=1<<ds1302_rst
#define clr_ds1302_rst()  PORTD&=~(1<<ds1302_rst)
#define set_ds1302_io_ddr()  DDRD|=1<<ds1302_io
#define set_ds1302_io()   PORTD|=1<<ds1302_io
#define clr_ds1302_io()   PORTD&=~(1<<ds1302_io)
#define clr_ds1302_io_ddr()  DDRD&=~(1<<ds1302_io)
#define in_ds1302_io()   PIND&(1<<ds1302_io)
#define set_ds1302_sclk_ddr() DDRD|=1<<ds1302_sclk
#define set_ds1302_sclk()  PORTD|=1<<ds1302_sclk
#define clr_ds1302_sclk()  PORTD&=~(1<<ds1302_sclk)
#define ds1302_sec_reg  0x80
#define ds1302_min_reg  0x82
#define ds1302_hr_reg  0x84
#define ds1302_date_reg  0x86
#define ds1302_month_reg 0x88
#define ds1302_day_reg  0x8a
#define ds1302_year_reg  0x8c
#define ds1302_control_reg 0x8e
#define ds1302_charger_reg 0x90
#define ds1302_clkburst_reg 0xbe
#define uchar unsigned char
//==================================================================
//函数声明
void ds1302_write(uchar reg,uchar data);
uchar ds1302_read(uchar reg);
uchar check_ds1302(void);
void ds1302_read_time(void);
void ds1302_write_time(void);
#endif

/********************************************************************
*  函数说明:给寄存器写一个字节数据                                 *
*  输入:reg,data                                                   *
*  输出:无                                                         *
********************************************************************/
void ds1302_write(uchar reg,uchar data)
{
uchar i=0;
set_ds1302_io_ddr();
asm("nop");
asm("nop");
clr_ds1302_rst();
asm("nop");
asm("nop");
clr_ds1302_sclk();
asm("nop");
asm("nop");
set_ds1302_rst();
asm("nop");
asm("nop");
for(i=8;i>0;i--)
{  
  if(reg&0x01) set_ds1302_io();
  else clr_ds1302_io();
  asm("nop");
  asm("nop");
  set_ds1302_sclk();
  asm("nop");
  asm("nop");
  clr_ds1302_sclk();
  asm("nop");
  asm("nop");
  reg>>=1;
}
for(i=8;i>0;i--)
{  
  if(data&0x01) set_ds1302_io();
  else clr_ds1302_io();
  asm("nop");
  asm("nop");
  set_ds1302_sclk();
  asm("nop");
  asm("nop");
  clr_ds1302_sclk();
  asm("nop");
  asm("nop");
  data>>=1;
}
clr_ds1302_rst();
asm("nop");
asm("nop");
clr_ds1302_io_ddr();
asm("nop");
asm("nop");
}
/********************************************************************
*  函数说明:读寄存器写一个字节数据                                 *
*  输入:reg                                                        *
*  输出:data                                                       *
********************************************************************/
uchar ds1302_read(uchar reg)
{
uchar data=0;
uchar i=0;
reg+=1;//读标志
set_ds1302_io_ddr();
asm("nop");
asm("nop");
clr_ds1302_rst();
asm("nop");
asm("nop");
clr_ds1302_sclk();
asm("nop");
asm("nop");
set_ds1302_rst();
asm("nop");
asm("nop");
for(i=8;i>0;i--)
{
  
  if(reg&0x01) set_ds1302_io();
  else clr_ds1302_io();
  asm("nop");
  asm("nop");
  set_ds1302_sclk();
  asm("nop");
  asm("nop");
  clr_ds1302_sclk();
  asm("nop");
  asm("nop");
  reg>>=1;
}
clr_ds1302_io_ddr();
asm("nop");
asm("nop");
for(i=8;i>0;i--)
{
  data>>=1;
  if(in_ds1302_io()) data|=0x80;
  asm("nop");
  asm("nop");
  set_ds1302_sclk();
  asm("nop");
  asm("nop");
  clr_ds1302_sclk();
  asm("nop");
  asm("nop");
}
clr_ds1302_rst();
asm("nop");
asm("nop");
return(data);
}
/********************************************************************
*  函数说明:                                                       *
*  输入:                                                           *
*  输出:                                                           *
********************************************************************/
uchar check_ds1302(void)
{
    ds1302_write(ds1302_control_reg,0x80);
    if(ds1302_read(ds1302_control_reg)==0x80) return 1;
    return 0;
}
/********************************************************************
*  函数说明:读时钟芯片的时间数据                                   *
*  输入:                                                           *
*  输出:无                                                         *
********************************************************************/
void ds1302_read_time(void)
{
year=ds1302_read(ds1302_year_reg); //年
month=ds1302_read(ds1302_month_reg);//月
day=ds1302_read(ds1302_date_reg); //日
//week=ds1302_read(ds1302_day_reg); //周
hour=ds1302_read(ds1302_hr_reg); //时
minute=ds1302_read(ds1302_min_reg); //分
second=ds1302_read(ds1302_sec_reg); //秒
}
/********************************************************************
*  函数说明:初始化时钟内容                                         *
*  输入:                                                           *
*  输出:无                                                         *
********************************************************************/
void ds1302_write_time(void)
{
ds1302_write(ds1302_control_reg,0x00);     //关闭写保护
ds1302_write(ds1302_sec_reg,0x80);      //暂停  
//ds1302_write(ds1302_charger_reg,0xa9);     //涓流充电
ds1302_write(ds1302_year_reg,0x10);      //年
ds1302_write(ds1302_month_reg,0x09);  //月
ds1302_write(ds1302_date_reg,0x29);   //日
//ds1302_write(ds1302_day_reg,0x06);    //周
ds1302_write(ds1302_hr_reg,0x16);   //时,xiawu 1
ds1302_write(ds1302_min_reg,0x21);      //分
ds1302_write(ds1302_sec_reg,0x58);      //秒
ds1302_write(ds1302_control_reg,0x80);  //打开写保护
}
/* 调用的相关说明
  clr_ds1302_rst();//时钟芯片的初始化及设定
  set_ds1302_rst_ddr();
  clr_ds1302_io();
  clr_ds1302_io_ddr();
  clr_ds1302_sclk();
  set_ds1302_sclk_ddr();
  //ds1302_write_time();//初始化时间
*/

图片附件: [ds1302实时时钟电路原理图] ss.png (2010-10-23 18:57, 75.4 KB) / 下载次数 555
http://bbs.hymcu.com/attachment.php?aid=174&k=49c9694818ea10bbcd03b01990c3665a&t=1714117016&sid=67nGG8


作者: sujin5    时间: 2010-11-6 16:06

这是我们上面的学习板所要用到的双龙下载软件,我在这与大家分享下
SLISP_V142.rar (1.65 MB)

附件: [双龙下载软件] SLISP_V142.rar (2010-11-6 16:04, 1.65 MB) / 下载次数 2637
http://bbs.hymcu.com/attachment.php?aid=319&k=a0281996f337eedf7d84f6f57eedcf91&t=1714117016&sid=67nGG8
作者: sujin5    时间: 2010-11-10 09:21

本帖最后由 sujin5 于 2010-12-5 13:40 编辑

iccavr中文使用说明.pdf (139.49 KB)
iccavr6.31A.rar (4.57 MB)

附件: [iccavr6.31A] iccavr6.31A.rar (2010-11-10 09:20, 4.57 MB) / 下载次数 2499
http://bbs.hymcu.com/attachment.php?aid=338&k=6b7fbf6e7701365756cf7bf8a7f313b0&t=1714117016&sid=67nGG8

附件: [iccavr中文使用说明] iccavr中文使用说明.pdf (2010-12-5 13:32, 139.49 KB) / 下载次数 3484
http://bbs.hymcu.com/attachment.php?aid=626&k=401ab3b36365f2750238dd63046ba420&t=1714117016&sid=67nGG8
作者: sujin5    时间: 2010-11-10 09:52

串口调试助手.rar (115.79 KB)

附件: [串口调试助手] 串口调试助手.rar (2010-11-10 09:52, 115.79 KB) / 下载次数 2512
http://bbs.hymcu.com/attachment.php?aid=340&k=c140d007af217d695c913b0eb2f36f88&t=1714117016&sid=67nGG8
作者: sujin5    时间: 2010-11-15 11:07

本帖最后由 sujin5 于 2010-11-25 17:38 编辑

在AVRStudio中建AVRGcc工程.pdf (310.03 KB)     /****AVR Studio 4最好装在默认路径,否则可能不能用****/

附件: 在AVRStudio中建AVRGcc工程.pdf (2010-11-15 11:04, 310.03 KB) / 下载次数 3372
http://bbs.hymcu.com/attachment.php?aid=407&k=cf2c93da62b5b6ec6a9fad047f27580e&t=1714117016&sid=67nGG8

附件: [在AVRStudio中建AVRGcc工程] 在AVRStudio中建AVRGcc工程.pdf (2010-11-15 11:07, 310.03 KB) / 下载次数 3481
http://bbs.hymcu.com/attachment.php?aid=408&k=d851cb8090f2d38320baade1f938c921&t=1714117016&sid=67nGG8
作者: z3q5d8x7v8w    时间: 2010-11-18 13:48

好帖子,向楼主致敬!~
作者: andylee    时间: 2010-11-18 13:52

非常不错,这个分项,现在基本资料齐全。对楼主表示感谢。
作者: z7l6r0r3l6a    时间: 2010-11-18 15:53

楼主说的即是,支持楼主。
作者: z1b6j0u8v4j    时间: 2010-11-18 20:21

好帖子,向楼主致敬!~
作者: jemmy0938    时间: 2010-11-19 04:08

學習板上的規劃與整體佈置很合理, 很有特點,很喜歡. ^-^
使用與學習板一起購買的 併口ISP ,一上電就可正常使用,實在很經濟. ^-^
搭配使用 ICC AVR 4 + PROGISP 1.6.7 簡單好用 ^-^
好東西要與好朋友分享~~
作者: 潘朵拉    时间: 2010-11-21 21:04

这个真的比较适合初学者,我也是初学者,这个资料入门真的不错!楼主,多谢了!
作者: jemmy0938    时间: 2010-11-21 21:15

今天拿出以前購買但無法使用的一堆板子,用了這個剛買的併口編程器一下就瀆到 fuse.
強力推薦..
作者: z5c9x1q1g7p    时间: 2010-12-15 23:14

神马都是浮云!




欢迎光临 珩源工控论坛 (http://bbs.hymcu.com/) Powered by Discuz! 7.2