用单片机c语言,c51的,使用数码管设计一个60秒倒计时系统,使用两个数码管,要求用定时器中断定时1秒。 仿

如题所述

第1个回答  2012-06-02
//用AT89c52单片机作控制.假如数码管是共阴极的话,定义的段码和位选的锁存器的选通端分别为P2^6,P2^7,P0口接段码端和位码端,而且位码端接的是锁存器输入,输出端的高两位。假设晶振频率为12MHZ。
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
uchar miao,t0,flat,shiwei,gewei,;
sbit dula = P2^6;
sbit wela = P2^7;
uchar code table[] =
{ //0-9的编码
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f
};
void delay() //延时用于扫描
{
uchar x,y;
for(x = 1;x > 0;x--)
for(y = 100;y > 0;y--);
}
void display() //显示函数
{
uchar w = 0xc0;
uchar i;
for(i = 0;i < 2;i++) //由于数码管只有两位,所以只扫描两次
{
dula = 1; //先选通段锁存器;
P0 = table1[i]; //给段码送数据
dula = 0; //锁存住段码
delay(); //稍微延时一下
wela = 1; //选通位锁存器;
P0 = w;
wela = 0; //下降沿锁存住位码
delay();
w = _cror_(w,1); //位右移动一位
}
}
void init()
{
TMOD = 0x01; //设置定时器0工作方式1
EA = 1; //开总中断
ET0 = 1; //开定时器0中断
TR0 = 1; //开定时器0
TH0 = (65536 - 50000)/256; //给两个寄存器装初值50ms;
TL0 = (65536 - 50000)%256;
}
void main()
{
init();
while(1)
{
if(flat != 1)
{
table1 [0] = table[gewei];
table1[1] = table[shiwei];
display();
}
else
{
table1[0] = table[0];
table1[1] = table[1];
diplay();
}
}
}
void timer0() interrupt 1 // 定时器0
{
TH0 = (65536 - 50000)/256; //重新给两个寄存器装初值;
TL0 = (65536 - 50000)%256;
t0++;
if(t0 == 20) //当定时器到一秒的时候
{
t0 = 0;
miao--;
shiwei = miao / 10; //取出十位数
gewei = miao % 10; //取出个位数
if(miao == 0)
{
TR0 = 0;
shiwei = miao / 10; //取出十位数
gewei = miao % 10; //取出个位数
flat = 1;
}
}

//注意:由于你没有给出数码管的接法等,所以我自己假设的设计一个简单的电路来实现此功能。不一定能在你的实验板上显示出来。追问

仿真元件数码管为7SEG-COM-CATHODE。要有个接线图哦。谢了

追答

是共阳极吗?我英文不好。。也很少使用proteus,如果是共阳极就把编码表该一下就行了

追问

是共阳极的。但是我不会改啊。

追答

比如零,共阴极时是0x3f,记住相应位相加是15,所以共阳极是0xc0.你看看是不是。

第2个回答  2012-06-02
两个数码管显示时间吗?仿真使用?追问

是的..仿真元件数码管为7SEG-COM-CATHODE。要有个接线图哦。谢了

追答

haode

使用2个数码管设计一个60秒倒计时C语言程序,要求用定时器中断定时1秒...
if(num==0)num=60;} }

小白求救,51单片机利用两个数码管实现60秒倒计时?
然后下面这个程序你可以参考一下。是符合我的硬件图的。include <reg51.h> unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};void show(unsigned char n);void delay(unsigned int k);void main(){ unsigned char i;int j;while(1){ for(i=60;j=60,i...

求C51单片机汇编语言控制两位数码管倒计时程序,最好能说明下思路_百度...
MOV A,R4 CJNE A,#0,DEC1 MOV R4,#60 AJMP JP1 DEC1: DEC A MOV R4,A JP1: ACALL DISP AJMP LP0 DISP: MOV A,R4 MOV B,#10 DIV AB ;当前值除以10 MOV 20H,A ;得出的商送给十位 MOV 21H,B ;得出的余数送给个位 MOV A,20H ;十位显...

想用51单片机编个倒计时的c程序,要求用两位数码管显示分钟的,并用一...
你这数码管的1、2口就这么悬着或者接dp一起了真的没问题吗……全局变量2个用于表示个位和十位,显示的时候可以省点力不用每次计算个位十位。然后一个全局变量代表秒 编程的话,首先是按键响应中断,控制某个全局变量flag的值,三种状态:正常、暂停、到时间。按键可以在前两种之间切换,如果已经是第...

我想用51单片机编个倒计时的c程序,要求用两位数码管显示分钟的,并用一...
你这数码管的1、2口就这么悬着或者接dp一起了真的没问题吗……全局变量2个用于表示个位和十位,显示的时候可以省点力不用每次计算个位十位。然后一个全局变量代表秒 编程的话,首先是按键响应中断,控制某个全局变量flag的值,三种状态:正常、暂停、到时间。按键可以在前两种之间切换,如果已经是第...

求教,利用51单片机编写两个数码管60秒倒计时,个位是从5开始计时之后才...
如楼上所说,你没有初始化num这个参数,那么默认值就是0,也相当于256,所以一开始进入中断就是256-1,也就是255,个位是5,十位数是25,所以显示就成了你现在的模样。因此初始化以下就好了。

51单片机设计一个秒表,用两个数码管(任意相邻的两个)显示。
TABLE: ; 共阴极数码管显示代码表 DB 0FCH;"0"00H DB 60H;"1"01H DB 0DAH;"2"02H DB 0F2H;"3"03H DB 66H;"4"04H DB 0B6H;"5"05H DB 0BEH;"6"06H DB 0E0H;"7"07H DB 0FEH;"8"08H DB 0F6H;"9"09H DB 0EEH;"A"0AH DB 3EH;"B"0BH DB 9CH;"C"0CH DB...

51单片机两个阳极数码管显示24倒计时怎么显示00
1、基于51单片机共阴两位数码管显示倒计时#includeunsigned char s=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;unsigned char count,d1,d2,g,y;signed int time=10; void delay(unsigned char i);void sm()d1=time\/10;d2=time%10;P1=sd1;P3=0x00;delay(2);P3=0x01;P1...

用C语言编程,使51单片机数码管从0显示到60
功 能:显示计时的秒数 参 数:无 返回值:无 \/ void display(uchar d2, uchar d1){ P0 = table[d2];dx = 1;dx = 0;P0 = 0xfe;wx = 1;wx = 0;delay(5);P0 = table[d1];dx = 1;dx = 0;P0 = 0xfd;wx = 1;wx = 0;delay(5);} void main(){ uchar i, ...

51单片机c程序用定时器控制两个数码管显示0到59,一直没弄懂段位和位选...
数码管 的 一位 数字 称一个位,两个数字为 两位,三个---,每个数字 有 八个段 为 a b c d e f g h,(h 为小数点)数码管 有 两位一体的、三位一体的,四位一体的等,如四位一体的数码管有12个脚,分为 a b c d e f g h 八个 段码脚,四个 ...

相似回答