51单片机点阵电子沙漏代码
时间: 2023-07-23 22:21:25 浏览: 375
51单片机代码
以下是51单片机点阵电子沙漏的基本代码,仅供参考:
```c
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//数码管显示0~9
uchar code weidu[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位选,共阴极
uchar second_1=0;//秒的个位
uchar second_10=0;//秒的十位
uchar minute_1=0;//分的个位
uchar minute_10=0;//分的十位
void delay(uint i)//延时函数
{
uint x,y;
for(x=i;x>0;x--)
for(y=114;y>0;y--);
}
void main()
{
TMOD=0x01;//定时器0,模式1,16位计数器
TH0=(65536-50000)/256;//定时器0初值,50ms
TL0=(65536-50000)%256;
ET0=1;//开定时器0中断
EA=1;//开全局中断
while(1)
{
P0=0x00;//点阵屏幕清零
P1=weidu[0];//位选第一个数码管
P0=table[second_1];//显示秒的个位
delay(1);//延时1ms
P0=0x00;
P1=weidu[1];//位选第二个数码管
P0=table[second_10];//显示秒的十位
delay(1);//延时1ms
P0=0x00;
P1=weidu[2];//位选第三个数码管
P0=table[minute_1];//显示分的个位
delay(1);//延时1ms
P0=0x00;
P1=weidu[3];//位选第四个数码管
P0=table[minute_10];//显示分的十位
delay(1);//延时1ms
}
}
void timer0()interrupt 1//定时器0中断
{
static uchar i=0;
TH0=(65536-50000)/256;//重装定时器0初值
TL0=(65536-50000)%256;
i++;
if(i>=20)//50ms*20=1s
{
i=0;
second_1++;
if(second_1==10)
{
second_1=0;
second_10++;
if(second_10==6)
{
second_10=0;
minute_1++;
if(minute_1==10)
{
minute_1=0;
minute_10++;
if(minute_10==6)
{
minute_10=0;
}
}
}
}
}
}
```
需要注意的是,这只是基本的代码框架,需要根据自己的具体需求进行修改和完善。例如,可以添加按键控制功能,实现开始、暂停和重置计时器等功能。
阅读全文