标题: 6位时钟可调可复位 [打印本页]
作者: 环境开会看见和 时间: 2019-12-6 14:37
标题: 6位时钟可调可复位
本帖最后由 环境开会看见和 于 2019-12-10 21:46 编辑
#include<reg52.h> //头文件
#define uc unsigned char //宏定义
#define ui unsigned int //宏定义
sbit key1=P1^0;//定义调小时
sbit key2=P1^1;//定义调分钟
sbit key3=P1^2;//定义秒清零
sbit LED=P1^6;//定义LED
sbit beep=P1^7;//设蜂鸣器
uc min,hour,sec,led,num; //无符号字符型变量
bit bdata hourLED,halfLED,hourbeep,halfbeep; //位变量
//uc code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴极编码
uc code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共阳级编码
void delay(ui x)//1ms延时函数
{
ui i,j;
for(i=0;i<x;i++)
for(j=0;j<121;j++);
}
void display() //扫描显示函数,高位到低位
{
P0=tab[hour/10]; //给小时的十位送形
P2=0x01; //1000 0000 共阳打开位选 共阳需要接高电平才亮
delay(1); //延时动态扫描
P2=0x00; //共阳的 关闭位选
/*P3=0xfe; //1111 1110 共阴打开位选 共阴需要接低电平才亮
delay(1);
P3=0xff; //共阴的 关闭位选 */
P0=(tab[hour%10]); //|0x80;*//给第二位后加“点
P2=0x02; //0100 0000
delay(1);
P2=0x00;
/*P3=0xfd; //1111 1101 共阴
delay(1);
P3=0xff;*/
/***********G横杠效果***************/
P0=0xbf; // 横杠共阳
P2=0x04; //0010 0000
delay(1);
P2=0x00;
/*P2=0x40; //共阴
P3=0xfb; //1111 1011
delay(1);
P3=0xff;*/
/***********G横杠效果***************/
P0=tab[min/10];
P2=0x08; //0001 0000
delay(1);
P2=0x00;
/*P3=0xf7; //1111 0111
delay(1);
P3=0xff; */
P0=(tab[min%10]); /*|0x80;*/ //给第四位后加“点”
P2=0x10; //0000 1000
delay(1);
P2=0x00;
/*P3=0xef; //1110 1111
delay(1);
P3=0xff;*/
/***********G横杠效果***************/
P0=0xbf; //共阳
P2=0x20; //0000 0100
delay(1);
P2=0x00;
/*P2=0x40; //共阴
P3=0xdf; //1101 1111 共阴
delay(1);
P3=0xff;*/
/***********G横杠效果***************/
P0=tab[sec/10];
P2=0x40; //0000 0010
delay(1);
P2=0x00;
/*P3=0xbf; //1011 1111
P3=0xff;
delay(1);*/
P0=tab[sec%10];
P2=0x80; //0000 0001
delay(1);
P2=0x00;
/*P3=0x7f; //0111 1111
delay(1);
P3=0xff;*/
}
void keyscan()//键盘扫描,开关接地
{
if(key1==0) //如果小时加按键按下
{
delay(5); //延时去抖
if(key1==0) //确定是否按键
{
hour++; //小时加一
if(hour==24) //如果小时等于24
hour=0; //小时归零
}
while(!key1) display();//判断是否松开
}
if(key2==0) //如果分钟加按键按下
{
delay(5); //延时去抖
if(key2==0) //确定是否按键
{
min++; //分钟加一
if(min==60)// 如果分钟等于60
min=0; //分钟归零
}
while(!key2) display();//判断是否松开
}
if(key3==0)//判断调整秒按键
{
delay(5); //延时去抖
if(key3==0) //确定是否按键
{sec=0;} //秒清零
while(!key3) display();//判断是否松开
}
}
void strike()//报时函数
{
if((hour>6)&&(hour<22))//判断大于6点并且小于22点
{
if(sec==0)//以下判断是否整点
{
if(min==0)//如果秒和分都等于0
{
hourbeep=1; //那么蜂鸣器和小灯位开启
hourLED=1;
}
else if(min==30)//如果分钟等于30
{
if(num<10) //闪5下响一声
halfbeep=1;
halfLED=1;
}
}
}
else //小于6点和大于22点的时候
{
if(sec==0)//以下判断是否整点
{
if(min==0)//如果分钟等于0
hourLED=1; //led位开
else if(min==30)//如果分钟=0
halfLED=1;//进行半点报时
}
}
}
void init()//初始化函数
{
sec=0;//一通电,显示12:30:00,蜂鸣器响一下
min=30;
hour=12;
TMOD=0x01;//设置定时器为定时器0工作方式为1
TH0=(65536-46083)/256; //赋初值
TL0=(65536-46083)%256; //赋初值
EA=1; //开总中断
ET0=1; //开定时器0中断
TR0=1; //启动定时器0
}
void main()//主函数
{
init();//初始化函数
while(1) //主循环
{
display(); //显示
keyscan();//扫描是否有键按下
strike();//报时函数
}
}
作者: admin 时间: 2019-12-10 00:26
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |