⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds12887.lst

📁 本程序经调试好使
💻 LST
📖 第 1 页 / 共 3 页
字号:
__text_start:
__start:
    0046 E5CF      LDI	R28,0x5F
    0047 E0D4      LDI	R29,4
    0048 BFCD      OUT	0x3D,R28
    0049 BFDE      OUT	0x3E,R29
    004A 51C0      SUBI	R28,0x10
    004B 40D0      SBCI	R29,0
    004C EA0A      LDI	R16,0xAA
    004D 8308      STD	Y+0,R16
    004E 2400      CLR	R0
    004F E9E8      LDI	R30,0x98
    0050 E0F0      LDI	R31,0
    0051 E010      LDI	R17,0
    0052 39EE      CPI	R30,0x9E
    0053 07F1      CPC	R31,R17
    0054 F011      BEQ	0x0057
    0055 9201      ST	R0,Z+
    0056 CFFB      RJMP	0x0052
    0057 8300      STD	Z+0,R16
    0058 E5E4      LDI	R30,0x54
    0059 E0F0      LDI	R31,0
    005A E6A0      LDI	R26,0x60
    005B E0B0      LDI	R27,0
    005C E010      LDI	R17,0
    005D 38EC      CPI	R30,0x8C
    005E 07F1      CPC	R31,R17
    005F F021      BEQ	0x0064
    0060 95C8      LPM
    0061 9631      ADIW	R30,1
    0062 920D      ST	R0,X+
    0063 CFF9      RJMP	0x005D
    0064 940E0257  CALL	_main
_exit:
    0066 CFFF      RJMP	_exit
FILE: C:\DOCUME~1\wangqinbo\MYDOCU~1\avrc\ds12997.c
(0001) /******************************************************/
(0002) //Title:ATMAGE16 & DS12887加上串口通信显示时钟程序-查询方式
(0003) //ICC-AVR : 2009-3-4 17:04:40
(0004) // Target : M16
(0005) // Crystal: 1.0000Mhz ~8.0000Mhz都好使
(0006) //Author  :borlittle
(0007) //Function:usart+DS12887 RTC test
(0008) //备注	  :本程序经调试好使,如果程序不好使,请注意检查硬件连线,内部时钟
(0009) //记得要校验准,串口才能发送正确,
(0010) // AVR 执行时间:8MHZ ->0.125us  4MHZ->0.25us  //有串口,模拟总线最简版
(0011) //               2MHZ->0.5us      *1MHZ->1us ,每句后延时2句
(0012) // at89s52  执行时间:11.0592MHZ->2.17us 
(0013) //
(0014) //
(0015) /****************************************************/
(0016) 
(0017) #include <iom16v.h>        
(0018) #include <macros.h>
(0019) 
(0020) #define uchar unsigned char		//定义无符号字符为 uchar
(0021) #define uint  unsigned int       //定义无符号整型
(0022) #define Crystal 8000000   //晶振8MHZ 
(0023) #define Baud 9600         //波特率
(0024) 
(0025) uchar y1,y2,y3,y4,y5,y6; //用于调试用,在JTAG仿真器与AVR Studio 中查看是否读取正确
(0026) uchar y[19]={0,0,'.',0,0,'.',0,0,' ',0,0,':',0,0,':',0,0,' ',' '}; //09.3.4 17:06:50
(0027) //上位机接收到得时间数据格式
(0028) /**********************接口定义*********************************/
(0029) //GND <--   MOT		   VCC  -->VCC
(0030) //			.		   SQW
(0031) //			.		   .
(0032) //PA_0<-- 	AD0	       .     
(0033) //PA_1<-- 	AD1		   .
(0034) //PA_2<-- 	AD2        IRQ   -->PB_0
(0035) //PA_3<-- 	AD3        REET	 -->VCC
(0036) //PA_4<-- 	AD4		   DS	 -->PB_1
(0037) //PA_5<-- 	AD5		   .
(0038) //PA_6<-- 	AD6		   R/W	 -->PB_2
(0039) //PA_7<-- 	AD7		   AS	 -->PB_3
(0040) //		    GND		   CS    -->GND--可以用端口控制以省电降功耗 
(0041) /*********************引脚说明***********************************/
(0042) //DS12887       16    器件
(0043) //数据线       PA口    数据地址公用总线
(0044) //DS_IRQ        PB0    时间中断     
(0045) //DS_DS         PB1    数据选通
(0046) //DS_RW    		PB2	   读写控制
(0047) //DS_AS			PB3	   地址选通
(0048) //DS_CS         PB4	   芯片片选
(0049) //DS_MOT        GND    模式选择
(0050) 
(0051) /*******************数据地址定义*************************************/
(0052) #define	DS12887_Second		0x00	//秒
(0053) #define	DS12887_Minute		0x02	//分
(0054) #define	DS12887_Hour		0x04	//时
(0055) #define	DS12887_Week		0x06	//星期
(0056) #define	DS12887_Day		    0x07	//日
(0057) #define	DS12887_Month		0x08	//月
(0058) #define	DS12887_Year		0x09	//年
(0059) 
(0060) //引脚电平定义
(0061) #define P_DS_1 PORTB|=BIT(PB1)	  	//DS_DS为1
(0062) #define P_DS_0 PORTB&=~BIT(PB1)		//DS_DS为0
(0063) #define D_DS_1 DDRB |=BIT(PB1)      //设为输出
(0064) 
(0065) #define P_RW_1  PORTB|=BIT(PB2)	    //DS_RW为1
(0066) #define P_RW_0  PORTB&=~BIT(PB2)	//DS_RW为0
(0067) #define D_RW_1   DDRB |=BIT(PB2)    //设为输出
(0068) 
(0069) #define P_AS_1 PORTB|=BIT(PB3)		//DS_AS为1
(0070) #define P_AS_0 PORTB&=~BIT(PB3)    	//DS_AS为0
(0071) #define D_AS_1  DDRB |=BIT(PB3)     //设为输出
(0072) 
(0073) #define P_CS_1 PORTB|=BIT(PB4)     //DS_CS为1
(0074) #define P_CS_0 PORTB&=~BIT(PB4)	   //DS_CS为0				
(0075) #define D_CS_1  DDRB |=BIT(PB4)     //设为输出
(0076) 
(0077)  			
(0078) //数据端口定义
(0079) #define AD_DDR DDRA 			//AD(地址/数据服用线)的输入/输出控制
(0080) #define AD_PORT PORTA			//AD(地址/数据服用线)的输出电平控制
(0081) #define AD_PIN PINA			//AD(地址/数据服用线)的输入电平控制
(0082) 
(0083) //定义时间类型,结构体数据类型
(0084) typedef struct _SYSTEMTIME_
(0085) {
(0086) 	unsigned  char Second;
(0087) 	unsigned  char Minute;
(0088) 	unsigned  char Hour;
(0089) 	unsigned  char Week;
(0090) 	unsigned  char Day;
(0091) 	unsigned  char Month;
(0092) 	unsigned  char Year;
(0093) 	unsigned  char DateString[9];
(0094) 	unsigned  char TimeString[9];
(0095) }SYSTEMTIME;			
(0096) 
(0097) /***********************函数声明*****************************/
(0098) void DS12887_Init(void);											//DS12887初始化
(0099) void DS12887_Write( uchar Address,  uchar Value);		//DS12887指定地址写入数据
(0100) uchar DS12887_Read(uchar Address);					//DS12887指定地址中读出数据	
(0101) void DS12887_SetTime( uchar Address,  uchar Value);	//设置时间函数
(0102) void DS12887_GetTime(SYSTEMTIME *Time);								//读出时间
(0103) void delay_8nus(uchar n);
(0104) void port_init(void);
(0105) void usart0_init(void);
(0106) void init_devices(void);
(0107) 
(0108) void usart_char_send(uchar i);
(0109) void usart_str_send(char *s);
(0110) uchar usart_char_receive(void);
(0111) 
(0112) /*****************串口初始化*********************************/
(0113) void usart_init(void) 
(0114) {
(0115)  UCSRB = 0x00;                     //禁止发送和接收
_usart_init:
    0067 2422      CLR	R2
    0068 B82A      OUT	0x0A,R2
(0116)  UCSRA = 0x02;                     //倍速异步模式USX=1
    0069 E082      LDI	R24,2
    006A B98B      OUT	0x0B,R24
(0117)  UCSRC = 0x06;                     //0000 0110,UCSZ1=1,UCSZ0=1;8位字符,1位停止位 
    006B E086      LDI	R24,6
    006C BD80      OUT	0x20,R24
(0118)  UBRRL=(Crystal/8/(Baud+1))%256;   //若为正常异步模式USX0=0则位(Crystal/16/(Baud+1))%256
    006D E688      LDI	R24,0x68
    006E B989      OUT	0x09,R24
(0119)  UBRRH=(Crystal/8/(Baud+1))/256;   //参见ATMAGE16使用手册
    006F BC20      OUT	0x20,R2
(0120)  UCSRB = 0x18;                     //允许发送和接收
    0070 E188      LDI	R24,0x18
    0071 B98A      OUT	0x0A,R24
    0072 9508      RET
(0121) }
(0122) /******************端口初始化*******************************/
(0123) void port_init(void) 
(0124) {
(0125)   DDRB  = 0xFF; 
_port_init:
    0073 EF8F      LDI	R24,0xFF
    0074 BB87      OUT	0x17,R24
(0126)  PORTB = 0xFF; //设为输出高电平
    0075 BB88      OUT	0x18,R24
(0127)  
(0128)  DDRA  = 0x00; 
    0076 2422      CLR	R2
    0077 BA2A      OUT	0x1A,R2
(0129)  PORTA = 0x00; //设为高阻态
    0078 BA2B      OUT	0x1B,R2
(0130)   
(0131)  PORTD = 0xFF;   //设置RXD0和TXD0
    0079 BB82      OUT	0x12,R24
(0132)  DDRD  = 0x02;
    007A E082      LDI	R24,2
    007B BB81      OUT	0x11,R24
    007C 9508      RET
(0133) 
(0134) }
(0135) 
(0136) //****************发送一个字符******************************
(0137) void usart_char_send(uchar i)
(0138) {
(0139) while(!(UCSRA&(1<<UDRE)));
_usart_char_send:
  i                    --> R16
    007D 9B5D      SBIS	0x0B,5
    007E CFFE      RJMP	_usart_char_send
(0140) UDR=i;
    007F B90C      OUT	0x0C,R16
    0080 9508      RET
_usart_str_send:
  s                    --> R20
    0081 940E02A9  CALL	push_gset1
    0083 01A8      MOVW	R20,R16
(0141) }
(0142) /******************发送一个字符串*************************/
(0143) void usart_str_send(char *s) 
(0144) {
    0084 C005      RJMP	0x008A
(0145)  while(*s)
(0146)  {
(0147)  usart_char_send(*s); 
    0085 01FA      MOVW	R30,R20
    0086 8100      LDD	R16,Z+0
    0087 DFF5      RCALL	_usart_char_send
(0148)  s++;
    0088 5F4F      SUBI	R20,0xFF
    0089 4F5F      SBCI	R21,0xFF
    008A 01FA      MOVW	R30,R20
    008B 8020      LDD	R2,Z+0
    008C 2022      TST	R2
    008D F7B9      BNE	0x0085
    008E 940E02AC  CALL	pop_gset1
    0090 9508      RET
_usart_send_arry:
  i                    --> R20
    0091 940E02A9  CALL	push_gset1
(0149)  }
(0150) }
(0151) /*****************发送数组数据**************************************/
(0152) void usart_send_arry(void)
(0153) {
(0154) uchar i;
(0155) for(i=0;i<19;i++)
    0093 2744      CLR	R20
    0094 C009      RJMP	0x009E
(0156) usart_char_send(y[i]);
    0095 E680      LDI	R24,0x60
    0096 E090      LDI	R25,0
    0097 2FE4      MOV	R30,R20
    0098 27FF      CLR	R31
    0099 0FE8      ADD	R30,R24
    009A 1FF9      ADC	R31,R25
    009B 8100      LDD	R16,Z+0
    009C DFE0      RCALL	_usart_char_send
    009D 9543      INC	R20
    009E 3143      CPI	R20,0x13
    009F F3A8      BCS	0x0095
    00A0 940E02AC  CALL	pop_gset1
    00A2 9508      RET
(0157) }
(0158) /*****************接收一个字符****************************/
(0159) uchar usart_char_receive(void) 
(0160) {
(0161) while(!(UCSRA&(1<<RXC)));
_usart_char_receive:
    00A3 9B5F      SBIS	0x0B,7
    00A4 CFFE      RJMP	_usart_char_receive
(0162) return UDR;
    00A5 B10C      IN	R16,0x0C
    00A6 9508      RET
(0163) }
(0164) 
(0165) 
(0166) /*********************延时5000+0us 函数定义**********/
(0167) void delay5ms(void)
(0168) {
(0169)     uchar i,j;
(0170)     for(i=185;i>0;i--)
_delay5ms:
  i                    --> R16
  j                    --> R18
    00A7 EB09      LDI	R16,0xB9
    00A8 C007      RJMP	0x00B0
(0171)     for(j=12;j>0;j--);
    00A9 E02C      LDI	R18,0xC
    00AA C001      RJMP	0x00AC
    00AB 952A      DEC	R18
    00AC 2422      CLR	R2
    00AD 1622      CP	R2,R18
    00AE F3E0      BCS	0x00AB
    00AF 950A      DEC	R16
    00B0 2422      CLR	R2
    00B1 1620      CP	R2,R16
    00B2 F3B0      BCS	0x00A9
    00B3 9508      RET
(0172) }
(0173) /*****************延时1秒子函数*******************/
(0174) void delay_1ms(void)
(0175) {
(0176)  uint i;
(0177) for(i=1;i<(8*143-2);i++) //8为晶振频率
_delay_1ms:
  i                    --> R16
    00B4 E001      LDI	R16,1
    00B5 E010      LDI	R17,0
    00B6 C002      RJMP	0x00B9
    00B7 5F0F      SUBI	R16,0xFF
    00B8 4F1F      SBCI	R17,0xFF
    00B9 3706      CPI	R16,0x76
    00BA E0E4      LDI	R30,4
    00BB 071E      CPC	R17,R30
    00BC F3D0      BCS	0x00B7
    00BD 9508      RET
_delay_nms:
  i                    --> R20
  n                    --> R22
    00BE 940E02A7  CALL	push_gset2
    00C0 01B8      MOVW	R22,R16
(0178) ;
(0179) }
(0180) /****************延时N毫秒子函数****************/
(0181) void delay_nms(uint n)
(0182) {
(0183) uint i;
(0184) for(i=0;i<n;i++)
    00C1 2744      CLR	R20
    00C2 2755      CLR	R21
    00C3 C003      RJMP	0x00C7
(0185) delay_1ms();
    00C4 DFEF      RCALL	_delay_1ms
    00C5 5F4F      SUBI	R20,0xFF
    00C6 4F5F      SBCI	R21,0xFF
    00C7 1746      CP	R20,R22
    00C8 0757      CPC	R21,R23
    00C9 F3D0      BCS	0x00C4
    00CA 940E029E  CALL	pop_gset2
    00CC 9508      RET
_delay_8nus:
  i                    --> R22
  k                    --> R20
  n                    --> R16
    00CD 940E02A7  CALL	push_gset2
(0186) }
(0187) /****************精确延时微妙级,8MHZ,0.25us/step***********/
(0188) void delay_8nus(uchar n)
(0189) {
(0190)   uint i,k;
(0191)   i=n;
    00CF 2F60      MOV	R22,R16
    00D0 2777      CLR	R23
(0192)   for(k=i;k>0;k--)
    00D1 01AB      MOVW	R20,R22
    00D2 C003      RJMP	0x00D6
(0193)   {
(0194)    _NOP();
    00D3 0000      NOP
    00D4 5041      SUBI	R20,1
    00D5 4050      SBCI	R21,0
    00D6 3040      CPI	R20,0
    00D7 0745      CPC	R20,R21
    00D8 F7D1      BNE	0x00D3

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -