找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3666|回复: 2
打印 上一主题 下一主题
收起左侧

AVR的万年历proteus仿真及源码 原理图

[复制链接]
跳转到指定楼层
楼主
发一个基于avr单片机做的万年历的proteus仿真,下面是原理图:


所有资料下载: DS1302.zip (63.01 KB, 下载次数: 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. /**********函数申明*******************/
  40. /********LCD操作函数********/
  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操作函数********/
  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. /**********数据初始化*******************/
  55. uchar PROGMEM clock[7]={0x50,0x59,0x23,0x08,0x08,0x04,0x08};
  56. uchar time[8];
  57. /**********主函数*******************/
  58. int main(void)
  59. {
  60. SPL=0X5F;//堆栈初始化
  61. SPH=0X04;
  62. DDRB=0XFF;//设PB口输出
  63. DDRC=0XFF;//设PC口输出
  64. DDRD=0XFF;//设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控制函数*******************/
  77. //LCD初始化
  78. void lcd_initial(void)
  79. {
  80.         _delay_ms(10);
  81.         write_command(0x38);//8位总线,双行显示,5X7的点阵字符
  82.         write_command(0x0C);//开整体显示,光标关,无黑块
  83.         write_command(0x06);//光标右移
  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写数据
  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控制函数*******************/
  133. //八位数据写入函数
  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. //八位数据读出函数
  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. //写寄存器函数
  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. //读寄存器函数
  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. //设置时间初值函数
  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. //读当前时间值函数
  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);//写时
  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. }
复制代码

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:147078 发表于 2016-11-9 17:41 来自手机 | 只看该作者
看看学习一下
回复

使用道具 举报

板凳
ID:147078 发表于 2016-11-9 22:57 来自手机 | 只看该作者
学习了 赞一个
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表