1. 51单片机的定时器程序,c语言编写,使用内部定时器设计一个三位秒表 (秒,十秒,分),显示秒位的变动,
方法:首先:要学会数码管的显示程序
然后:按键的操作,注意软件的消抖(具体的是延时,10ms左右)。
假设有k1~停表,k2~复位,k3~继续运行
先说停表和继续运行的
停表:如果k1按下,TR0=0;
继续运行:如果k3按下,TR0=1;
复位:直接用硬件复位单片机或者k2按下,数据清零。
要实现数据的循环:只要定时器计数到最大值时,再把最小值赋给它!
2. 秒表计时程序要求(需要用C语言实现)
这里的分段计时,我使用空格键实现的,F2比较麻烦。程序开始,输入回车开始计时,中途输入空格可以开始新的计时,最后输入回车完成计时。
文件存在程序目录下的timeout.txt
真麻烦,下次这种求助才给10分,绝对不做。。。
//////////////////////////
我的代码就是在VS2010下写的。。。怎么会无法编译。。。你要建一个空工程,然后加入C++源文件。
/////////////////////////////
请新建一个空工程,不要新建Win32Console那个工程!
#include<stdio.h>
#include<conio.h>
#include<windows.h>
#include<stdlib.h>
structtm//定义时间结构体,包括时分秒和10毫秒
{
inthours,minutes,seconds;
inthscd;
}time,tmp,total;//time用以计时显示,tmp用以存储上一阶段时间,total记总时间
intcnt;
FILE*fout;
//每次调用update函数,相当于时间过了10ms
voipdate(structtm*t)
{
(*t).hscd++;//10ms单位时间加1
cnt++;
if((*t).hscd==100)//计时满1s,进位
{
(*t).hscd=0;
(*t).seconds++;
}
if((*t).seconds==60)//计时满一分,进位
{
(*t).seconds=0;
(*t).minutes++;
}
if((*t).minutes==60)//计时满一小时,进位
{
(*t).minutes=0;
(*t).hours++;
}
if((*t).hours==24)(*t).hours=0;
//delay();
Sleep(10);//Sleep是windows提供的函数,作用是暂停程序,单位毫秒,所以此处暂停10ms
}
voiddisplay(structtm*t)
{
//此处输出计时结果, 为回车不换行,既一直在同一行更新时间
printf("%d:",(*t).hours);
printf("%d:",(*t).minutes);
printf("%d:",(*t).seconds);
printf("%d ",(*t).hscd);
//printf("Now,press'e'keytostoptheclock...");
}
voidtime_init()//初始化时间
{
time.hours=time.minutes=time.seconds=time.hscd=0;
}
voidget_total()//计算总时间
{
total.hscd=cnt%100;
cnt/=100;
total.seconds=cnt%60;
cnt/=60;
total.minutes=cnt%60;
cnt/=60;
total.hours=cnt;
}
intmain()
{
charm;
time_init();
cnt=0;
fout=fopen("timeout.txt","w");
printf("Now,pressEnterkeytobegintheclock... ");
while(1)
{
m=getch();
if(m!=' ')//读入一个输入,如果是回车,那么跳出次循环
printf("InputError! ");
else
break;
}
printf("Whilecounting,! ");
while(1)
{
if(kbhit())//此处检查是否有键盘输入
{
m=getch();
if(m==' ')//如果等于回车,那么计时结束,跳出循环
break;
elseif(m=='')//如果等于空格,显示此次计时,初始化计时器
{
tmp=time;//记录上一段计时器结果
fprintf(fout,"%d:%d:%d:%d ",tmp.hours,tmp.minutes,tmp.seconds,tmp.hscd);//写入文件
time_init();
printf(" ");
}
else
{
printf("InputError! ");
}
}
update(&time);//更新计时器
display(&time);//显示计时器时间
}
tmp=time;//输出最后一次即使结果,写入文件
fprintf(fout,"%d:%d:%d:%d ",tmp.hours,tmp.minutes,tmp.seconds,tmp.hscd);
get_total();//计算总的时间,显示,并写入文件
printf(" totaltime:%d:%d:%d:%d ",total.hours,total.minutes,total.seconds,total.hscd);
fprintf(fout,"totaltime:%d:%d:%d:%d ",total.hours,total.minutes,total.seconds,total.hscd);
fclose(fout);
getch();
}
3. 我想用C语言做一个计时器,也就是秒表,按下一个键开始计时,可不可以显示读秒过程都行,可以的话最好,
如果对时间的精度要求是s的话,采用time()即可,该函数的返回值是自1970年1月1日0点0分之后的秒数。
采用getchar函数获取输入字符,然后获取一个time值,等到在输入一个字符后,在获取一次time值,两者相减就是经过的秒数。
4. 如何用c语言调用系统时钟以数字形式显示精确到秒并可以12 24小时转换12小时有AMPM
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
////////////////////////////////////////////////////////
//按键功能定义
///////////////////////////////////////////////////////
sbit se=P2^0; //校表位选择
sbit ad=P2^1; //加/清零
sbit dw=P2^2; //减/开始/暂停秒表
sbit ch=P2^3; //秒表和时钟切换
//为了代码的简单,加多一个切换按键,校表键不复用
///////////////////////////////////////////////////////////
uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};
uchar buf[3]={15,4,19};//数据缓存
/////////////////////////////////////////////////////////////////////////////
uint sec=0; //秒表
uchar n,count; //计算
uchar number; //调时选择位
bit flag,flag1; //flag功能切换;flag1暂停/开始标志位
///////////////////////////////////////////////////////////////////
void delay(uchar i) //延时i*2ms
{
uchar j=240;
while(i--)
while(j--);
}
void display(bit t) //显示子函数,形参位显示标志,0位时钟,1位秒表
{
uchar i,flash;
static cn=0;
uchar tbuf[8];
uchar dbuf[8];
if(!t) //时钟显示
{
tbuf[0]=tab[buf[0]%10];
tbuf[1]=tab[buf[0]/10];
tbuf[2]=tab[10];
tbuf[3]=tab[buf[1]%10];
tbuf[4]=tab[buf[1]/10];
tbuf[5]=tab[10];
tbuf[6]=tab[buf[2]%10];
tbuf[7]=tab[buf[2]/10];
switch(number)
{
case 1: tbuf[0]=tbuf[0]|flash; tbuf[1]=tbuf[1]|flash; break;
case 2: tbuf[3]=tbuf[3]|flash; tbuf[4]=tbuf[4]|flash ;break;
case 3: tbuf[6]=tbuf[6]|flash; tbuf[7]=tbuf[7]|flash ;break;
}
for(i=0;i<8;i++)
{
P0=(0x01<<i);
P1=tbuf[i];
delay(1);
P1=0xff;
}
cn++;
if(cn==25)
{
cn=0;
flash=~flash;
}
}
else //秒表显示
{
dbuf[0]=n/10;
dbuf[1]=10;
dbuf[2]=sec%60%10;
dbuf[3]=sec%60/10;
dbuf[4]=10;
dbuf[5]=sec/60%10;
dbuf[6]=sec/60/10%10;
dbuf[7]=sec/60/100;
for(i=0;i<8;i++)
{
P0=(0x01<<i);
P1=tab[dbuf[i]];
delay(1);
P1=0xff;
}
}
}
void chang() //功能切换,时钟和秒表之间;并且暂停/开始,清零子函数
{
if(ch==0)
{
delay(15);
if(ch==0)
{
while(ch==0) display(flag); //松手检测,调用显示函数,防止显示中断,下同
flag=~flag;
if(flag)
{
number=0;
TR0=1;
TR1=0;
}
else
{
TR0=1;
TR1=0;
}
}
}
if(flag)
{
if(dw==0)
{
delay(15);
if(dw==0)
{
while(dw==0) display(1);
flag1=~flag1;
if(flag1)
{
TR1=1;
TR0=1;
}
else
{
TR1=0;
TR0=1;
}
}
}
if(ad==0)
{
delay(15);
if(ad==0)
{
while(ad==0) display(1);
sec=0;n=0;
TR1=0;flag1=0;
}
}
}
}
void ch_time() //时间调节子函数
{
if(!flag)
{
if(se==0)
{
delay(15);
if(se==0)
{
while(se==0) display(0);
TR0=0;
number++;
if(number==4)
{
number=0; //防止程序跑飞
TR0=1;
}
}
}
if(ad==0) //时钟调节模式下,加
{
delay(15);
if(ad==0)
{
while(ad==0) display(0);
switch(number)
{
case 1: buf[0]++; if(buf[0]==60) buf[0]=1; break;
case 2: buf[1]++; if(buf[1]==60) buf[1]=1; break;
case 3: buf[2]++; if(buf[2]==24) buf[2]=1; break;
default: break;
}
}
}
if(dw==0) //时钟调节模式下,减
{
delay(15);
if(dw==0)
{
while(dw==0) display(0);
switch(number)
{
case 1: buf[0]--; if(buf[0]==0) buf[0]=59; break;
case 2: buf[1]--; if(buf[1]==0) buf[1]=59; break;
case 3: buf[2]--; if(buf[2]==0) buf[2]=23; break;
default: break;
}
}
}
}
}
void main()
{
IE=0x8a; //打开总中断,定时器T1和T0中断
TMOD=0x11; //设定T1,T0位工作方式1
TH0=0xD8;
TL0=0xF0; //T0转装初值
TH1=0xD8;
TL1=0xF0; //T1转装初值
TR0=1; //开始时钟开始工作
while(1)
{
ch_time(); //时间设置
chang(); //模式切换
display(flag); //显示函数
}
}
void time_T0() interrupt 1 //定时器0,工作方式1,时钟中断
{
TH0=0xD8;
TL0=0xF0;
count++;
if(count==90)
{
count=0;
buf[0]++;
if(buf[0]==60)
{
buf[0]=0;
buf[1]++;
if(buf[1]==60)
{
buf[1]=0;
buf[2]++;
if(buf[2]==60) buf[2]=0;
}
}
}
}
void sec_T1() interrupt 3 //定时器1,工作方式1,秒表中断
{
TH1=0Xd8;
TL1=0Xf0;
count++;
n++;
if(n==90)
{
n=0;
sec++;
if(sec==65000) //最大计时到650分钟
sec=0;
}
if(count==90)
{
count=0;
buf[0]++;
if(buf[0]==60)
{
buf[0]=0;
buf[1]++;
if(buf[1]==60)
{
buf[1]=0;
buf[2]++;
if(buf[2]==60) buf[2]=0;
}
}
}
}
5. 用C语言编写秒表的程序(单片机控制的时钟设计)
这个程序可以实现秒的计时,按键控制开始、暂停、清零功能,更多功能自己在看清程序的基础上进行改进。
#include <reg51.H>
sbit P3_5 =P3^5;
unsigned char code dispcode[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0x00};
unsigned char second;
unsigned char keycnt;
unsigned int tcnt;
void main(void)
{
unsigned char i,j;
TMOD=0x02;
ET0=1;
EA=1;
second=0;
P1=dispcode[second/10];
P2=dispcode[second%10];
while(1)
{
if(P3_5==0)
{
for(i=20;i>0;i--)
for(j=248;j>0;j--);
if(P3_5==0)
{
keycnt++;
switch(keycnt)
{
case 1:
TH0=0x06;
TL0=0x06;
TR0=1;
break;
case 2:
TR0=0;
break;
case 3:
keycnt=0;
second=0;
P1=dispcode[second/10];
P2=dispcode[second%10];
break;
}
while(P3_5==0);
}
}
}
}
void t0(void) interrupt 1 using 0
{
tcnt++;
if(tcnt==4000)
{
tcnt=0;
second++;
if(second==100)
{
second=0;
}
P1=dispcode[second/10];
P2=dispcode[second%10];
}
}
6. 单片机:麻烦写个程序,用C语言编写,实现秒表功能,如图
#include <reg51.H>
#define uc unsigned char
uc code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴极0到9
uc ms50,s;//定义变量:50毫秒,秒
void timer0(void) interrupt 1 using 0
{
TH0 = 0x3c;//定时器赋予初值,定时0.05秒
TL0 = 0xb0;
ms50++;
if(ms50==20)//定时1秒
{
ms50=0;s++;
P0=table[s/10];//分解出十位
P2=table[s%10];//分解出个?
}
if(s==60)s=0;//超过1分钟,恢复为0秒
}
void main(void)
{
ms50=0;
s=0;
TMOD = 1;//0000 0001,也就是T0(低四位有效),定时(第三位),方式1(最低位01)
TH0 = 0x3c;//定时器赋予初值,定时0.05秒
TL0 = 0xb0;
EA = 1; //总中断允许
ET0 = 1;//定时中断0,允许
TR0 = 1; //启动定时器
while(1);
}
7. C# 如何制作一个百米秒表计时器能够记录动态瞬间时间。
按钮按下的时候随时可以利用datetime.now和计时器启动时的时间进行差值计算得到一个timespan对象。
8. 51单片机简易秒表的实现,用C语言编写
程序我能写,但是硬件电路图啥的不太懂。
9. 用C语言设计秒表程序
int main()
{ char m;
struct tm time;
time.hours=time.minutes=time.seconds=0;
printf("Now, press 's' key to begin the clock...\n");
m=getch();
if(m=='s'||m=='S')
while(1)
{
while(!kbhit()) {
update(&time);
display(&time);}
m=getch();
if(m=='s'||m=='S')break;
else{ printf("Only 's' or 'S' can be inputed!!");}
}
}
把main函数改成这样看看行不行
10. C语言怎么写一个简易秒表
用到time.h文件
里面有个clock();函数,返回一个clock_t类型的数字,表示从程序运行开始,CPU的"滴答"数
而在time.h里有个常量CLOCKS_PER_SEC表示每秒钟有多少个"滴答".
这样,(((float)clock())/CLOCKS_PER_SEC)*1000这样的表达式就能得到从程序运行开始到现在的经过的时间.
程序的大致思路是这样的,程序按下1的时候记下当时的程序运行时间.
从这时起,每时刻捡取程序运行时间,然后减去先前的值,就可以得到已经计时的时间了.
只要让用户按下0结束计时就好了
在conio.h文件里,有个函数kbhit()是个非阻塞函数,用来检查键盘缓冲里有没有按键按下,若有,则返回1,若没有,则返回0,以此来作为判断,若返回1,则捡取按键,测试它是不是0或者1,若返回0,则表示用户没有动作,继续原来的工作,即继续计时或等待命令.