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