数字钟仿真,程序软·全套,第一次发帖大家多包涵
单片机源程序如下:
- //********************数字钟程序************************
- //程序:ex8-1.c
- //功能:数字钟程序
- #include "reg51.h"
- typedef unsigned int u16;
- typedef unsigned char u8;
- //********************位名称定义*************************
- sbit naodeng=P2^0; //闹钟开灯亮;否则灭
- sbit K1=P3^0; //切换模式(开关闹钟,调闹钟)
- sbit K2=P3^2; //调时
- sbit K3=P3^3; //调分
- sbit beep=P2^7; //蜂鸣器
- //********************函数声明***************************
- void shijian(); //计时时间显示
- void Timer0Init(); //定时器中断初始化函数
- void DigDisplay(); //LED动态显示扫描函数
- void alarm(); //闹铃报警处理
- void tiao_nao(); //闹钟时间设置
- void moshi(); //闹钟模式设置
- void delay(u16 i); //软件延时函数
- //********************全局变量定义***************************
- bit nao; //闹钟开关标志,nao=1闹钟开;nao=0闹钟关
- u8 a=0; //记录K1按下次数,第一次按下修改闹钟时间,第2次按下切换闹钟开关
- u8 display[]={0,0,0,0,0,0}; //显示缓冲区,对应六个数码管
- u8 ssec,sec,min,hour,nao_hour=0,nao_min=0; //10毫秒、秒、分、小时、闹钟小时、闹钟分钟
- //*************************延时函数****************************//
- //函数名:delay
- //函数功能:软件延时
- //形式参数:无符号整型变量i,0-65535
- //返回值:无
- void delay(u16 i)
- {
- while(i--);
- }
- //*************************定时器中断初始化函数****************************//
- //函数名:Timer0Init
- //函数功能:定时器T0定时中断,interrupt 1,开放两个外部中断
- //形式参数:无
- //返回值:无
- void Timer0Init()
- {
- TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
- EX0=1;
- IT0=1; //外部中断0采用下降沿触发
- PX0=1;
- EX1=1;
- IT1=0; //外部中断1采用低电平触发
- TH0=0Xd8; //给定时器赋初值,定时10ms,12MHz晶振频率
- TL0=0Xf0;
- ET0=1; //开放定时器0中断允许
- EA=1; //开放总中断
- TR0=1; //定时器开始计数
- }
- //**************************6位LED显示函数**************************/
- //函数名:DigDisplay
- //函数功能:6位LED动态显示,将显示缓冲区display中的6个数依次扫描显示一遍
- //形式参数:无
- //返回值:无
- void DigDisplay()
- {
- u8 i,j,m,temp;
- u8 led[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- //0-9的共阴极显示码
- temp=0x01;
- for(i=0;i<6;i++)
- {
- P1=0x00; //关显示
- j=display[i];
- P1=led[j]; //P1送段码
- P0=~temp; //P0对应端口低电平选位
- temp<<=1;
- for(m=0;m<100;m++); //每一位显示延时
- }
- }
- //******************************报警函数****************************/
- //函数名:alarm
- //函数功能:闹钟时分和当前时分相同、闹钟功能开启的情况下,蜂鸣器响15秒
- //形式参数:无
- //返回值:无
- void alarm()
- {
- if(nao_hour==hour&&nao_min==min&&sec>=0&&sec<15&&nao==1)
- {
- beep=1;
- delay(5);
- beep=0;
- delay(5);
- }
- }
- //***********************闹钟时间调节**********************//
- //函数名:tiao_nao
- //函数功能:闹钟时间修改,修改小时和分钟,K1按下结束调节
- // 设置完闹钟时间后,自动开启闹钟
- //形式参数:无
- //返回值:无
- void tiao_nao()
- {
- IT0=0; //关溢出进1;否则调闹时针后时加1;
- EX1=0; //关中断系统
- EX0=0; //关中断系统
- delay(10);
- while(K1) //当K1没有按下时进行闹钟时间调节,当按下K1时,结束闹钟时间调节
- {
- if(K2==0) //闹钟小时调节
- {delay(10);if(K2==0)nao_hour++;while(!K2);}
- if(nao_hour>=24)nao_hour=0; //24小时后归0
- if(K3==0) //闹钟分钟调节
- {delay(10);if(K3==0)nao_min++;while(!K3); }
- if(nao_min>=60)nao_min=0; //60分钟后归0
- display[5]=0; //闹钟显示
- display[4]=0;
- display[3]=nao_min%10;
- display[2]=nao_min/10;
- display[1]=nao_hour%10;
- display[0]=nao_hour/10;
- DigDisplay(); //数码管显示函数
- }
- IT0=1;
- EX1=1;
- EX0=1;
- nao=1; //退出闹钟调试,自动开启闹钟
- }
- //*************************闹钟功能设置***************************//
- //函数名:moshi
- //函数功能:按键K1用来控制闹钟功能的开启和关闭,以及闹钟时间设置
- // 按下进入闹钟时间设置,在该状态下再次按下K1结束闹钟时间设置并同时开启闹钟功能
- // 在闹钟开启或闹铃响期间,按下K1关闭闹钟功能
- //形式参数:无
- //返回值:无
- void moshi()
- {
- if(K1==0)
- {
- delay(100);
- if(K1==0)
- {
- a++; //记录K1按下次数
- if(a>=2)a=0;
- while(!K1);
- switch(a)
- {
- case(0):nao=~nao;break;
- case(1):tiao_nao();break;
- }
- }
- } while(!K1);
- }
- //***********************当前时间显示**********************//
- //函数名:shijian
- //函数功能:将当前计时时间的"小时"、"分钟"和"秒"拆分到显示缓冲区并调用LED显示扫描函数实现时间的显示。
- //形式参数:无
- //返回值:无
- void shijian()
- {
- display[5]=sec%10;
- display[4]=sec/10;
- display[3]=min%10;
- display[2]=min/10;
- display[1]=hour%10;
- display[0]=hour/10;
- DigDisplay(); //LED显示扫描函数
- }
- //***********************T0中断服务函数**********************//
- //函数名:Timer0
- //函数功能:每10ms中断一次,进行10ms、秒、分、小时计数
- //形式参数:无
- //返回值:无
- void Timer0() interrupt 1
- {
- TH0=0Xd8; //给定时器赋初值,定时10ms
- TL0=0Xf0;
- ssec++;
- if(ssec>=100) //1s
- {
- ssec=0;
- sec++;
- if(sec>=60)
- {
- sec=0;
- min++;
- if(min>=60)
- {
- min=0;
- hour++;
- if(hour>=24)
- {hour=0;
- }
- }
-
- }
- }
- }
- //***********************外部中断0服务函数**********************//
- //函数名:int0
- //函数功能:小时调节
- //形式参数:无
- //返回值:无
- void int0() interrupt 0
- {
- delay(10); //采用下降沿触发,延时去抖
- hour++;
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei附件下载:
数字钟仿真.7z
(66.56 KB, 下载次数: 0)
|