您当前的位置:首页 > 互联网教程

关于C语言程序设计的计时器

发布时间:2025-05-14 11:33:46    发布人:远客网络

关于C语言程序设计的计时器

一、关于C语言程序设计的计时器

1、C语言中的头文件time.h中定义了库函数clock(),

2、它返回的是从程序运行开始算起的时间,一时钟周期为单位,

3、time.h还定义了符号:CLOCKS_PER_SEC,

4、即一秒钟的时钟周期。这样就简单了,

5、在头文件中加入#include<time.h>,在程序main()主函数的开头定义long now=0;

6、并给把clock()赋值给now,即now=clock();记录程序开始时的时间,clock()会继续增加,

7、但now已经确定为开始那一时刻clock()的值,

8、在程序结尾,算式clock()-now就是程序执行所需的时间,

9、如果想得到以秒为单位的时间只要输出(clock()-now)/CLOCKS_PER_SEC就是了,

10、printf("%f",(clock()-now)/CLOCKS_PER_SEC);就可以了。

二、89c51单面机c语言时钟控制器编程

方案1:AT89S52,DS12887时钟芯片,实践通过,运行稳定。自己根据程序连接引脚。

#define LCDCOM XBYTE[0xcffc]//LCD写命令寄存器地址

#define LCDDATA XBYTE[0xcffd]//LCD写数据寄存器地址

#define LCDSTATUS XBYTE[0xcffe]//LCD读状态寄存器地址

#define DSA XBYTE[0x8f0a]//实时时钟寄存器A

#define DSB XBYTE[0x8f0b]//实时时钟寄存器B

#define DSC XBYTE[0x8f0c]//实时时钟寄存器C

#define DSD XBYTE[0x8f0d]//实时时钟寄存器D

#define SECOND XBYTE[0x8f05]//实时时钟分报警

uchar idata dt[7]={06,7,11,17,05,0,2};//时间初值

uchar at[7]={9,8,7,4,2,0,6};//年,月,日,时,分,秒,星期时标寄存器地址

uchar xdata*addr=0x8f00;//实时时钟片选地址

void lcd_data(uchar lcd_data);

void lcd_moveto(uchar position);

//void delay( unsigned int number);

void init_ds(void);//实时时钟初始化

uchar ymd[10]={2,0,0,0,0,0,0,0,0,0};//年月日

uchar hms[8]={0,0,0,0,0,0,0,0};//时分秒

uchar code dis_buf[12]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x2e,0x3a};

void init_ds(void)//实时时钟初始化

DSA=0x2f;//选时钟32.768kHz;中断周期500ms

DSB=0x7e;//中断允许,时标值为二进制码,24小时制,芯片工作,方波输出允许

*(addr+at[i])=dt[i];//置时标初值

void lcd_busy()//检测lcd忙程序

while(bflag==1);//当他忙的时候就不停的检测,直到空闲为止

void lcd_cmd(uchar lcd_cmd)//写命令函数

void lcd_data(uchar lcd_data)//写数据函数

void lcd_moveto(uchar position)//确定显示位置

uchar temp;//为显示位置对应的地址

temp=(position+0x80-1);//为在第一行

temp=((position-16)+0xc0);//为第二行

lcd_cmd(0x30);//置功能:1行,5*7字符

lcd_cmd(0x30);//置功能:1行,5*7字符

lcd_cmd(0x30);//置功能:1行,5*7字符

lcd_cmd(0x38);//置功能:2行,5*7字符

lcd_cmd(0x06);//置输入模式:地址增量,显示屏不移动

lcd_cmd(0x0c);//置显示开,不显示光标,光标不闪烁

void shizhong(void)//时钟的每一位取出来

使用芯片:AT89S52,DS12887时钟芯片,实践通过,运行稳定。自己根据程序连接引脚。

#define LCDCOM XBYTE[0xcffc]//LCD写命令寄存器地址

#define LCDDATA XBYTE[0xcffd]//LCD写数据寄存器地址

#define LCDSTATUS XBYTE[0xcffe]//LCD读状态寄存器地址

#define DSA XBYTE[0x8f0a]//实时时钟寄存器A

#define DSB XBYTE[0x8f0b]//实时时钟寄存器B

#define DSC XBYTE[0x8f0c]//实时时钟寄存器C

#define DSD XBYTE[0x8f0d]//实时时钟寄存器D

#define SECOND XBYTE[0x8f05]//实时时钟分报警

uchar idata dt[7]={06,7,11,17,05,0,2};//时间初值

uchar at[7]={9,8,7,4,2,0,6};//年,月,日,时,分,秒,星期时标寄存器地址

uchar xdata*addr=0x8f00;//实时时钟片选地址

void lcd_data(uchar lcd_data);

void lcd_moveto(uchar position);

//void delay( unsigned int number);

void init_ds(void);//实时时钟初始化

uchar ymd[10]={2,0,0,0,0,0,0,0,0,0};//年月日

uchar hms[8]={0,0,0,0,0,0,0,0};//时分秒

uchar code dis_buf[12]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x2e,0x3a};

/*void delay1(uint x)//延时1ms程序

void delay( unsigned int number)

void init_ds(void)//实时时钟初始化

DSA=0x2f;//选时钟32.768kHz;中断周期500ms

DSB=0x7e;//中断允许,时标值为二进制码,24小时制,芯片工作,方波输出允许

*(addr+at[i])=dt[i];//置时标初值

void lcd_busy()//检测lcd忙程序

while(bflag==1);//当他忙的时候就不停的检测,直到空闲为止

void lcd_cmd(uchar lcd_cmd)//写命令函数

void lcd_data(uchar lcd_data)//写数据函数

void lcd_moveto(uchar position)//确定显示位置

uchar temp;//为显示位置对应的地址

temp=(position+0x80-1);//为在第一行

temp=((position-16)+0xc0);//为第二行

lcd_cmd(0x30);//置功能:1行,5*7字符

lcd_cmd(0x30);//置功能:1行,5*7字符

lcd_cmd(0x30);//置功能:1行,5*7字符

lcd_cmd(0x38);//置功能:2行,5*7字符

lcd_cmd(0x06);//置输入模式:地址增量,显示屏不移动

lcd_cmd(0x0c);//置显示开,不显示光标,光标不闪烁

void shizhong(void)//时钟的每一位取出来

case 1:weekday[0]='m';weekday[1]='o';weekday[2]='n';break;

case 2:weekday[0]='t';weekday[1]='u';weekday[2]='e';break;

case 3:weekday[0]='w';weekday[1]='e';weekday[0]='n';break;

case 4:weekday[0]='t';weekday[1]='h';weekday[2]='u';break;

case 5:weekday[0]='f';weekday[1]='r';weekday[2]='i';break;

case 6:weekday[0]='s';weekday[1]='a';weekday[0]='t';break;

case 7:weekday[0]='s';weekday[1]='u';weekday[0]='n';break;

方案2:用内部的定时器做数字钟,通过数码管显示出来

使用芯片:AT89S52,DS12887时钟芯片,实践通过,运行稳定。自己根据程序连接引脚。

#define LCDCOM XBYTE[0xcffc]//LCD写命令寄存器地址

#define LCDDATA XBYTE[0xcffd]//LCD写数据寄存器地址

#define LCDSTATUS XBYTE[0xcffe]//LCD读状态寄存器地址

#define DSA XBYTE[0x8f0a]//实时时钟寄存器A

#define DSB XBYTE[0x8f0b]//实时时钟寄存器B

#define DSC XBYTE[0x8f0c]//实时时钟寄存器C

#define DSD XBYTE[0x8f0d]//实时时钟寄存器D

#define SECOND XBYTE[0x8f05]//实时时钟分报警

uchar idata dt[7]={06,7,11,17,05,0,2};//时间初值

uchar at[7]={9,8,7,4,2,0,6};//年,月,日,时,分,秒,星期时标寄存器地址

uchar xdata*addr=0x8f00;//实时时钟片选地址

void lcd_data(uchar lcd_data);

void lcd_moveto(uchar position);

//void delay( unsigned int number);

void init_ds(void);//实时时钟初始化

uchar ymd[10]={2,0,0,0,0,0,0,0,0,0};//年月日

uchar hms[8]={0,0,0,0,0,0,0,0};//时分秒

uchar code dis_buf[12]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x2e,0x3a};

/*void delay1(uint x)//延时1ms程序

void delay( unsigned int number)

void init_ds(void)//实时时钟初始化

DSA=0x2f;//选时钟32.768kHz;中断周期500ms

DSB=0x7e;//中断允许,时标值为二进制码,24小时制,芯片工作,方波输出允许

*(addr+at[i])=dt[i];//置时标初值

void lcd_busy()//检测lcd忙程序

while(bflag==1);//当他忙的时候就不停的检测,直到空闲为止

void lcd_cmd(uchar lcd_cmd)//写命令函数

void lcd_data(uchar lcd_data)//写数据函数

void lcd_moveto(uchar position)//确定显示位置

uchar temp;//为显示位置对应的地址

temp=(position+0x80-1);//为在第一行

temp=((position-16)+0xc0);//为第二行

lcd_cmd(0x30);//置功能:1行,5*7字符

lcd_cmd(0x30);//置功能:1行,5*7字符

lcd_cmd(0x30);//置功能:1行,5*7字符

lcd_cmd(0x38);//置功能:2行,5*7字符

lcd_cmd(0x06);//置输入模式:地址增量,显示屏不移动

lcd_cmd(0x0c);//置显示开,不显示光标,光标不闪烁

void shizhong(void)//时钟的每一位取出来

case 1:weekday[0]='m';weekday[1]='o';weekday[2]='n';break;

case 2:weekday[0]='t';weekday[1]='u';weekday[2]='e';break;

case 3:weekday[0]='w';weekday[1]='e';weekday[0]='n';break;

case 4:weekday[0]='t';weekday[1]='h';weekday[2]='u';break;

case 5:weekday[0]='f';weekday[1]='r';weekday[2]='i';break;

case 6:weekday[0]='s';weekday[1]='a';weekday[0]='t';break;

case 7:weekday[0]='s';weekday[1]='u';weekday[0]='n';break;

再给一个:用内部的定时器做数字钟,通过数码管显示出来。

uchar dispcode[]={ 0x3f,0x06,0x5b,0x4f,

0x39,0x5e,0x79,0x71,0x00};//定义0到F的段选码

uchar dispbitcode[]={0xfe,0xfd,0xfb,0xf7,

0xef,0xdf,0xbf,0x7f};//8位数码管的位选码

uchar dispbuf[8]={ 0,0,16,0,0,16,0,0};//定义一个缓冲区

for(j=248;j>0;j--);//延时检查是否是P0_0被按下

dispbuf[0]=second%10;//存放秒的个位

dispbuf[1]=second/10;//存放秒的十位

while(P0_0==0);//等待P0_0变高

void t0(void) interrupt 1 using 0//定时器0中断服务程序

P1=dispcode[dispbuf[dispbitcnt]];//为位选码

P3=dispbitcode[dispbitcnt];//为段选码

if(tcnt==4000)//此时有一秒钟了(4000*250us)

注:至于你说的蜂鸣器,这个很简单,在程序里设置一个标志位

sbit busy_louder在硬件连接上采用一个放大器与单片机的一个引脚相接即时到60秒时,计时器清零,同时标志位置位,即可~

三、如何用c语言写一个闹钟

闹钟是一种常见的计时器,可以在特定的时间发出提醒或警报。以下是用C语言编写一个简单闹钟的步骤:

1.使用time.h头文件获取当前系统时间。

2.提示用户输入设定的闹钟时间,包括小时数和分钟数等信息。可以使用scanf函数获取用户输入的值,并存储在变量中。

3.判断当前时间是否等于设定的闹钟时间,如果相等则发出闹钟提示音。可以使用条件语句(if-else)实现这个功能。

4.如果当前时间不等于设定的闹钟时间,则等待一段时间后再重新检查是否到达设定时间。可以使用sleep()函数来实现等待时间的控制。

下面是一个基于以上步骤编写的C语言闹钟代码示例:

#include unistd.h// sleep函数需要用到

printf(请输入闹钟时间(小时分钟):);

scanf(%d%d, alarm_hour, alarm_minute);

time_t current_time= time(NULL);

struct tm*tm_ptr= localtime(current_time);

int current_hour= tm_ptr-tm_hour;

int current_minute= tm_ptr-tm_min;

if(current_hour== alarm_hour current_minute== alarm_minute){

这个示例程序会提示用户输入闹钟时间,然后每隔30秒检查一次当前时间是否到达设定的闹钟时间,如果到达了就发出提示音。当然,这只是一个非常简单的闹钟程序,还有很多需要改进的地方。例如,可以添加更多的提醒方式、支持多个闹钟的同时设定等功能。