概述
一.软件
1.Keil 5.
2.烧录软件:STC-ISP或者普中-ISP.
二.功能介绍
1.流水灯。
2.数码管全良和全灭。
3.HELLO的显示。
4.数码管显示时间(初值是23:59:40)。
5.按键控制,可以更改时间。
三.代码
每个功能都在单独的函数之中。
当中也有很多的不足,比如按键消抖不到位。
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar Hel[]={0x76,0x79,0x38,0x38,0x3f}; //共阴HELLO十六进制;
uchar wei[]={0x10,0x08,0x04,0x02,0x01}; //位选后五位数码管显示;
uchar num[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f}; //0-9数字;
sbit zanting = P2^0; //暂停按键;
sbit kaiqi = P2^1; //开启按键;
sbit fuwei = P2^2; //复位按键;
sbit shi_jia = P2^3; //时+1按键;
sbit shi_jian = P2^4; //时-1按键;
sbit fen_jia = P2^5; //分+1按键;
sbit fen_jian = P2^6; //分减1按键;
uchar shi=23, fen=59, miao=40; //进位标志位;
uchar shi_s, shi_g, fen_s,
fen_g, miao_s, miao_g; //时分秒的个位(xxx_g),十位(xxx_s);
void Delay(uint c) //延时函数;
{
uchar a, b;
for(;c>0;c--)
{
for (b=8;b>0;b--)
{
for (a=20;a>0;a--);
}
}
}
void liushuideng() //流水灯模块;
{
uint i,j;
for(j=0;j<3;j++)
{
uint LED=0x01;
for(i=0;i<8;i++)
{
P0=LED;
LED=LED<<1; //左移;
Delay(30);
}
}
}
void SMG_quanliang() //共阴数码管 全亮 或 全灭;
{
uint i;
for(i=0;i<3;i++) //进行3次;
{
P1=0x00; //位选;
P0=0xff; //段选;
Delay(100);
P0=0x00;
Delay(100);
}
}
void hello() //动态数码管显示HELLO;
{
uint i,j=100;
while(j--) //显示一会儿;
{
for(i=0;i<5;i++)
{
P1=~wei[i];
P0=Hel[i];
Delay(1);
}
}
}
void T0_csh() //初始化定时器0;
{
TMOD=0X01; //工作方式1;
TH0=-50000/256; //50ms;
TL0=-50000%256;
ET0=1; //打开T0中断;
TR0=1; //启用T0中断;
EA=1; //打开总中断;
}
void ShiFenMiao()
{
P1=~0x24; //中间的“-”,XX-XX-XX;
P0=0x40;
Delay(1);
P1=~0x01; //XX-XX-X_;
P0=num[miao_g];
Delay(1);
P1=~0x02; //XX-XX-_X;
P0=num[miao_s];
Delay(1);
P1=~0x08; //XX-X_-XX;
P0=num[fen_g];
Delay(1);
P1=~0x10; //XX-_X-XX;
P0=num[fen_s];
Delay(1);
P1=~0x40; //X_-XX-XX;
P0=num[shi_g];
Delay(1);
P1=~0x80; //_X-XX-XX;
P0=num[shi_s];
Delay(1);
}
void anjian()
{
if(fen_jia==0)
{
Delay(50); //消抖;
if(fen_jia==0)
{
fen++;
if(fen==60)
{ fen=00; }
while(!fen_jia);
}
}
if(fen_jian==0)
{
Delay(50); //消抖;
if(fen_jian==0)
{
fen--;
while(!fen_jian);
}
}
if(shi_jia==0)
{
Delay(50); //消抖;
if(shi_jia==0)
{
shi++;
if(shi==24)
{ shi=00; }
while(!shi_jia);
}
}
if(shi_jian==0)
{
Delay(50); //消抖;
if(shi_jian==0)
{
shi--;
while(!shi_jian);
}
}
if(fuwei==0)
{
Delay(50); //消抖;
if(fuwei==0)
{
miao=0; //复位,全变为0;
fen=0;
shi=0;
while(!fuwei);
}
}
if(zanting==0)
{
Delay(5); //消抖;
if(zanting==0)
{
EA=0; //关闭总中断;
while(!zanting);
}
}
if(kaiqi==0)
{
Delay(5); //消抖;
if(kaiqi==0)
{
EA=1; //打开总中断;
while(!kaiqi);
}
}
}
void T0_int() interrupt 1
{
uchar i;
i++;
if(i==20) //50ms*20 = 1s;
{
i=0;
miao++;
if(miao==60) //60s = 1min;
{
miao=0;
fen++;
if(fen==60) //60min = 1h;
{
fen=0;
shi++;
if(shi==24) //24h转变成00h;
{
shi=0;
fen=0;
miao=0;
}
}
}
shi_s=shi/10; //“/”除法得到高位;
shi_g=shi%10; //“%”求余得到低位;
fen_s=fen/10;
fen_g=fen%10;
miao_s=miao/10;
miao_g=miao%10;
}
}
void main() //主函数;
{
liushuideng();
SMG_quanliang();
hello();
T0_csh();
while(1)
{
anjian();
ShiFenMiao();
}
}
四.详细代码及显示
链接:https://pan.baidu.com/s/1pt7TwPVW6FnfDiq954EJSg?pwd=0123
提取码:0123
最后
以上就是无情滑板为你收集整理的STC89C51单片机的全部内容,希望文章能够帮你解决STC89C51单片机所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复