利用51单片机,4个数码管设计一个计时器,要求在数码管上显示的数据从0开始每1秒钟加1。

麻烦你了,帮我解决一下吧

共阳数码管中断程序:

#include<reg52.h>

#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单片机



温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-11-24
系统设计

1.实验内容摘要

本实验利用单片机的定时器/计数器定时和记数的原理,结合dvcc实验箱上的集成电路芯片8032、LED数码管以及实验箱上的按键来设计计时器。将软、硬件有机地结合起来,使得系统能够正确地进行计时,数码管能够正确地显示时间。其中本实验设计了四个开关按键:其中一个按键按下去时以1秒加一开始计时,即秒表开始键(本实验中当开关从1变为0时开始计时),另一个按键按下去时暂停计时,使秒表停留在原先的计时(本实验中当相应开关从1变为0时即停止计时),第三个按键按下去时清0(本实验中当相应开关从1变为0时即停止计时),第四按键按下去则是以每10ms秒快速加一计时(本实验中当开关从1变为0时开始计时)。本实验中开始时都要使各按键回到各初始位置,即都处于1状态。

关键词:LED数码管,计时器,

2.功能:

用AT89C51设计一个2位LED数码显示“秒表”,显示时间为00~99秒,每秒自动加1。另设计一个“开始”按键和一个“复位”按键。并且增加了一个“暂停”按键和一个“快加”按键(每10ms快速加一)

3.实验目的:

3.1、 通过本次课程设计加深对单片机课程的全面认识复习和掌握,对单片机课程的应用进一步的了解。

3.2、 掌握定时器、外部中断的设置和编程原理。

3.3、 通过此次课程设计能够将单片机软硬件结合起来,对程序进行编辑,校验。

4.意义:

该实验通过单片机的定时器/计数器定时和计数原理,设计简单的计时器系统,拥有正确的计时、暂停、清零、快加功能,并同时可以用数码管显示,在现实生活中应用广泛,具有现实意义。

所做工作

根据相关的单片机材料,利用所学的单片机知识,结合DVCC系列单片机微机仿真实验系统中的软件和硬件(集成电路芯片8032,七段数码管,开关电路及时钟信号电路,按键等),编写能够实现该项目的软件程序,最后将软、硬件有机的结合起来,进行有效的调试,达到完成该实验课程设计的目的要求。

5.实验内容:

用AT89C51设计一个2位LED数码显示“秒表”,显示时间为00~99秒,每秒自动加一。另设计一个“开始”按键和一个“复位”按键。再增加一个“暂停”按键和一个“快加”按键(每10ms快速加一)。

按键说明:按“开始”按键,开始计数,数码管显示从00开始每秒自动加1;按“复位”按键,系统清零,数码管显示00;按“暂停”按键,系统暂停计数,数码管显示当时的计数;按“快加”按键,系统每10ms快速加1,即数码显示管在原先的计数上快速加1。

6.设计思路及描述:

该实验要求进行计时并在数码管上显示时间,则可利用DVCC系列单片机微机仿真实验系统中的芯片8032(芯片的功能类似于芯片AT89C51,其管脚功能也和AT89C51的管脚功能类似)中的P3.2管脚做为外部中断0的入口地址,并实现“开始”按键的功能;将P3.3做为外部中断1的入口地址,并实现“清零”按键的功能;将P3.0做为数据信号DATA输入的入口地址;将P3.1做为时钟信号CLK输入的入口地址。定时器T0作为每秒加一的定时器;定时器T1作为“快加”键的定时器。其中“开始”按键当开关由1拨向0(由上向下拨)时开始计时;“清零”按键当开关由1拨向0(由上向下拨)时数码管清零,此时若再拨“开始”按键则又可重新开始计时。

7.原理图:

10、实验程序

;******************************************************

; 设计选题:秒表系统设计

; 描述: 2位LED数码显示"秒表",显示时间为00~99秒,每秒自动加1,

; 一个"开始"键,一个"复位"键,一个"暂停"键,一个“快加”键。

; 调用子程序:暂停键子程序,计时键子程序,清0键子程序,加一子程序

; 显示子程序,定时子程序

;所用特殊寄存器:寄存器A,寄存器C

;所用中断:外部中断INT0、INT1,定时器T0、T1

; 实验作者: 薛艳—通信0401班09号;******************************************************

org 0000h

ajmp main ;主程序入口地址

org 0003h

ajmp zhongduan0 ;中断0入口地址

org 000bh

ajmp yanshi ;定时器T0入口地址

org 0013h

ajmp zhongduan1 ;中断1入口地址

org 001bh

ajmp dingshi1 ;定时器T1入口地址

org 0030h

;*****************************************************

; 主程序

;*****************************************************

main: mov tcon,#05h ;主程序开始 外部中断跳变模式

mov tmod,#11h ;定时器0,1模式1

mov ie,#8fh ;开总中断,中断0,1,定时器0,1

mov dptr,#tab

mov r1,#00h

mov r2,#00h

mov r3,#40 ;循环次数40

mov tl0,#2Ch ;置初值,定时25MS

mov th0,#0CFh

mov tl1,#78h ;置初值,定时10MS

mov th1,#0ech

clr tr0 ;关定时器

clr tr1

;*****************************************************

; 暂停键K3,快加键K4程序

;*****************************************************

here:jb p1.0,here

show:clr tr1

clr tr0

acall xianshi

kuaijia:jb p1.2,kuaijia ;等待P1.2为0 快加

clr tr0

setb tr1

here3:jnb p1.2,here3

ajmp here

;*****************************************************

; 外部中断INT0子程序-----计时按键K1子程序

;*****************************************************

zhongduan0: setb tr0 ;计时按键

reti

;*****************************************************

; 外部中断INT1子程序----复位按键K2子程序

;*****************************************************

zhongduan1:clr tr0 ;复位按键

clr tr1

mov 12h,#00h

mov 11h,#00h

acall xianshi ;调用显示子程序

mov r1,#00h

mov r2,#00h

reti

;*****************************************************

; 加一子程序

;*****************************************************

jia1: inc r1 ;加1子程序

cjne r1,#0ah ,loop ;判断是否到表尾

mov r1,#00h

inc r2

cjne r2,#0ah,loop

mov r2,#00h

loop: mov 12h,r1 ;重新赋值

mov 11h,r2

ret

;*****************************************************

; 显示子程序

;*****************************************************

xianshi: mov r7,#02h ;2个数码管显示子程序

mov r0,#12h

loop5: mov r6,#08h ;8位2进制数

mov a,@r0

movc a,@a+dptr

loop6: rlc a ;循环左移

clr p3.1

mov p3.0,c

setb p3.1

djnz r6,loop6

dec r0

djnz r7,loop5

ret

;*****************************************************

; 定时器T0子程序

;*****************************************************

yanshi: mov tl0,#2Ch ;定时子程序

mov th0,#0CFh

djnz r3,loop7

acall jia1 ;调用加1子程序

acall xianshi ;调用显示子程序

mov r3,#40

loop7: reti

;*****************************************************

;定时器T1子程序

;*****************************************************

dingshi1:mov tl1,#78h ;置初值,定时10MS

mov th1,#0ech

clr tr0

setb tr1

mov 12h,r1

mov 11h,r2

jnb p1.0,show

acall jia1

acall xianshi

lop7: reti

;*****************************************************

tab:db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh

end

十一、课程设计心得体会

1、 认真审题,看懂题目的要求!选择适当的课题,不益太简单或者太难。做到既能把课题完成又能锻炼自己的能力!

2、 根据课题要求,复习相关的知识,查询相关的资料。

3、 根据实验条件,找到适合的方案,找到需要的元器件及工具,准备实验。

4、 根据课程设计的要求和自己所要增加的功能写好程序流程图,在程序流程图的基础上,根据芯片的功能写出相应的程序。然后再进行程序调试和相应的修改,以达到能够实现所要求的功能的目的。

5、 还要根据实验的实际情况,添加些额外程序来使系统更加的稳定,如开关的消震荡(采用延迟)。

6、 程序要尽量做到由各个子程序组成,在有些程序后面最好加注释,这样在程序出错的检查过程中可以更容易查找的到,也更简洁,更明白易懂。

7、 该实验的程序可以参考DVCC系列单片机微机仿真实验系统实验指导书中的串并转换实验,也可自己根据自己熟悉的方法来编程。

8、 在设计控制开关时,注意2个中断的打开和关闭的先后顺序,否则就会出错。

9、 这次的单片机课程设计重点是理论与实际的相结合。不再只读书了。

10、 该设计从头到尾都要自己参与,熟悉了对整个设计的过程,更系统的锻炼了自己。希望可以帮到你.!本回答被网友采纳
第2个回答  2011-07-22
我刚刚写好的 我的数码管是共阳的 用中断函数来写
#include<reg52.h>
#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;
}
第3个回答  2011-07-16
这个不难的 你自己动手练习一下就会了的追问

哥们我刚学完汇编语言,不太熟练啊,你能帮帮我吗

追答

汇编呀 汇编还真帮不上忙

追问

你也是会C语言的吧

追答

追问

哦,那谢谢你了

本回答被网友采纳
第4个回答  2011-07-28
/***********************************************************
***************************倒计时***************************
***********************************************************/
#include<reg52.h>
#define uint unsigned int
uint qian,bai,shi,ge;
int a;
unsigned char code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void chushihua(); //初始化函数
void delay(unsigned int i); //延时函数
void xianshi(uint qian,uint bai,uint shi,uint ge); //显示函数
void main()
{
int b=6543;
chushihua(); //初始化子函数。
while(1)
{
if(a==20)
{
b--;
// P1=~P1;
a=0;
if(b==6529)
TR0=0;
qian=b/1000;
bai=b%1000/100;
shi=b%1000%100/10;
ge=b%1000%100%10;
}
xianshi(qian,bai,shi,ge);
}
}
void exter1() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
a++;
}
void chushihua()
{
EA=1;
ET0=1;
TR0=1;
TMOD=0x01;
TH0=(65536-50000)/256; //装初值
TL0=(65536-50000)%256; //装初值
}
void delay(unsigned int i)
{
while(i--);
}
void xianshi(uint qian,uint bai,uint shi,uint ge)
{
P2=3;
P0=table[ge];
delay(50);
P2=2;
P0=table[shi];
delay(50);
P2=1;
P0=table[bai];
delay(50);
P2=0;
P0=table[qian];
delay(50);
}