单片机不计时了,是不是ds1302d坏了
答案:3 悬赏:70 手机版
解决时间 2021-02-16 07:51
- 提问者网友:你独家记忆
- 2021-02-15 11:59
单片机不计时了,是不是ds1302d坏了
最佳答案
- 五星知识达人网友:轻雾山林
- 2021-02-15 13:20
ds1302d不会无缘无故就坏了。这要看原来是什么情况,是新做的板子,新写的程序啊,就不计时呢?
还是原来一直在正常使用计时,突然间就坏了,得有点什么原因吧。
不计时,显示电路还能正常显示不?
不计时的原因不只是ds1302d坏了一个原因。
还是原来一直在正常使用计时,突然间就坏了,得有点什么原因吧。
不计时,显示电路还能正常显示不?
不计时的原因不只是ds1302d坏了一个原因。
全部回答
- 1楼网友:妄饮晩冬酒
- 2021-02-15 15:41
具体点啊,这样一个题目不知所以啊
- 2楼网友:舍身薄凉客
- 2021-02-15 14:32
#include
#define uchar unsigned char
#define uint unsigned int
#define keyboard p2
#define locationcs p1
#define dispseg p0
unsigned char code segcode[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x40}; // 共阴段码
unsigned char code location[] = {0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f}; // 共阴位选码
uchar index = 0; // 显示缓冲区指针
uchar hour = 0; // 小时变量
uchar min = 0; // 分钟变量
uchar sec = 0; // 秒钟变量
uint timer = 0; // 中断次数计数变量
uchar dispbuf[] = {0, 0, 0x40, 0, 0, 0x40, 0, 0}; // 8个数码管对应的显示缓冲区,显示格式:时-分-秒
uchar keycode; // 按键码高位
uint delaykey; // 按键延时变量
void init();
void dispbufupdate();
void disposekeys();
void main(void)
{
init(); // 初始化
while(1)
{
if(keycode != 0) // 如果有按键码就处理按键
{
disposekeys();
keycode = 0; // 处理完按键码清零
}
}
}
void dispbufupdate()
{
dispbuf[0] = segcode[sec % 10]; // 秒个位
dispbuf[1] = segcode[sec / 10]; // 秒十位
dispbuf[3] = segcode[min % 10];
dispbuf[4] = segcode[min / 10];
dispbuf[6] = segcode[hour % 10];
dispbuf[7] = segcode[hour / 10];
}
void disposekeys()
{
switch(keycode)
{
case 0x77:
hour++;
if(hour == 24)hour = 0;
break;
case 0x7b:
if(hour == 0) hour = 24;
hour--;
break;
case 0xb7:
min++;
if(min == 60) min = 0;
break;
case 0xbb:
if(min == 0) min = 60;
min--;
break;
default:
break;
}
delaykey = 300; // 延时变量赋值,300次定时中断后(300/1200 = 0.25秒)如果不松键则会连续产生键值,时间变量会连续加或连续减,直到松键
}
void init()
{
tmod = 0x01; // 定义定时器0为16位定时器
th0 = -3; // 11059200 = 12*256*3*1200,晶振12分频后是:921600机器周期/秒,
// 设置定时器每3*256个机器周期中断1次,中断1200次就是一秒钟。
// tl0因初值为0,加到256=0,相当于自动重装了,所以不用定义了,既节约了时间又走时准确。
et0 = 1; // 允许t0中断
ea = 1; // 开总中断
tr0 = 1; // 启动t0
dispbufupdate(); // 显示初始值
}
void intt0() interrupt 1
{
th0 = -3; // 重装定时器初值
locationcs = 0xff; // 清位选消隐
dispseg = dispbuf[index]; // 输出显示内容
locationcs = location[index++]; // 选择显示位置
index &= 7; // 等效于if(index == 8)index = 0; 循环指向8个显示位置
if(delaykey == 0) // 上次中断没检测到按键则需扫描按键
{
keyboard = 0x0f;
if(keyboard != 0x0f) // 若有按键发生,则 keyboard 低4位不全为1
{
delaykey = 6; // 设置按键消颤延时时间,6/1200 = 5毫秒
}
}
else
{
delaykey--; // 延时时间未到,延时变量减一
if(delaykey == 0) // 按键延时时间到,可以取键值了
{
keyboard = 0x0f;
if(keyboard != 0x0f) // 若延时后仍检测到按键,则为有效按键
{
keycode = keyboard; // 取按键“行”地址
keyboard = 0xf0; // 取按键“列”地址
keycode |= keyboard;// 按键“行”“列”地址相或 = 有效键值
}
}
}
timer++; // 中断次数计数
if(timer == 1200) // 1200次为1秒
{
timer = 0;
sec++;
if(sec == 60) // 时间进位处理
{
min++;
sec = 0;
if(min == 60)
{
hour++;
min = 0;
if(hour == 24)
{
hour = 0;
}
}
}
dispbufupdate();
}
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯