
1、闹钟设置界面。
2、存储响闹时间。
3、时间中断,设置读取时间的flag
4、主程序中判断flag设置,读取时钟。
5、比较当前时钟在响闹时间范围内,输出闹铃(如果是蜂鸣器,给他一个输出频率的信号)。
单片机程序是基于硬件基础上开发的,你至少添加注释和硬件环境说明,不然大家都不知道怎么帮你。
你直接给出代码,也不清楚需要指正什么,这里也没有设置时间/闹钟的代码,发文前应该清楚表达要问的内容。
1)假设你的晶振是12MHz,那一个机器周期是1MHz,定时器的最长定时周期是(65535/10^6)你想要1/6秒触发一次中断就必须结合软件计时,为了尽量精确:硬件计时40000次,软件计时25次那么定时器的设这应该是TH1=(65535-40000)%256;TL1=(65535-40000)%256,(注意计数器大部分是加法计数)
2)按键监听没有给出思路,也没有处理按键抖动,我只能分析程序:
有一个外部中断触发时间设置,P34设置小时、P35设置分钟,但是调整时间后没有进行显示,你至少要让数码管显示结果才能知道怎么调整。
#include<reg52h>
#define uint unsigned int
#define uchar unsigned char
sbit QB1=P1^0;
sbit QB2=P1^1; //数码管段选
sbit QB3=P1^2;
sbit QB4=P1^3;
sbit QB5=P1^4;
sbit QB6=P1^5;
sbit fm=P1^6; //蜂鸣器
sbit s1=P2^4; //s5按键,切换显示
sbit s2=P2^3; //s2按键,设置调时
sbit s3=P2^2; //s3按键,加1
sbit s4=P2^1; //s4按键,减1
sbit led1=P0^0;
sbit led2=P0^1;
sbit led3=P0^2;
uchar count;
uchar sec,minu,hour,day,week,mon;
uchar n_sec,n_minu,n_hour;
uint year;
uchar set_2=1,set_1=1;
uchar hs,hg,mis,mig,ss,sg;
uchar nhs,nhg,nms,nmg,nss=0,nsg=0;
uchar ms,mg,ds,dg,w;
uchar code table[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,
0X90,0X88,0X83,0XC6,0XA1,0X8E,0X86,0xbf}; //0~F,-,共阳
//uchar code tableyi[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
//0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};//0-F,-,共阴
uchar code table_d[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,
0x87,0xff,0xef}; //0~9数组,带小数点
uchar table1[]={31,31,29,31,30,31,30,31,31,30,31,30,31}; //闰年
uchar table2[]={31,31,28,31,30,31,30,31,31,30,31,30,31}; //非闰年
void delay(uint); //延时函数
void timer0(); //走时中断函数
void jishi(); //计时函数
void key_change(); //切换显示按键函数
void key_set(); //设置时间按键函数
void disp(uchar,uchar,uchar,uchar,uchar,uchar); //显示函数
void zd_clock(); //整点报时函数
void nz_clock(); //闹钟函数
uchar incone(uchar); //加1函数
uchar decone(uchar); //减1函数
void set_time(); //设置时间函数
void set_clock(); //设置闹钟函数
void set_mdw(); //设置月日星期函数
void main() //主函数
{
EA=1;
ET0=1;
TR0=1;
TMOD=0x01;
TH0=0x4c; //50ms初值 晶振110592
TL0=0x00;
hour=23;minu=59;sec=49; //赋初值:11点59分0秒
n_hour=12;n_minu=56;n_sec=0; //闹钟赋初值12点1分0秒
year=2008;mon=5;day=14;week=3;//年月日星期赋初值2008年5月11日星期天;祝天下所有母亲节日快乐
while(1)
{
hs=hour/10; //时分秒HHMMSS
hg=hour%10;
mis=minu/10;
mig=minu%10;
ss=sec/10;
sg=sec%10;
ms=mon/10; //月日-星期MMDD-W
mg=mon%10;
ds=day/10;
dg=day%10;
w=week;
nhs=n_hour/10; //闹钟定时HHMMSS
nhg=n_hour%10;
nms=n_minu/10;
nmg=n_minu%10;
nss=n_sec/10;
nsg=n_sec%10;
key_change(); //s4按键扫描
key_set(); //s2按键扫描
set_time(); //设置时间
set_mdw(); //设置月日星期
set_clock(); //设置闹钟
if(set_1==1) //正常走时显示
{
disp(hs,hg,mis,mig,ss,sg);
}
if(set_1==2) //设置时间,LED1闪亮
{
disp(hs,hg,mis,mig,ss,sg);
if(sec%2==0)
{led2=1;led3=1;led1=~led1;}
// else
// {led1=1;}
}
if(set_1==3) //正常显示月日-星期
{
disp(ms,mg,ds,dg,16,w);
}
if(set_1==4) //设置月日-星期,LED2闪亮
{
disp(ms,mg,ds,dg,16,w);
if(sec%2==0)
{led1=1;led3=1;led2=~led2;}
// else
// {led2=1;}
}
if(set_1==5) //正常显示定时
{
disp(nhs,nhg,nms,nmg,nss,nsg);
}
if(set_1==6) //设置闹钟定时,LED3闪亮
{
disp(nhs,nhg,nms,nmg,nss,nsg);
if(sec%2==0)
{led1=1;led2=1;led3=~led3;}
// else
// {led3=1;}
}
zd_clock(); //整点报时
nz_clock(); //闹钟
}
}
void timer0() interrupt 1 //50ms中断函数
{
TMOD=0x01;
TH0=0x4c; //50ms初值 晶振110592
TL0=0x00;
count++;
if(count==20)
{
count=0;
sec++;
jishi(); //调计时函数
}
}
void jishi() //计时函数
{
if(sec==60)
{
sec=0;
minu++;
if(minu==60)
{
minu=0;
hour++;
if(hour==24)
{ hour=0;
day++;
week++;
if(week==8)
{week=0;}
if(year%4==0&&year%100!=0||year%400==0) //闰年
{
if(day==table1[mon]+1)
{
day=0;
mon++;
if(mon==13)
{mon=0;year++;}
}
}
else //非闰年
{
if(day==table2[mon]+1)
{
day=0;
mon++;
if(mon==13)
{mon=0;year++;}
}
}
}
}
}
}
void key_change() //s1按键扫描
{
if(s1==0)
{
delay(200);
if(s1==0)
{
set_1++;
while(!s1);
if(set_1==7)
{set_1=1;}
}
}
}
void key_set() //s2按键扫描
{
if(s2==0)
{
delay(10);
if(s2==0)
{
set_2++;
while(!s2);
if(set_2==4)
{set_2=1;}
}
}
}
void disp(uchar a1,uchar a2,uchar a3,uchar a4,uchar a5,uchar a6) //显示函数
{
QB1=1;
QB2=0;
QB3=0;
QB4=0;
QB5=0;
QB6=0;
P3=table[a1]; //段码送P0口
delay(10); //延时一小会
QB1=0;
QB2=1;
QB3=0;
QB4=0;
QB5=0;
QB6=0;
P3=table[a2]; //第2个数码管显示,带小数点
delay(10);
QB1=0;
QB2=0;
QB3=1;
QB4=0;
QB5=0;
QB6=0;
P3=table[a3]; //第3个数码管显示
delay(10);
QB1=0;
QB2=0;
QB3=0;
QB4=1;
QB5=0;
QB6=0;
P3=table[a4]; //第4个数码管显示,带小数点
delay(10);
QB1=0;
QB2=0;
QB3=0;
QB4=0;
QB5=1;
QB6=0;
//第5个数码管显示
P3=table[a5];
delay(10);
QB1=0;
QB2=0;
QB3=0;
QB4=0;
QB5=0;
QB6=1;
P3=table[a6]; //第6个数码管显示
delay(10);
QB1=0;
QB2=0;
QB3=0;
QB4=0;
QB5=0;
QB6=0;
}
void zd_clock() //整点报时函数
{
if(minu==59&&(sec==53||sec==55||sec==57))
{
fm=0;
delay(5);
fm=1;
delay(5);
}
fm=0;
if(minu==59&&sec==59)
{
fm=0;
delay(5);
fm=1;
delay(5);
fm=0;
}
}
void nz_clock() //闹钟函数
{
if(hour==n_hour&&minu==n_minu&&sec==n_sec)
//if((sec%2==0)&&sec<30)
{
fm=0;
delay(1);
fm=1;
delay(1);
}
}
void set_time() //设置时间函数
{
if(set_1==2)
{
if(set_2==1)
{
hour=incone(hour);
if(hour==24)
{hour=0;}
// if(hour<0)
// {hour=23;}
hour=decone(hour);
}
if(set_2==2)
{
minu=incone(minu);
if(minu==60)
{minu=0;}
// if(minu<0)
// {minu=59;}
minu=decone(minu);
}
}
}
void set_mdw() //设置月日星期函数
{
if(set_1==4)
{
if(set_2==1)
{
mon=incone(mon);
if(mon==13)
{mon=1;}
mon=decone(mon);
// if(mon==0)
// {mon=12;}
}
if(set_2==2)
{
day=incone(day);
if(day==32)
{day=0;}
day=decone(day);
// if(day==0)
// {day=0;}
}
if(set_2==3)
{
week=incone(week);
if(week==8)
{week=0;}
week=decone(week);
// if(week==0)
// {week=7;}
}
}
}
void set_clock() //设置闹钟函数
{
if(set_1==6)
{
if(set_2==1)
{
n_hour=incone(n_hour);
if(n_hour==24)
{n_hour=0;}
n_hour=decone(n_hour);
if(n_hour==0)
{n_hour=0;}
}
if(set_2==2)
{
n_minu=incone(n_minu);
if(n_minu==60)
{n_minu=0;}
n_minu=decone(n_minu);
if(n_minu==0)
{n_minu=0;}
}
}
}
uchar incone(uchar n) //加1函数
{
if(s3==0)
{ delay(200);
if(s3==0)
{
n++;
while(!s3);
}
}
return(n);
}
uchar decone(uchar m) //减1函数
{
if(s4==0)
{
delay(200);
if(s4==0)
{
m--;
while(!s4);
if(m<0)
{m=0;}
}
}
return(m);
}
void delay(uint k) //延时函数
{
uint i,j;
for(i=k;i>0;i--)
for(j=80;j>0;j--);
}
#include<reg52h>
#include<absacch>
#include<intrinsh>
#define unit unsigned int
#define uchar unsigned char
//#define HZ 12
sbit key0=P0^0; // 分钟调整
sbit key1=P0^1; // 小时调整
sbit P2_0=P2^7; //秒 指示灯
sbit MN_RXD=P3^6;
sbit MN_TXD=P3^7;
uchar data CLOCK[4]={0,0,0,12};//存放时钟时间(百分秒,秒,分,和时位)
//数码管显示表0-f 灭
uchar code TABLE[]={0xBE,0x06,0xEA,0x6E,0x56,0x7C,0xFC,0x0E,0xFE,0x7E,0x00};
//
//模拟串口发送一个字节数据 函数
//
void SendData(unsigned char senddata)
{
unsigned char i;
for(i=0;i<8;i++)
{
if((senddata&0x01)==0)
MN_RXD=0;
else
MN_RXD=1;
_nop_();
MN_TXD=0;
_nop_();
MN_TXD=1;
senddata=senddata>>1;
}
}
//
//显示程序函数
//
void display(void)
{
// unsigned int n;
uchar temp;
temp=CLOCK[1]; temp=temp%10; SendData(TABLE[temp]);
temp=CLOCK[1]; temp=temp/10; SendData(TABLE[temp]);
temp=CLOCK[2]; temp=temp%10; SendData(TABLE[temp]);
temp=CLOCK[2]; temp=temp/10; SendData(TABLE[temp]);
temp=CLOCK[3]; temp=temp%10; SendData(TABLE[temp]);
temp=CLOCK[3]; temp=temp/10; SendData(TABLE[temp]);
/
for(n=0;n<5000;n++);
for(n=0;n<6;n++)
{
SendData(TABLE[10]);
}
/
}
//
//按键控制函数
//
void keycan()
{
unsigned int n;
EA=0;
if(key0==0) // 分钟调整
{
for(n=0;n<10000;n++); //延时去抖动
while(key0==0);
CLOCK[2]=CLOCK[2]+1;
if(CLOCK[2]==60) //到一时
{
CLOCK[2]=0;
}
display();
}
if(key1==0) // 小时调整
{
for(n=0;n<10000;n++); //延时去抖动
while(key1==0);
CLOCK[3]=CLOCK[3]+1;
if(CLOCK[3]==24)
{
CLOCK[3]=0;
}
display();
}
EA=1;
}
//
//T0中断服务函数
//
void time0() interrupt 1 //using 1
{
TH0=0xD8; TL0=0xF0; //重置初值
// TH0=0xB1; TL0=0xE0;
//时钟处理
CLOCK[0]=CLOCK[0]+1;
}
//
//主函数
//
void main()
{
EA=1;
ET0=1;
TMOD=0x01; //T0方式1定时
TH0=0xD8; TL0=0xF0; //D8F0 定时10ms
// TH0=0xB1; TL0=0xE0; //定时 20ms
TR0=1;
for(;;)
{
if(CLOCK[0]==100) //到一秒 10ms100
{
CLOCK[0]=0;
P2_0=~P2_0;
CLOCK[1]=CLOCK[1]+1;
if(CLOCK[1]==60) //到一分
{
CLOCK[1]=0;
CLOCK[2]=CLOCK[2]+1;
if(CLOCK[2]==60) //到一时
{
CLOCK[2]=0;
CLOCK[3]=CLOCK[3]+1;
if(CLOCK[3]==24)
{
CLOCK[3]=0;
}
}
}
display();
}
keycan();
}
}
这个是简单的数码管时钟显示如果有需要,我写过比较完善的1602显示时钟显示控制年月日等等#include\x0d\sbit Begin=P2^0;\x0d\sbit Hour=P2^1;\x0d\sbit Mus=P2^2;\x0d\sbit End=P2^3;\x0d\unsigned char code Tab[]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,\x0d\ 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};\x0d\unsigned char code num[]={ 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};\x0d\unsigned char Time[]={0,0,16,0,0,16,0,0};\x0d\unsigned char a;\x0d\unsigned int x,m,th;\x0d\void init()\x0d\{\x0d\ TMOD=0x01;\x0d\ TH0=(65535/50000)/256;\x0d\ TL0=(65535/50000)%256;\x0d\ EA=1;\x0d\ ET0=1;\x0d\ TR0=1;\x0d\}\x0d\void delay(unsigned int z) \x0d\{ \x0d\ unsigned int x,y;\x0d\ for(x=z;x>0;x--)\x0d\ for(y=110;y>0;y--); \x0d\}\x0d\unsigned char keyboard()\x0d\{\x0d\ if(Begin==0){\x0d\ delay(5);\x0d\ if(Begin==0)\x0d\ return 1;\x0d\ }\x0d\ if(Hour==0){\x0d\ delay(30);\x0d\ if(Hour==0)\x0d\ return 2;\x0d\ }\x0d\ if(Mus==0)\x0d\ return 3;\x0d\ if(End==0)\x0d\ return 4;\x0d\}\x0d\void display()\x0d\{\x0d\ unsigned char i; for(i=0;i=20)\x0d\ {\x0d\ x++;\x0d\ m=x;\x0d\ th=m/3600; //设置小时\x0d\ Time[0]=th/10;\x0d\ Time[1]=th%10;\x0d\ m=m%3600; Time[2]=16; th=m/60; //设置分钟\x0d\ Time[3]=th/10;\x0d\ Time[4]=th%10;\x0d\ m=m%60; Time[5]=16; th=m; //设置秒\x0d\ Time[6]=th/10;\x0d\ Time[7]=th%10; a=0;\x0d\ }\x0d\}
我来发一个C语言51单片机时钟程序,希望能帮到你
/ 程序功能:带定时闹铃时钟 /
/---------------------------------------------------------------/
#include <AT89X51H> /包含器件配置文件/
#define uchar unsigned char
#define uint unsigned int
char DATA_7SEG[10]={0xC0,0xF9,0xA4,0xB0,0x99,
0x92,0x82,0xF8,0x80,0x90,};/0~9的数码管段码/
uchar hour=0,min=0,sec=0; /时、分、秒单元清零/
uchar deda=0; /5mS计数单元清零/
bit d_05s=0; /05秒标志/
uchar set=0; /模式设定标志/
uchar m=0;
uchar flag=0; /RAM掉电标志/
void delay(uint k); /延时函数/
void conv(); /走时单元转换/
void disp(); /走时时间显示函数/
/------------------------走时函数部分 ----------------------/
/定时器T0 5mS初始化/
void init_timer()
{
TMOD=0x01;
TH0=-(4800/256);
TL0=-(4800%256);
IE=0x82;
TR0=1;
}
/---------------------------------/
/5mS定时中断服务函数/
void T0_srv(void) interrupt 1
{
TH0=-(4800/256);
TL0=-(4800%256);
deda++;
}
/----------------------------------/
/时、分、秒单元及走时单元转换/
void conv()
{
if(deda<=100)d_05s=0;
else d_05s=1;
if(deda>=200){sec++;deda=0;}
if(sec==60){min++;sec=0;}
if(min==60){hour++;min=0;}
if(hour==24){hour=0;}
}
/------------------------ 显示函数部分 ----------------------/
/走时时间显示函数/
void disp()
{
P0=DATA_7SEG[hour/10];P2=0xf7;delay(1);
P0=DATA_7SEG[hour%10];P2=0xfb;delay(1);
if(d_05s==1){if(P2_2==0)P0_7=0;else P0_7=1;}
delay(1);
P0=DATA_7SEG[min/10];P2=0xfd;delay(1);
P0=DATA_7SEG[min%10];P2=0xfe;delay(1);
}
/---------------------- 调整时间函数部分 -------------------/
/调整走时时间/
void set_time()
{uchar m;
if(P2_5==0)delay(1);
if(P2_5==0)hour++;
if(hour==24)hour=0;
for(m=0;m<30;m++)
{
disp();
if(P2_2==0)P0_7=0;
else P0_7=1;
delay(1);
}
if(P2_6==0)delay(1);
if(P2_6==0)min++;
if(min==60)min=0;
for(m=0;m<30;m++)
{
disp();
if(P2_2==0)P0_7=0;
else P0_7=1;
delay(1);
}
}
/------------------ 按键扫描、延时等函数部分-------------------/
/走时时间程序函数/
void time()
{
conv(); / 走时单元转换函数 /
disp(); / 走时时间显示函数 /
}
/------------------------------------/
/扫描按键函数/
void scan_key()
{
delay(1);
if(P2_4==0)set++;
if(set>=2)set=0;
if(set==1)flag=0x55;
F0:if(P2_4==0)goto F0; /按键未释放,在此等候/
}
/------------------------------/
/延时函数/
void delay(uint k)
{
uint i,j;
for(i=0;i<k;i++){
for(j=0;j<121;j++)
{;}}
}
/----------------------- 主函数 ------------------------- /
/主函数/
void main()
{
init_timer(); /定时器T0初始化/
while(1) /无限循环/
{
if(P2_4==0)scan_key(); /有按键,调用按键扫描函数/
switch(set) /根据set键值散转/
{
case 0:time(); break; /走时时间程序/
case 1:set_time();break; /走时时间调整/
default:break; /其它退出/
}
if(flag!=0x55) /判断掉电标志/
{
P0=0xc0; P2=0xc0; delay(100);
P2=0xff; delay(400);
}
}
}
以上就是关于基于msp430f149+ds1302+lcd1602的可调数字钟(带闹铃)的C语言程序,我现在程序已经写好了全部的内容,包括:基于msp430f149+ds1302+lcd1602的可调数字钟(带闹铃)的C语言程序,我现在程序已经写好了、51单片机 c语言写的电子时钟程序 请帮忙指正!、用C语言编写AT89C51单片机程序,设计一个智能数字钟。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)