打印
[AVR单片机]

数字闹钟程序求助

[复制链接]
1423|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fze6e96|  楼主 | 2011-12-18 15:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在做一个数字闹钟 出现了点问题在固定点会跑飞 求助
用的mega64 6M 30K TWI 时钟芯片是ds1339   使用gcc编程 下边是程序轮廓,就不把所有的程序搬上来了 用了5个按键 大体功能已经实现 但在某些按键固定切换时会有问题 使用了外部中断7接收1339中断信号 另外时钟在屏幕上走的很快(现实1秒,屏幕3秒) 怎样解决,经检查电压过高(标准3.3  实际4.6但没超安全线,是否是这个问题,晶振脚外接两根较长的导线再接晶振并将导线靠近,速度会变慢) 晶振检查无误 switch功能分为3大组 0x01-04普通调时间,秒分时确认 11-14闹钟一秒分时确认 22-24闹钟二分时确认 默认为时钟显示      问题是这样的 开始设置闹钟(1,2任意,测试用的2),等到达闹钟时间后,处理中断并延时一段时间,之后清零时钟,再次设定闹钟,当设置完时位,确认后系统跑飞,经测试跑飞在0x24下边的DS1339WR(14);这一条进去后出不来,运行完子程序,直接飞了,如何解决,这样操作必飞

#include "header.h"

ISR(SIG_INTERRUPT7)//中断
{
//cli();//关7,6,5,4中断
interrupt_7=1;
time1339=0x04;
DS1339WR(14);
time1339=0x00;
DS1339WR(15);
EIFR=0xFF;//手动清标志位
//sei();
}

int main(void)
{
uchar total;
k0=0;
sigin=0;
keyms=0;
init_devices();
set1339();
sei();//先清1339内部中断信号,再开中断
ttt:
key_select();
k_4();
k_5();
dele_te();
total=sigin+keyselect;
switch(total)
{
case 0:
default_sigin0();
break;

case 0x01://秒 K1 加  K2 减
sigin0_1();
break;

case  0x02://分
sigin0_2();
break;

case  0x03://时 24小时制
sigin0_3();
break;

case 0x04:
keyselect=0;
sigin=0;
DS1339WR(0);
time1339=time1338;
DS1339WR(1);
time1339=time1337;
DS1339WR(2);
break;

case 0x11:
sigin1_1();
break;

case 0x12:
sigin1_2();
break;

case  0x13:
sigin1_3();
break;

case 0x14:
keyselect=0;
sigin=0;
DS1339WR(7);
time1339=time1338;
DS1339WR(8);
time1339=time1337;
DS1339WR(9);
time1339=0x05;
DS1339WR(14);
break;

case 0x22:
sigin2_2();
break;

case 0x23:
sigin2_3();
break;

case 0x24:
sigin=0;
keyselect=0;
DS1339WR(11);
time1339=time1338;
DS1339WR(12);
time1339=0x06;
DS1339WR(14);
PORTF=time1339;
break;

default:
default_sigin0();
break;
}
goto ttt;
while(1);
}
库文件
#ifndef __header_h__
#define __header_h__

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>   
#include <util/twi.h> //包含io端口、中断和延时头文件

#define NOP asm("NOP")
#define uint unsigned int
typedef unsigned char uchar;   //可编译

void init_devices(void);
void port_init(void);
void DS1339RD(void);
void k_4(void);//按键4 定时1
void k_5(void);//按键5 定时2
void dele_te(void);//清除定时器
void key_select(void);//秒 分 时 选择按钮
void set1339(void);//1339初始化
void DS1339WR(uchar add1339);//写
void DS1339WD(uchar addst);//写读
//不同键值的散转
void sigin0_1(void);//普通时间的秒
void sigin0_2(void);//普通分
void sigin0_3(void);//时
void default_sigin0(void);//时钟自动运行状态
void sigin1_1(void);//闹钟1时间设定秒
void sigin1_2(void);//闹钟1时间设定分
void sigin1_3(void);//闹钟1时间设定时
void sigin2_2(void);//闹钟2时间设定分
void sigin2_3(void);//闹钟2时间设定时

uchar interrupt_7;//闹钟中断延时标志
uchar keyselect;//秒分时选择
uchar k0,k2,k3;
uchar k4;
uchar keyms;//加减键值位  
uchar time1339; //向1339写数据用变量,同时是秒值暂存位
uchar time1338;//分值暂存位
uchar time1337;//时暂存位
uchar sigin;//普通 闹钟1 闹钟2 选择,使用高4位,于keyselect低四位组合使用,节省嵌套
#endif
写1339 程序
#include "header.h"
void DS1339WR(uchar add1339)//写程序 起始地址  
{  
TWCR=(1<<TWSTA)|(1<<TWINT)|(1<<TWEN);
while((TWCR&(1<<TWINT))==0);
TWDR=0xd0;
TWCR=(1<<TWINT)|(1<<TWEN);
while((TWCR&(1<<TWINT))==0);
TWDR=add1339;
TWCR=(1<<TWINT)|(1<<TWEN);
while((TWCR&(1<<TWINT))==0);
TWDR=time1339;
TWCR=(1<<TWINT)|(1<<TWEN);
while((TWCR&(1<<TWINT))==0);
TWCR=((1<<TWSTO)|(1<<TWINT)|(1<<TWEN));
}

相关帖子

沙发
fze6e96|  楼主 | 2011-12-18 21:17 | 只看该作者
各位大神 有会的没

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

2

帖子

1

粉丝