AVR课程设计 数字时钟
物联网专业
一、 课程目的
通过课程设计,充分利用所学知识,将知识整合,实现最基本的数字时钟。
二、 课程要求
1、 时间显示、日历、并且显示屏可以切换 2、 秒表,可以记录多个时间,可以加入时间 3、 叫醒闹钟设置,闹钟等 4、 温度显示 5、 记事提醒
子模块:液晶,按键,DS1302时钟,温度传感器,其他等
三、 功能设计
1、 时间显示:通过调用ds1302时间函数,实现时间的显示。通过按键二的控
制,显示四行数据,第二行显示时间,其余三行可自由添加;按键零实现调制时间的分钟数和时钟数,按键一为加一控制,按键二为减一控制,按键七为跳回主界面控制。
2、 日历设置:同样是通过调用ds1302日历函数,实现日历的显示。通过按键
二的控制,跳入日历显示界面,第二行显示日历,其余三行可自由发挥;按键零实现调制天、月和年,按键一为加一控制,按键二为减一控制,按键七为跳回主界面。 3、 闹钟显示:实现蜂鸣器和时间函数的同时调用,在当前时间等于闹钟时间时,
可以自行跳出闹钟界面,按键七可返回之前界面;在主菜单项,可以通过按键三实现闹钟界面显示,按键零可实现闹钟时间的小时和分钟的调制,按键一为加一,按键二为减一,按键七跳回主界面。闹钟自动跳出提醒,按键七可以退出闹钟响应。
4、 显示屏显示:整个显示屏的显示直接调用DS12864显示,菜单六栏,分别
为时钟显示,日历显示,闹钟显示,温度显示,记事本及秒表,通过按键控制相应的区域。
四、 课程器材 AVR实验箱一台 五、 课程连线
1、 按键JP37接PB口,实现按键控制
2、 ds12864的D口,接PD口,实现显示屏显示 3、 RS,RW,E分别接PA5,PA6,PA7
4、 ds1302的SCK,I/C,RST口分别接PA0,PA1,PA2,实现时钟显示 5、 ds1820的JP39接PA3,实现温度传感器 6、 ds1820的JP16接PA4,实现蜂鸣器
六、 课程代码
DS1302
#include
/*复位脚*/
#define RST_CLR PORTA &= ~(1 << PA2)/*电平置低*/ #define RST_SET PORTA |= (1 << PA2)/*电平置高*/ #define RST_IN DDRA &= ~(1 << PA2)/*方向输入*/ #define RST_OUT DDRA |= (1 << PA2)/*方向输出*/ /*双向数据*/
#define IO_CLR PORTA &= ~(1 << PA1)/*电平置低*/ #define IO_SET PORTA |= (1 << PA1)/*电平置高*/ #define IO_R PINA & (1 << PA1)/*电平读取*/ #define IO_IN DDRA &= ~(1 << PA1)/*方向输入*/ #define IO_OUT DDRA |= (1 << PA1)/*方向输出*/ /*时钟信号*/
#define SCK_CLR PORTA &= ~(1 << PA0)/*时钟信号*/ #define SCK_SET PORTA |= (1 << PA0)/*电平置高*/ #define SCK_IN DDRA &= ~(1 << PA0)/*方向输入*/ #define SCK_OUT DDRA |= (1 << PA0)/*方向输出*/
#define ds1302_sec_add 0x80 //秒数据地址 #define ds1302_min_add 0x82 //分数据地址 #define ds1302_hr_add 0x84 //时数据地址 #define ds1302_date_add 0x86 //日数据地址 #define ds1302_month_add 0x88 //月数据地址 #define ds1302_day_add 0x8a //星期数据地址 #define ds1302_year_add 0x8c //年数据地址 #define ds1302_control_add 0x8e //控制数据地址 #define ds1302_charger_add 0x90 #define ds1302_clkburst_add 0xbe
unsigned char time_buf[8] = {0x20,0x14,0x05,0x14,0x23,0x59,0x00,0x02};
/*向DS1302写入一字节数据*/
void ds1302_write_byte(unsigned char addr, unsigned char d) { unsigned char i; RST_SET; /*启动DS1302总线*/ /*写入目标地址:addr*/ IO_OUT;
addr = addr & 0xFE;/*最低位置零*/ for (i = 0; i < 8; i ++) { if (addr & 0x01) { IO_SET; } else { IO_CLR; } SCK_SET; SCK_CLR; addr = addr >> 1; } /*写入数据:d*/ IO_OUT; for (i = 0; i < 8; i ++) { if (d & 0x01) { IO_SET; } else { IO_CLR; } SCK_SET; SCK_CLR; d = d >> 1; } RST_CLR; /*停止DS1302总线*/ }
/*从DS1302读出一字节数据*/
unsigned char ds1302_read_byte(unsigned char addr) { unsigned char i; unsigned char temp; RST_SET; /*启动DS1302总线*/ /*写入目标地址:addr*/ IO_OUT; addr = addr | 0x01;/*最低位置高*/ for (i = 0; i < 8; i ++) { if (addr & 0x01) { IO_SET; } else {
相关推荐: