用51单片机设计了一个简单的倒计时器,但数码管有点小问题,请教高手

作者&投稿:安柳 (若有异议请与网页底部的电邮联系)
利用51单片机,4个数码管设计一个计时器,要求在数码管上显示的数据从0开始每1秒钟加1。~

共阳数码管中断程序:
#include
#define uint unsigned int
#define uchar unsigned char
uchar code table[]=
{
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x83,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e};
uint num,a;
uchar bai,shi,ge;
void init();
void delay(uint);
void display(ucharbai,ucharshi,ucharge);
uint fb();
uint fs();
uint fg();
void main()
{
init();
while(1)
{
display(fb(),fs(),fg());
}
}
void init()
{
num=0;
a=0;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void display(ucharbai,ucharshi,ucharge)
{
P1=0xfd;
P0=table[bai];
delay(1);
P1=0xfb;
P0=table[shi];
delay(1);
P1=0xf7;
P0=table[ge];
delay(1);
}
void timeoff() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65526-50000)%256;
a++;
if(a%20==0)
{
num++;
if(num==999)
{
num=0;
}
}
}void delay(uint z){
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
uint fb()
{
bai=num/100;
return bai;
}
uint fs()
{
shi=num%100/10;
return shi;
}
uint fg()
{
ge =num%100%10;
return ge;
}

扩展资料
2个可编程定时/计数器·5个中断源,2个优先级(52有6个)
一个全双工串行通信口
外部数据存储器寻址空间为64kB
外部程序存储器寻址空间为64kB
逻辑操作位寻址功能·双列直插40PinDIP封装
单一+5V电源供电
CPU:由运算和控制逻辑组成,同时还包括中断系统和部分外部特殊功能寄存器;
RAM:用以存放可以读写的数据,如运算的中间结果、最终结果以及欲显示的数据;
ROM:用以存放程序、一些原始数据和表格;
I/O口:四个8位并行I/O口,既可用作输入,也可用作输出
T/C:两个定时/记数器,既可以工作在定时模式,也可以工作在记数模式;
五个中断源的中断控制系统;
一个全双工UART(通用异步接收发送器)的串行I/O口,用于实现单片机之间或单片机与微机之间的串行通信;
片内振荡器和时钟产生电路,石英晶体和微调电容需要外接。最佳振荡频率为6M—12M。
参考资料来源:百度百科-51单片机


具体什么问题?原理图或者仿真图要发出来,程序最好完整提供,至少LED数码管显示子程序要完整提供呀。

试试看:
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
uchar code table[] = {
0x3F,0x06,0x5B,0x4F,0x66,
0x6D,0x7D,0x07,0x7F,0x6F};
uchar data1[]={5, 9}; //保存倒计时初始值
uchar num; //设为全局变量
uchar count;

sbit a = P1^0; //设置键
sbit b = P1^1; //增一键
sbit c = P1^2; //减一键
sbit d = P1^3; //确定键

sbit e = P3^0; //控制LED发光
sbit f = P3^2;

void delayms(uint t)
{
uint a, b;
for(a = t; a > 0; a--) for(b = 125; b > 0; b--);
}
void display() //数码管显示函数.
{
uchar i;
for(i = 0; i < 2; i++) {
P0 = table[data1[i]];
P2 = ~(i + 1);
delayms(2);
P2 = 255;
}
while(!(data1[1] || data1[0])) { //当倒计时到0时点亮LED,停止计时.
TR0 = 0;
e = 0;
f = 0;
P2 = 0xFC;
P0 = 0x3F;
}
}

void keyscan()
{
if(a == 0) {
display();
if(a == 0) {
TR0 = 0;
num++;
}
}
while(!a) display();//松手检测.

if(num >= 1) {
if(b == 0) {
display();
if(b == 0) {
while(!b) display();
data1[1]++;
if(data1[1] == 10) {
data1[1] = 0;
data1[0]++;
if(data1[0] == 6) data1[0] = 1;
}
}
}

if(c == 0) {
display();
if(c == 0) {
while(!c) display();
data1[1]--;
if(data1[1] == 255) {
data1[1] = 9;
data1[0]--;
}
}
}
}
if(d == 0) {TR0 = 1; num = 0;}
}

void main()
{
TMOD = 0x01;
TH0 = 0x3C;
TL0 = 0xB0;
TR0 = 1;
ET0 = 1;
EA = 1;
while(1) {
keyscan();
display();
}
}

void timer0() interrupt 1
{
TH0 = 0x3C;
TL0 = 0xB0;
count++;
if(count == 20) {
count = 0;
data1[1]--;
if(data1[1] == -1) {
data1[1] = 9;
data1[0]--;
}
}
}

把数码管显示的刷新程序放在中断中,不就OK了。
这就相当于多任务系统,又开了个线程。


用51单片机并行口设计显示一个数码的电路,使数码管循环显示“0...
这是共阳极的数码管,至于你要显示0~F这个在编程实现

51单片机做数字电子钟
 编写课程设计报告。 3、给定条件 在Dais-52PH+单片机实验箱中,有一片8155芯片用于扩展3×3键盘,还具有6位LED数码显示器,可分别用于按键和显示控制。 在PC机上调试可使用MCS51仿真开发系统。 数字电子钟的工作过程为:从00:00:00(时:分:秒)开始计时,以24小时为一循环,最大计时时间为23:59:59。当需要...

求单片机大神帮忙设计一个电路,51单片机制作led呼吸灯的
proteus仿真按理来说是不可能达得到效果的,因为这种仿真得有非常快的处理速度。我刚动手试了下和自己的想法相同,LED只会间断的闪烁。我是用AVR单片机,用51也是一样的。我这个程序也在实物试过效果很好。演示定时器1的快速PWM输出@利用快速PWM输出控制LED的亮度变化,达到呼吸灯的效果*\/ include<iom8...

求一段为51单片机编写的LCD电子时钟的设计,简单就好!高分伺候!
简单的时钟,不用1302即可办到。题目要求的设计已经完成,电路图如下。程序稍长,放在我的百度空间了。可以用百度、网页,进行查找:做而论道 用 LCD1602 显示的时钟 百度一下,即可查到。

利用51单片机,4个数码管设计一个计时器,要求在数码管上显示的数据从0开...
本题给出基于单片机的数字中的设计,设计由单片机作为核心控制器,通过频率计数实现计时功能,将实时时间经由单片机输出到显示设备——数码管上显示出来,并通过键盘来实现启动、停止、复位和调整时间的功能。关键词: 单片机、数字钟、AT89S52、LED 1 引言在单片机技术日趋成熟的今天,其灵活的硬件电路的设计和软件的设计,让...

根据51单片机的内存大小来设计一块32×32的点阵LED显示电路,请问可以...
首先,你说的内存这个概念就不正确,按常规来说你说的内存应该是指FLASH程序存储器吧.下面就按此概念来说.能存多少汉字关键看你的显示需要多大的汉字,例如16*16的汉字一个汉字需要32字节来存储,32*32汉字一个汉字需要128字节来存储,由于存储器还需要存储程序,因此,必须是剩余的空间来存储需要的汉字,你...

51单片机用汇编语言设计1S延时子程序,晶振为12MHz。 (麻烦附上详细计算...
C:0x0808 ED MOV A,R5;A=R5,1时钟 C:0x0809 70FC JNZ C:0807;A=0?,2时钟 循环共249次,一个循环共需4个时钟周期,加上第一个赋值语句1周期。共997uS,加上外层循环,一次约1mS,如果要精确的延时建议采用中断:include "reg51.h"\/\/timer init void initTimer(void...

利用51单片机作为主控制器设计一个迎宾记录器模型,该模型能够记录进入人 ...
可以进行进入人数、出去人数和滞留人数,还设置了当超过上限时报警。

基于51单片机的简易计算器设计,急
\/\/功能 0 1 2 3 4 5 6 7 8 9 + - × ÷ = 清零 表3-1 3.2 计算器的软件设计 include<reg51.h> \/\/头文件 define uint unsigned int \/\/ define uchar unsigned char sbit lcden=P2^3; \/\/定义引脚 sbit rs=P2^4;sbit rw=P2^0;sbit busy=P0^7;char i,j,temp,num,...

基于51单片机的自动路灯控制,需要哪几部分组成能实现
综上所述,基于51单片机的自动路灯控制系统需要以上几部分组成,通过光敏传感器感知光照强度,时钟模块提供时间信息,继电器控制路灯的开关,电源模块为系统供电,人机交互模块实现与系统的交互,电路板将各个模块连接在一起,程序设计实现对硬件的控制和调度,外部设备用于显示系统状态或发出警报,从而实现自动路灯...

灵武市13198587537: 51单片机做一个10秒倒计时的程序 -
重永美罗: C语言 #include<reg51.h> #define uint unsigned int #define uchar unsigned char sbit p27=P2^7;//数码管位选端定义 uchar c,i; //数码管译码表 unsigned char code NumDecode[] = { 0XC0,//;0 0XF9,//;1 0XA4,//;2 0XB0,//;3 0X99,//;4 0X92,//;5 0X...

灵武市13198587537: 51单片机数码管九秒倒计时程序 -
重永美罗: #include<reg51.h> #define uchar unsigned char uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f}; uchar num=9; uchar cnt; main() { TMOD=0x01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; ET0=1; TR0=1; EA=1; while(1) { if(...

灵武市13198587537: 我想用51单片机编个倒计时的c程序,要求用两位数码管显示分钟的,并用一个按键 -
重永美罗: 你这数码管的1、2口就这么悬着或者接dp一起了真的没问题吗…… 全局变量2个用于表示个位和十位,显示的时候可以省点力不用每次计算个位十位.然后一个全局变量代表秒 编程的话,首先是按键响应中断,控制某个全局变量flag的值,三种...

灵武市13198587537: 用51单片机设计了一个简单的倒计时器,但数码管有点小问题,请教高手 -
重永美罗: 按键防抖delayms(10);改调用display()代替试试

灵武市13198587537: 51单片机C语言设置一个精确到毫秒的倒计时 -
重永美罗: 51单片机 12MHz 汇编:DELAY: ;误差 0us MOV R7,#13H DL1:MOV R6,#14H DL0:MOV R5,#82H DJNZ R5,$ DJNZ R6,DL0 DJNZ R7,DL1 RET C:void delay(void) //误差 0us { unsigned char a,b,c; for(c=19;c>0;c--) for(b=20;b>0;b--) for(a=130;a>0;a--); }.

灵武市13198587537: 如何用单片机制作倒数计时器 -
重永美罗: 也就是倒计时30秒吗? 用内部定时器就可以, 以51为例 60ms*500=30s(每次定时60毫秒 循环500次) 60ms初值 TC=2^16-60000=5536=15A0(H) ORG 0000H LJMP MAIN ORG 000BH LJMP TO_INT ; ORG 0100H MAIN: MOV IE ,#00H MOV ...

灵武市13198587537: 如何利用51单片机实现一个计时器? -
重永美罗: 方法一:用定时器中断计时模式循环计时.方法二:用CPU消耗时钟周期指令计时(浪费资源).思路:用定时器中断计时,溢出时形成中断信号,标识为一个基本周期t,所定时间T/t=n为周期循环数,到时形成定时触发信号.

灵武市13198587537: 51单片机实现300秒倒计时 -
重永美罗: 别做伸手党,很容易实现的 原理图就是单片机+数码管 程序就是用定时器实现

灵武市13198587537: 51单片机做一个倒计时,在程序运行过程中也需要可以调节时间,这种模式的设计思路 -
重永美罗: 倒计时用定时器 程序运行中,要修改定时器的数值就修改定时器的TH0 ,TL0;#include <reg51.h> void InitTimer0(void) { TMOD = 0x05; TH0 = 0xD8; TL0 = 0xF0;//定时100ms EA = 1; ET0 = 1; TR0 = 1; } void main(void) { InitTimer0(); while(1) {//根据...

灵武市13198587537: 51单片机做10秒倒计时题 精确到0.01秒 -
重永美罗: 很简单的,就是配置定时器,精度可配置定时器的溢出时间

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网