|
發(fā)一個(gè)基于avr單片機(jī)做的萬(wàn)年歷的proteus仿真,下面是原理圖:
0.png (247.53 KB, 下載次數(shù): 113)
下載附件
2016-9-27 17:39 上傳
0.png (53.38 KB, 下載次數(shù): 126)
下載附件
2016-9-27 17:40 上傳
所有資料下載:
DS1302.zip
(63.01 KB, 下載次數(shù): 841)
2016-9-27 17:41 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
源程序:
- /********************************
- FILE NAME: DS1302.c
- CHIP TYPE: ATMEGA16
- CLOCK FREQUENCY: 8MHZ
- IDE: AVR Studio 4.15
- COMPILER: GCC 4.3.2 avr-libc 1.6.6
- TIME: 2009/5
- AUTHOR: WINDWAY ELECTRONICS GUANGZHOU LIMITED
- ********************************/
- #include <avr/io.h>
- #include <avr/pgmspace.h>
- #include <util/delay.h>
- #define uchar unsigned char
- #define uint unsigned int
- /**********位操作定義******************/
- #define sbit(x,PORT) (PORT) |= (1<<x)
- #define cbit(x,PORT) (PORT) &= ~(1<<x)
- #define pin(x,PIN) (PIN)&(1<<x)
- /**********端口定義*******************/
- /********LCD控制端口********/
- #define S_RS sbit(0,PORTD)
- #define C_RS cbit(0,PORTD)
- #define S_RW sbit(1,PORTD)
- #define C_RW cbit(1,PORTD)
- #define S_E sbit(2,PORTD)
- #define C_E cbit(2,PORTD)
- #define out PORTC
- #define check_busy_bit pin(7,PINC)
- /********DS1302控制端口********/
- #define S_RST sbit(0,PORTB)
- #define C_RST cbit(0,PORTB)
- #define S_SCLK sbit(1,PORTB)
- #define C_SCLK cbit(1,PORTB)
- #define S_IO sbit(2,PORTB)
- #define C_IO cbit(2,PORTB)
- #define IO pin(2,PINB)
- #define IO_IN DDRB&=~(1<<2)
- #define IO_OUT DDRB|=(1<<2)
- /**********函數(shù)申明*******************/
- /********LCD操作函數(shù)********/
- void lcd_initial(void);
- void write_data(uchar);
- void write_command(uchar);
- void check_busy(void);
- void string(uchar ad,uchar *s);
- void display(void);
- /********DS1302操作函數(shù)********/
- void write_byte(uchar);
- uchar read_byte(void);
- void wr1302(uchar,uchar);
- uchar re1302(uchar);
- void set1302(void);
- void get1302(uchar curtime[]) ;
- /**********數(shù)據(jù)初始化*******************/
- uchar PROGMEM clock[7]={0x50,0x59,0x23,0x08,0x08,0x04,0x08};
- uchar time[8];
- /**********主函數(shù)*******************/
- int main(void)
- {
- SPL=0X5F;//堆棧初始化
- SPH=0X04;
- DDRB=0XFF;//設(shè)PB口輸出
- DDRC=0XFF;//設(shè)PC口輸出
- DDRD=0XFF;//設(shè)PD口輸出
- out=0xff;
- PORTB=0XFF;
- PORTD=0XFF;
- lcd_initial();
- set1302( );
- while(1)
- {
- get1302(time);
- display();
- }
- }
- /**********LCD控制函數(shù)*******************/
- //LCD初始化
- void lcd_initial(void)
- {
- _delay_ms(10);
- write_command(0x38);//8位總線,雙行顯示,5X7的點(diǎn)陣字符
- write_command(0x0C);//開(kāi)整體顯示,光標(biāo)關(guān),無(wú)黑塊
- write_command(0x06);//光標(biāo)右移
- write_command(0x01);//清屏
- }
- //查忙程序
- void check_busy(void)
- {
- DDRC=0X00;
- do{
- C_E;
- C_RS;
- S_RW;
- S_E;
- _delay_us(1);
- }while(check_busy_bit);
- C_E;
- DDRC=0XFF;
- _delay_ms(1);
- }
- //向LCD寫指令
- void write_command(uchar command)
- {
- check_busy();
- out=command;
- C_RS;
- C_RW;
- S_E;
- _delay_us(40);
- C_E;
- }
- //向LCD寫數(shù)據(jù)
- void write_data(uchar dat)
- {
- check_busy();
- out=dat;
- S_RS;
- C_RW;
- S_E;
- _delay_us(40);
- C_E;
- }
- //顯示字符串
- void string(uchar ad,uchar *s)
- {
- write_command(ad);
- while(*s>0)
- { write_data(*s++);
- _delay_ms(100);
- }
- }
- /**********DS1302控制函數(shù)*******************/
- //八位數(shù)據(jù)寫入函數(shù)
- void write_byte(uchar dat)
- {
- uchar i;
- IO_OUT;
- for(i=8; i>0; i--)
- {
- if(dat&0x01)S_IO;else C_IO;
- S_SCLK;
- C_SCLK;
- dat=dat>>1;
- }
- }
- //八位數(shù)據(jù)讀出函數(shù)
- uchar read_byte(void)
- {
- uchar i,temp=0;
- IO_IN;
- for(i=8; i>0; i--)
- {
- temp=temp>>1;
- if(IO)temp|=0X80;
- S_SCLK;
- C_SCLK;
- }
- return(temp);
- }
- //寫寄存器函數(shù)
- void wr1302(uchar add,uchar date)
- {
- C_RST;
- C_SCLK;
- S_RST;
- write_byte(add);
- write_byte(date);
- S_SCLK;
- C_RST;
- }
- //讀寄存器函數(shù)
- uchar re1302(uchar add)
- {
- uchar dat;
- C_RST;
- C_SCLK;
- S_RST;
- write_byte(add);
- dat=read_byte();
- S_SCLK;
- C_RST;
- return(dat);
- }
- //設(shè)置時(shí)間初值函數(shù)
- void set1302(void)
- {
- uchar i,add=0x80;
- wr1302(0x8e,0x00);
- for(i=0;i<8;i++)
- {
- wr1302(add,pgm_read_byte(&clock[i]));
- _delay_us(2);
- add+=2;
- }
- wr1302(0x8e,0x00);
- }
- //讀當(dāng)前時(shí)間值函數(shù)
- void get1302(uchar curtime[])
- {
- uchar i,add=0x81;
- for (i=0;i<7;i++)
- {
- curtime[i]=re1302(add);
- add+=2;
- }
-
- }
- //寫顯示屏
- void display(void)
- {
- write_command(0x84);//寫年
- write_data(time[6]/16+0x30);
- write_data(time[6]%16+0x30);
- write_data(0x2D); //寫“-”
- write_command(0x87);//寫月
- write_data(time[4]/16+0x30);
- write_data(time[4]%16+0x30);
- write_data(0x2D); //寫“-”
- write_command(0x8a);//寫日
- write_data(time[3]/16+0x30);
- write_data(time[3]%16+0x30);
- write_command(0xc1);//寫星期
- write_data(time[5]%16+0x30);
-
- write_command(0xc4);//寫時(shí)
- write_data(time[2]/16+0x30);
- write_data(time[2]%16+0x30);
- write_data(0x2D); //寫“-”
- write_command(0xc7);//寫分
- write_data(time[1]/16+0x30);
- write_data(time[1]%16+0x30);
- write_data(0x2D); //寫“-”
- write_command(0xca);//寫秒
- write_data(time[0]/16+0x30);
- write_data(time[0]%16+0x30);
- }
復(fù)制代碼
|
|