AVR实验mega16多功能电子钟
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
A VR课程设计
数字时钟
物联网专业
一、课程目的
通过课程设计,充分利用所学知识,将知识整合,实现最基本的数字时钟。
二、课程要求
1、时间显示、日历、并且显示屏可以切换
2、秒表,可以记录多个时间,可以加入时间
3、叫醒闹钟设置,闹钟等
4、温度显示
5、记事提醒
子模块:液晶,按键,DS1302时钟,温度传感器,其他等
三、功能设计
1、时间显示:通过调用ds1302时间函数,实现时间的显示。通过按键二的控
制,显示四行数据,第二行显示时间,其余三行可自由添加;按键零实
现调制时间的分钟数和时钟数,按键一为加一控制,按键二为减一控制,
按键七为跳回主界面控制。
2、日历设置:同样是通过调用ds1302日历函数,实现日历的显示。通过按键
二的控制,跳入日历显示界面,第二行显示日历,其余三行可自由发挥;
按键零实现调制天、月和年,按键一为加一控制,按键二为减一控制,
按键七为跳回主界面。
3、闹钟显示:实现蜂鸣器和时间函数的同时调用,在当前时间等于闹钟时间时,
可以自行跳出闹钟界面,按键七可返回之前界面;在主菜单项,可以通
过按键三实现闹钟界面显示,按键零可实现闹钟时间的小时和分钟的调
制,按键一为加一,按键二为减一,按键七跳回主界面。闹钟自动跳出
提醒,按键七可以退出闹钟响应。
4、显示屏显示:整个显示屏的显示直接调用DS12864显示,菜单六栏,分别
为时钟显示,日历显示,闹钟显示,温度显示,记事本及秒表,通过按
键控制相应的区域。
四、课程器材
A VR实验箱一台
五、课程连线
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 PA0 0
#define PA1 1
#define PA2 2
/*复位脚*/
#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 {