本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要 登录 才可以下载或查看,没有账号?注册会员
×
我在实验板上可以实现秒表功能用的是STC89C52的单片机,但仿真不出来,以下是仿真图,各位大哥大姐帮忙看看
程序清单:
/********秒表程序,P0是段选P0.0对应A,P1是位选P1对应D18位。
独立键盘S1是开始按钮,S2是暂停按钮,S3是复位按钮******/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit starkey=P2^0; //开始按键
//sbit stopkey=P2^1; //暂停按键
sbit resetkey=P2^2; //复位按键
uchar numt0,num1,num2,num3; //定义键盘扫描的变量
//void delay(uint);
void delay(uint x) //延时子函数
{
uint i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
//数码管显示0到9
uchar code table[]={0x3f,
0x06,0x5b,0x4f,
0x66,0x6d,0x7d,
0x07,0x7f,0x6f};
void display(uchar numdis1,uchar numdis2,uchar numdis3) //显示子函数
{
uchar ge1,shi1,ge2,shi2,ge3,shi3;
shi1=numdis1/10;
ge1=numdis1%10;
P0=table[ge1]; //微秒显示数码管第一位
P1=0xfe; //第一个数码管的位选
delay(5);
P0=table[shi1]; //微秒显示数码管第二位
P1=0xfd; //第二个数码管的位选
delay(5);
shi2=numdis2/10;
ge2=numdis2%10;
P0=table[ge2]; //秒显示数码管第三位
P1=0xfb; //第三个数码管的位选
delay(5);
P0=table[shi2]; //秒显示数码管第四位
P1=0xf7; //第四个数码管的位选
delay(5);
shi3=numdis3/10;
ge3=numdis3%10;
P0=table[ge3]; //分钟显示数码管第五位
P1=0xef; //第五个数码管的位选
delay(5);
P0=table[shi3]; //分钟显示数码管第六位
P1=0xdf; //第六个数码管的位选
delay(5);
}
void init() //初始化函数
{
TMOD=0X01; //定时器0的工作方式为1
TH0=(65536-10000)/256; //装初值10ms一次中断
TL0=(65536-10000)%256;
EA=1; //开总中断
ET0=1; //开定时器0中断
}
void keyscan() //按键扫描子程序
{
if(resetkey==0) //复位按键
{
delay(10);
if(resetkey==0)
{
num1=0;
num2=0;
num3=0;
TR0=0; //让数码管都显示0并且定在那里
while(!resetkey); //等待按键释放
}
}
if(starkey==0)
{
delay(10);
if(starkey==0);
{
TR0=~TR0; //启动或者停止定时器0
while(!starkey); //等待按键释放
}
}
}
void main()
{
init();
while(1)
{
keyscan();
display(num1,num2,num3);
}
}
void T0_time()interrupt 1
{
TH0=(65536-10000)/256; //装初值10ms一次中断
TL0=(65536-10000)%256;
numt0++;
if(numt0==1)
{
numt0=0;
num1++;
if(num1==100)
{
num1=0;
num2++;
}
if(num2==60)
{
num2=0;
num3++;
}
if(num3==30)
{
TR0=0;
}
}
} |