您好,欢迎来到汇意旅游网。
搜索
您的当前位置:首页51单片机电子时钟(C语言)

51单片机电子时钟(C语言)

来源:汇意旅游网


#include #include

#define uchar unsigned char //宏定义 #define uint unsigned int

uchar sec,min,hour,sec50,jishu,dtp2; //sec、min、hour、为显示单元,sec50为60秒计数单元,jishu为扫描数码管计数单元

uchar sec1,min1,hour1; //时间中介单元

uchar nzmin,nzhour,nzjishu=0,dispjishu=0; //闹钟分、时定义 uchar data nzbit=0; //闹钟标志位,闹钟默认为开启

uchar data dispbit=0; //显示标志位,默认显示当前时间

uchar data disp[8]; //秒、分、时个位与十位存放数组及‘—’

uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //数字0-9 sbit KEYmin=P3^2; //分加1按钮 sbit KEYhour=P3^3; //时加1按钮 sbit LABA=P1^0; //闹钟输出I/O口

sbit NZdisplay=P3^4; //闹钟显示按钮,按住不放显示闹钟时间,放开则显示当前时间 sbit KEYnzmin=P3^5; //闹钟分加1按钮 sbit KEYnzhour=P3^6; //闹钟时加1按钮

sbit KEYoff=P3^7; //关闭闹钟按钮,按第一次为关闭,第二次为开启 void display(); //显示函数声明 void keyscan(); //按键扫描函数声明 void naozhong(); //闹钟判别函数声明 void keynz(); //闹钟按键函数声明 void main() {

sec=0; //时间初始化为00—00—00 min=0; hour=0;

sec1=0; //显示单元初始化为00—00—00 min1=0; hour1=0;

nzmin=01; //闹钟初始时间为01:01 nzhour=01; jishu=0; dtp2=0xfe; P0=0xff;

TMOD=0x11; //设T0、T1为模式1 IE=0x8a;

TH0=0xb8; //T0定时20ms TL0=0x0;

TH1=0xfc; //T1定时1ms TL1=0x66; TR0=1; TR1=1; while(1) {

display(); //调用显示子程序 keyscan(); //调用按键子程序 keynz(); //调用闹钟按键子程序 } }

void t0int() interrupt 1 //T0定时中断程序 {

TH0=0xb8; TL0=0x0; sec50++;

if(sec50==50) //对20ms计数50次即1s {

sec50=0; //清秒计数器,为下次做准备

naozhong(); //调用闹钟判别子程序 sec1++; //秒加1 }

if(sec1==60) //对秒计数60次即1min {

sec1=0;

min1++; //分加1 }

if(min1==60) //对分计数60次即1hour {

min1=0;

hour1++; //时加1 }

if(hour1==24) {

hour1=0; }

if(dispbit==0) //判断显示标志位是否为0,为0显示当前时间 {

sec=sec1; min=min1; hour=hour1; }

else //显示标志位为1,显示闹钟时间 {

min=nzmin; //将闹钟时间给显示单元 hour=nzhour; } }

void t1int() interrupt 3 //T1中断程序 {

TH1=0xfc; TL1=0x66;

P2=0xff; //关闭所有数码管 P2=dtp2;

dtp2=_crol_(dtp2,1); P0=disp[jishu]; jishu++;

if(jishu==8) //扫描完8位数码管清0,重新从第一位开始扫描 {

jishu=0; } }

void delay(uint x) //延时函数

{

uchar i; while(x--) {

for(i=0;i<120;i++); } }

void display() //显示子程序 {

disp[7]=table[sec%10]; //秒个位显示 disp[6]=table[sec/10]; //秒十位显示 disp[4]=table[min%10]; //分个位显示 disp[3]=table[min/10]; //分十位显示 disp[1]=table[hour%10]; //时个位显示 disp[0]=table[hour/10]; //时十位显示 disp[2]=0xbf; //显示‘_’ disp[5]=0xbf; }

void keyscan() //按键子程序 {

delay(20); //延时消抖

if(KEYmin==0)//时间分加1按钮 {

min1++; //时间分加1 if(min1==60) {

min1=0; hour1++; //分加到60对时加1 }

if(hour1==24) {

hour1=0; }

while(!KEYmin); //等待按键放开 }

delay(20); //延时消抖

if(KEYhour==0) //时间时加1按钮 {

hour1++; //时间时加1 if(hour1==24) {

hour1=0; }

while(!KEYhour); //等待按键放开

} }

void naozhong() //闹钟判断 {

if(nzbit==0) //判断闹钟标志位,0为开启闹钟判断,1为关闭闹钟 {

if(min1==nzmin) //闹钟与时间分的判别 if(hour1==nzhour) //闹钟与时间时的判别

LABA=0; //时间分、时与闹钟分、时相等就打开蜂鸣器 } else LABA=1; }

void keynz() //闹钟加、减及闹钟关闭、开启按键处理子程序 {

delay(20); //延时消抖

if(KEYnzmin==0) //判别闹钟分加1按键 {

nzmin++; //闹钟分加1 if(nzmin==60) {

nzmin=0;

nzhour++; //闹钟分加到60对闹钟时加1 if(nzhour==24) nzhour=0; }

while(!KEYnzmin); //等待按键放开 }

delay(20); //延时消抖

if(KEYnzhour==0) //判别闹钟时加1按键 {

nzhour++; //闹钟时加1 if(nzhour==24) nzhour=0;

while(!KEYnzhour); //等待按键放开 }

if(KEYoff==0)//判断关闭闹钟按键是否按下 {

delay(20); // 延时消抖 nzjishu++;

if(nzjishu==1) //判断是否为第一次按下 {

nzbit=1; //第一次按下关闭闹钟

}

if(nzjishu==2) //判断是否为第二次按下 {

nzjishu=0; //第二次按下清计数单元

nzbit=0; // 第二次按下开启闹钟判别 }

while(!KEYoff); //等待按键放开 }

if(NZdisplay==0) //判别显示切换闹钟按键是否按下 {

dispjishu++;

if(dispjishu==1) //第一次按下显示闹钟时间 {

dispbit=1; //第一次按下,把标志位置1,显示切换为闹钟时间 }

if(dispjishu==2) //第二次按下显示为当前时间 {

dispjishu=0; //清零,重新计数

dispbit=0; //第二次按下清零显示标志位,显示切换为当前时间 }

while(!NZdisplay); //等待按键放开 } }

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- hids.cn 版权所有 赣ICP备2024042780号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务