专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
51单片机
51单片机动态数码管+定时器
2019-07-16 02:34
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
51单片机
7556
11
1495
我的学习板上有四个数码管,两个正置,两个是倒置的
我想实现每过一秒使数码管自动加一
但是实现不了,把代码贴上,麻烦各位指点下……
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
11条回答
xieshaobao228
1楼-- · 2019-07-16 07:49
#include <reg52.h>
#define TIME 50000
char t_time = 0;
char thr_bit = 0,thou_bit = 0; //thr_bit是百位,thou_bit是千位
int sin_bit = 0,dou_bit = 0; //sin_bit是个位,dou_bit是十位
char code bit_chosen[]={
0XBF,0XDF,0XEF,0XF7
}; //choose the bit
char code p_digit[] ={ //positive
0XC0,0XF9,0XA4,0XB0, //0~3
0X99,0X92,0X82,0XF8, //4~7
0X80,0X90,0X88,0X83, //8~B
0XC6,0XA1,0X86,0X8E //C~F
};
char code n_digit[]={ //negative
0XC0,0XCF,0XA4,0X86, //0~3
0X8B,0X92,0X90,0XC7, //4~7
0X80,0X82,0X81,0X98, //8~B
0X98,0X98,0X98,0X98, //C~F
};
void delay();
void main(void)
{
EA = 1;
ET0 = 1;
TR0 = 1;
TH0 = (65536-TIME)/256; //?1
TL0 = (65536-TIME)%256;
while(1) //因为倒置的数码管,所以有两个需要倒置数字的code
{ //bit_chosen数组是位选,加了注释,尽量增加可读性了
//如果有什么细节没讲到,我可以继续解释。
P2 = bit_chosen[3];
P0 = n_digit[sin_bit%10];
delay();
P2 = bit_chosen[2];
P0 = n_digit[dou_bit%10];
delay();
P2 = bit_chosen[1];
P0 = p_digit[thr_bit%10];
delay();
P2 = bit_chosen[0];
P0 = p_digit[thou_bit%10];
delay();
}
}
void delay()
{
int i,j;
for(i<50;i;i++)
for(j=1;j;j--);
}
void timer() interrupt 1
{
TH0 = (65536-TIME)/256;
TL0 = (65536-TIME)%256;
t_time++;
if(t_time ==40) //晶振24M,定时1s
{
sin_bit++; //过一秒加1
if(!(sin_bit%10)) //10秒,十位加1
dou_bit++;
if(!(sin_bit%100)) //100s,百位加1
thr_bit++;
if(!(sin_bit%1000)) //1000s,千位加1
thou_bit++;
if(!(thou_bit%10000)) //9999之后归0
sin_bit=0;
}
}
复制代码
加载中...
xieshaobao228
2楼-- · 2019-07-16 10:27
用tab排版之后可移植性果然差了很多……
顺便还有几个小问题。
1、主函数里面依然需要设置
TH0 = (65536-TIME)/256;
TL0 = (65536-TIME)%256;
吗?
因为我不了解具体的定时器的工作,是独立于CPU的么?
那样在interrupt 1 里面已经设置了
TH0 = (65536-TIME)/256;
TL0 = (65536-TIME)%256;
上电之后定时器就应该开始跑了吧……那在主函数里面再初始化不是很多余么。。
加载中...
wjs2638795
3楼-- · 2019-07-16 16:19
本帖最后由 wjs2638795 于 2013-1-31 10:04 编辑
呃呃呃呃呃呃呃
加载中...
xieshaobao228
4楼-- · 2019-07-16 18:19
精彩回答 2 元偷偷看……
加载中...
hobbye501
5楼-- · 2019-07-16 20:02
首先,你的这个代码不够规范 工程首先要有一个总的说明与描述 然后每个函数都要有说明功能返回值,还有 语句 对齐与空格 还有注释 这些都很重要 一定要养成良好的习惯 不然程序一多了 自己先乱了 找错都费劲
其次,调试时有技巧的 分步,分功能去调试,我打个比方 四个数码管弄不清楚的话就一个一个来
最后,要有耐心,这是最关键的!也是最重要的
加载中...
sirius08
6楼-- · 2019-07-16 21:24
解决了就好
加载中...
1
2
下一页
一周热门
更多
>
相关问题
【东软载波ESF0654 PDS开发板活动】开箱
1 个回答
东软载波ESF0654 PDS开发板外部中断
1 个回答
东软载波ESF0654 PDS开发板高级控制定时器AD16C4T
1 个回答
用串口调试助手为什么只能在hex模式接收发送而在文本模式不行
9 个回答
触摸芯片SC02B/SC04B在地砖灯的设计方案
1 个回答
东软载波ESF0654 PDS开发板串口USART0代码分享
1 个回答
普通32位单片机使用linux的应用代码
5 个回答
东软载波ESF0654 PDS开发板AT24C04的调试
9 个回答
相关文章
51单片机与蓝牙模块连接
0个评论
51单片机的硬件结构
0个评论
基于51单片机的无线遥控器制作
0个评论
51单片机 AD转换
0个评论
51单片机数码管递增显示
0个评论
如何实现对单片机寄存器的访问
0个评论
基于51单片机的指纹密码锁
0个评论
×
关闭
采纳回答
向帮助了您的网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
51单片机
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
关闭
您已邀请
15
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
- #include <reg52.h>
- #define TIME 50000
- char t_time = 0;
- char thr_bit = 0,thou_bit = 0; //thr_bit是百位,thou_bit是千位
- int sin_bit = 0,dou_bit = 0; //sin_bit是个位,dou_bit是十位
- char code bit_chosen[]={
- 0XBF,0XDF,0XEF,0XF7
- }; //choose the bit
-
- char code p_digit[] ={ //positive
- 0XC0,0XF9,0XA4,0XB0, //0~3
- 0X99,0X92,0X82,0XF8, //4~7
- 0X80,0X90,0X88,0X83, //8~B
- 0XC6,0XA1,0X86,0X8E //C~F
- };
- char code n_digit[]={ //negative
- 0XC0,0XCF,0XA4,0X86, //0~3
- 0X8B,0X92,0X90,0XC7, //4~7
- 0X80,0X82,0X81,0X98, //8~B
- 0X98,0X98,0X98,0X98, //C~F
- };
- void delay();
- void main(void)
- {
- EA = 1;
- ET0 = 1;
- TR0 = 1;
- TH0 = (65536-TIME)/256; //?1
- TL0 = (65536-TIME)%256;
- while(1) //因为倒置的数码管,所以有两个需要倒置数字的code
- { //bit_chosen数组是位选,加了注释,尽量增加可读性了
- //如果有什么细节没讲到,我可以继续解释。
- P2 = bit_chosen[3];
- P0 = n_digit[sin_bit%10];
- delay();
- P2 = bit_chosen[2];
- P0 = n_digit[dou_bit%10];
- delay();
- P2 = bit_chosen[1];
- P0 = p_digit[thr_bit%10];
- delay();
- P2 = bit_chosen[0];
- P0 = p_digit[thou_bit%10];
- delay();
- }
-
-
- }
- void delay()
- {
- int i,j;
- for(i<50;i;i++)
- for(j=1;j;j--);
- }
- void timer() interrupt 1
- {
- TH0 = (65536-TIME)/256;
- TL0 = (65536-TIME)%256;
- t_time++;
-
-
- if(t_time ==40) //晶振24M,定时1s
- {
- sin_bit++; //过一秒加1
-
- if(!(sin_bit%10)) //10秒,十位加1
- dou_bit++;
- if(!(sin_bit%100)) //100s,百位加1
- thr_bit++;
- if(!(sin_bit%1000)) //1000s,千位加1
- thou_bit++;
- if(!(thou_bit%10000)) //9999之后归0
- sin_bit=0;
- }
-
- }
复制代码顺便还有几个小问题。
1、主函数里面依然需要设置
TH0 = (65536-TIME)/256;
TL0 = (65536-TIME)%256;
吗?
因为我不了解具体的定时器的工作,是独立于CPU的么?
那样在interrupt 1 里面已经设置了
TH0 = (65536-TIME)/256;
TL0 = (65536-TIME)%256;
上电之后定时器就应该开始跑了吧……那在主函数里面再初始化不是很多余么。。
呃呃呃呃呃呃呃
其次,调试时有技巧的 分步,分功能去调试,我打个比方 四个数码管弄不清楚的话就一个一个来
最后,要有耐心,这是最关键的!也是最重要的
一周热门 更多>