秒表(精确00.00),四位共阴数码管显示,单片机S52控制,要求可以暂停、开始,P2口控制段,P3口控制位

如题所述

。。。
#include <reg51.h>
#define uchar unsigned char
sbit P30=P3^0;
sbit P31=P3^1;
sbit P32=P3^2;
sbit P33=P3^3;

sbit P27=P0^7;
sbit KS=P1^0; //开始/暂停 复用
sbit KR=P1^1; //复位

uchar time,xs,ge,shi,bai,qian;
uchar code tab[ ]= {
0x3F,/*0*/
0x06,/*1*/
0x5B,/*2*/
0x4F,/*3*/
0x66,/*4*/
0x6D,/*5*/
0x7D,/*6*/
0x07,/*7*/
0x7F,/*8*/
0x6F,/*9*/
};

void delay_ms(unsigned int ms) //1ms延时
{
uchar a;
while(ms--)
for(a=123;a>0;a--);
}

void display();

void T0intinit( ) //定时器T0初始化
{
TMOD=0x01;
TH0=(65536-10000)/256; //10ms定时
TL0=(65536-10000)%256;
EA=1;
ET0=1;
}

void main()
{
T0intinit( );
while(1)
{
display( );
while(!KS) //开始/暂停 键
{
display( );
if(KS)
TR0=!TR0;
}

while(!KR) //清零键
{
display( );
if(KR)
TR0=0;
qian=0;
bai=0;
shi=0;
ge=0;
}
if(bai==10)
{
bai=0;
qian++;
}
if(qian==10)
{
qian=0;
TR0=0;
}
}
}

void display( )
{
P33=0;
P0=tab[ge];
delay_ms(1);
P33=1;
P32=0;
P0=tab[shi];
delay_ms(1);
P32=1;
P31=0;
P0=tab[bai];
P07=1;
delay_ms(1);
P31=1;
P30=0;
P0=tab[qian];
delay_ms(1);
P30=1;
}

void T0int( ) interrupt 1 //定时器T0中断 方式1
{
TH0=(65536-10000)/256; //重装10ms定时常数
TL0=(65536-10000)%256;
ge++;
if(ge==10)
{
ge=0;
shi++;
}
if(shi==10)
{
shi=0;
bai++;
}
}追问

仿真后还是四位同时显示,显示一样的8888,我把void display( )
中第一个delay_ms(1);时间加长,数字变化,但还是显示1111,2222,就是没有移位;我一开始写的程序也是这样,不知道移位怎么解决???还有四个小数点全部显示,void display( )
里的程序总是不能执行,为什么???

追答

不会呀。我仿真正常后才发上来的。

追问

你用什么仿真的?我用的是protues,能加你QQ吗?

追答

proetus

追问

非常感谢。。。你好厉害呀。。。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-11-17
用一个定时器,模式1,10ms周期,开了中断就行了。每次进入中断就调用一次键盘函数、计时函数、显示函数。
计时:两字节分别做小数和整数部分,每次中断小数+1,小数大于99清0整数+1
键盘:状态机控制,分为:M1.没按下;M2.刚按下;M3.已按下;M4.刚松开。4个状态,只有从M2刚按下确认为M3已按下的时候执行键盘动作,每次转换状态后多退出键盘程序。运行顺序是:先是M1,检测到0转M2,检测到1不动作;M2时检测到0转M3并执行键盘动作,检测到1转M1;M3时检测到0转M4,检测到1不动作;M4时检测到0转M1,检测到1转M3.
显示:在4个数码管间循环,每次只显示1位,每次进入程序改变显示位,分别是整数的十位、整数的个位、小数的十位、小数的个位。
第2个回答  2011-11-17
你只需要设定定时器,就可以做到,定时器0.1均可。把每位取出来显示就可以了!