找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 4510|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

AVR的萬(wàn)年歷proteus仿真及源碼 原理圖

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
發(fā)一個(gè)基于avr單片機(jī)做的萬(wàn)年歷的proteus仿真,下面是原理圖:


所有資料下載: DS1302.zip (63.01 KB, 下載次數(shù): 841)

源程序:
  1. /********************************
  2. FILE  NAME:           DS1302.c
  3. CHIP  TYPE:           ATMEGA16
  4. CLOCK  FREQUENCY:         8MHZ
  5. IDE:  AVR Studio 4.15
  6. COMPILER:  GCC  4.3.2  avr-libc 1.6.6
  7. TIME: 2009/5
  8. AUTHOR:         WINDWAY ELECTRONICS GUANGZHOU LIMITED
  9. ********************************/
  10. #include <avr/io.h>
  11. #include <avr/pgmspace.h>
  12. #include <util/delay.h>
  13. #define uchar unsigned char
  14. #define uint unsigned int
  15. /**********位操作定義******************/
  16. #define sbit(x,PORT) (PORT) |= (1<<x)
  17. #define cbit(x,PORT) (PORT) &= ~(1<<x)
  18. #define pin(x,PIN) (PIN)&(1<<x)
  19. /**********端口定義*******************/
  20. /********LCD控制端口********/
  21. #define S_RS sbit(0,PORTD)
  22. #define C_RS cbit(0,PORTD)
  23. #define S_RW sbit(1,PORTD)
  24. #define C_RW cbit(1,PORTD)
  25. #define S_E  sbit(2,PORTD)
  26. #define C_E  cbit(2,PORTD)
  27. #define out  PORTC
  28. #define check_busy_bit pin(7,PINC)
  29. /********DS1302控制端口********/
  30. #define S_RST sbit(0,PORTB)
  31. #define C_RST cbit(0,PORTB)
  32. #define S_SCLK sbit(1,PORTB)
  33. #define C_SCLK cbit(1,PORTB)
  34. #define S_IO  sbit(2,PORTB)
  35. #define C_IO  cbit(2,PORTB)
  36. #define IO  pin(2,PINB)
  37. #define IO_IN  DDRB&=~(1<<2)
  38. #define IO_OUT  DDRB|=(1<<2)
  39. /**********函數(shù)申明*******************/
  40. /********LCD操作函數(shù)********/
  41. void lcd_initial(void);
  42. void write_data(uchar);
  43. void write_command(uchar);
  44. void check_busy(void);
  45. void string(uchar ad,uchar *s);
  46. void display(void);
  47. /********DS1302操作函數(shù)********/
  48. void write_byte(uchar);
  49. uchar read_byte(void);
  50. void wr1302(uchar,uchar);
  51. uchar re1302(uchar);
  52. void set1302(void);
  53. void get1302(uchar curtime[]) ;
  54. /**********數(shù)據(jù)初始化*******************/
  55. uchar PROGMEM clock[7]={0x50,0x59,0x23,0x08,0x08,0x04,0x08};
  56. uchar time[8];
  57. /**********主函數(shù)*******************/
  58. int main(void)
  59. {
  60. SPL=0X5F;//堆棧初始化
  61. SPH=0X04;
  62. DDRB=0XFF;//設(shè)PB口輸出
  63. DDRC=0XFF;//設(shè)PC口輸出
  64. DDRD=0XFF;//設(shè)PD口輸出
  65. out=0xff;
  66. PORTB=0XFF;
  67. PORTD=0XFF;
  68. lcd_initial();
  69. set1302( );
  70. while(1)
  71.         {
  72.         get1302(time);
  73.         display();
  74.         }
  75. }
  76. /**********LCD控制函數(shù)*******************/
  77. //LCD初始化
  78. void lcd_initial(void)
  79. {
  80.         _delay_ms(10);
  81.         write_command(0x38);//8位總線,雙行顯示,5X7的點(diǎn)陣字符
  82.         write_command(0x0C);//開(kāi)整體顯示,光標(biāo)關(guān),無(wú)黑塊
  83.         write_command(0x06);//光標(biāo)右移
  84.         write_command(0x01);//清屏
  85. }
  86. //查忙程序
  87. void check_busy(void)
  88. {
  89. DDRC=0X00;
  90. do{
  91.         C_E;
  92.         C_RS;
  93.         S_RW;
  94.         S_E;
  95.         _delay_us(1);
  96.   }while(check_busy_bit);
  97. C_E;
  98. DDRC=0XFF;
  99. _delay_ms(1);
  100. }
  101. //向LCD寫指令
  102. void write_command(uchar command)
  103. {
  104. check_busy();
  105. out=command;
  106. C_RS;
  107. C_RW;
  108. S_E;
  109. _delay_us(40);
  110. C_E;
  111. }
  112. //向LCD寫數(shù)據(jù)
  113. void write_data(uchar dat)
  114. {
  115. check_busy();
  116. out=dat;
  117. S_RS;
  118. C_RW;
  119. S_E;
  120. _delay_us(40);
  121. C_E;
  122. }
  123. //顯示字符串
  124. void string(uchar ad,uchar *s)
  125. {
  126. write_command(ad);
  127. while(*s>0)
  128.    {  write_data(*s++);
  129.       _delay_ms(100);
  130.    }
  131. }
  132. /**********DS1302控制函數(shù)*******************/
  133. //八位數(shù)據(jù)寫入函數(shù)
  134. void write_byte(uchar dat)
  135. {
  136. uchar i;
  137. IO_OUT;
  138. for(i=8; i>0; i--)
  139.         {
  140.         if(dat&0x01)S_IO;else C_IO;
  141.         S_SCLK;
  142.         C_SCLK;
  143.         dat=dat>>1;
  144.         }
  145. }
  146. //八位數(shù)據(jù)讀出函數(shù)
  147. uchar read_byte(void)
  148. {
  149. uchar i,temp=0;
  150. IO_IN;
  151. for(i=8; i>0; i--)
  152.         {
  153.         temp=temp>>1;
  154.         if(IO)temp|=0X80;
  155.         S_SCLK;
  156.         C_SCLK;                 
  157.         }
  158.         return(temp);
  159. }
  160. //寫寄存器函數(shù)
  161. void wr1302(uchar add,uchar date)
  162.   {
  163.   C_RST;
  164.   C_SCLK;
  165.   S_RST;
  166.   write_byte(add);
  167.   write_byte(date);
  168.   S_SCLK;
  169.   C_RST;
  170.   }
  171. //讀寄存器函數(shù)
  172. uchar re1302(uchar add)
  173. {
  174.   uchar dat;
  175.   C_RST;
  176.   C_SCLK;
  177.   S_RST;
  178.   write_byte(add);
  179.   dat=read_byte();
  180.   S_SCLK;
  181.   C_RST;
  182.   return(dat);
  183.   }
  184. //設(shè)置時(shí)間初值函數(shù)
  185. void set1302(void)
  186.   {
  187. uchar i,add=0x80;
  188. wr1302(0x8e,0x00);
  189. for(i=0;i<8;i++)
  190.          {
  191.          wr1302(add,pgm_read_byte(&clock[i]));
  192.          _delay_us(2);
  193.          add+=2;
  194.      }
  195. wr1302(0x8e,0x00);
  196.   }
  197. //讀當(dāng)前時(shí)間值函數(shù)
  198. void get1302(uchar curtime[])
  199. {
  200.     uchar i,add=0x81;
  201.     for (i=0;i<7;i++)
  202.             {
  203.         curtime[i]=re1302(add);
  204.         add+=2;         
  205.             }
  206.         
  207. }
  208. //寫顯示屏
  209. void display(void)
  210. {
  211.         write_command(0x84);//寫年
  212.         write_data(time[6]/16+0x30);
  213.         write_data(time[6]%16+0x30);

  214.         write_data(0x2D); //寫“-”
  215.         write_command(0x87);//寫月
  216.         write_data(time[4]/16+0x30);
  217.         write_data(time[4]%16+0x30);

  218.         write_data(0x2D); //寫“-”        
  219.         write_command(0x8a);//寫日
  220.         write_data(time[3]/16+0x30);
  221.         write_data(time[3]%16+0x30);

  222.         write_command(0xc1);//寫星期
  223.         write_data(time[5]%16+0x30);
  224.         
  225.         write_command(0xc4);//寫時(shí)
  226.         write_data(time[2]/16+0x30);
  227.         write_data(time[2]%16+0x30);
  228.         write_data(0x2D); //寫“-”
  229.         write_command(0xc7);//寫分
  230.         write_data(time[1]/16+0x30);
  231.         write_data(time[1]%16+0x30);
  232.         write_data(0x2D); //寫“-”
  233.         write_command(0xca);//寫秒
  234.         write_data(time[0]/16+0x30);
  235.         write_data(time[0]%16+0x30);                                
  236. }
復(fù)制代碼

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:147078 發(fā)表于 2016-11-9 17:41 來(lái)自手機(jī) | 只看該作者
看看學(xué)習(xí)一下
回復(fù)

使用道具 舉報(bào)

板凳
ID:147078 發(fā)表于 2016-11-9 22:57 來(lái)自手機(jī) | 只看該作者
學(xué)習(xí)了 贊一個(gè)
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表