这个单片机设计非常简单,主要是利用了74HC595芯片实现了51单片机的串口传输数据,计时范围从0.1秒到999.9秒,也可以自己改写代码,前两位用来作分,后两位显示秒数,转化为60进制,得到xx分xx秒
Protues仿真效果如下:
按下开始/继续按钮(从上往下第一个)
按下暂停按钮(从上往下第二个)
按下清零按钮(从上往下第三个)
源代码:
#include<reg51.h>
#include <intrins.h>
unsigned char Disp_Tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
sbit SER =P3^0;
sbit LATCH =P3^1;
sbit SRCLK =P3^2;
void delay(unsigned int i)
{
unsigned char j,k;
for(i;i>0;i--)
for(j=246;j>0;j--)
k=0;
}
void bcdNz(unsigned int x,unsigned char *addr)
{
char i;
for(i=0;i<5;i++)
{
addr[i]=Disp_Tab[x%10];
/*
if(i==1)
{
addr[i]=0x80|addr[i];
}*/
x/=10;
}
addr[1]=0x80|addr[1];
i=4;
while(i>0 && addr[i]==0x3f)
{
addr[i]=0;
i--;
}
}
void Out595()
{
LATCH=0; //锁定数据
_nop_(); //空指令
LATCH=1; //给一个上升沿
}
void SendByte(unsigned char dat)//一字节数据发送函数
{
unsigned char i;
for(i=0;i<8;i++)
{
SRCLK=0;
SER=dat&0x80;
dat<<=1;
SRCLK=1;
}
}
void Send595(unsigned char *addr,unsigned char x) //发送x个数据,
{
char i;
for(i=0;i<x;i++)
{
SendByte(addr[i]);
}
Out595(); // 给一个上升沿让74HC595芯片锁定并显示数据
}
void main()
{
unsigned char flag=0; //设置标志位
unsigned int Leds=0; //设置显示的数据
unsigned char dispbufs[5]; //保存显示数据对应在数码管上的数值
bcdNz(Leds,dispbufs); //将需要显示的时间进行转化
Send595(dispbufs,4);
Out595();
while(1)
{
if(P0==1){ //开始按钮按下
flag=1;
}else if(P0==8) //停止按钮按下
{
flag=0;
}else if(P0==64) //重新计时按钮按下
{
Leds=0;
bcdNz(Leds,dispbufs);
Send595(dispbufs,4);
}
if(flag==1) //当flag为1时
{
delay(85); //延时约0.1s
Leds++; //
bcdNz(Leds,dispbufs);
Send595(dispbufs,4); //显示4位数字
}
}
}
项目所有文件均已上传至百度网盘,感兴趣的可以自行下载
链接:https://pan.baidu.com/s/15L9AHs-9NcZ4o9Rc3H8_Mg
提取码:qwer
所有代码文件开源,仅供大家参考,如果还有疑问欢迎评论留言或私信我