求linux下用c语言编写的定时器程序

求linux下用c语言编写的定时器程序,第1张

 //一个示例程序

#include<stdlibh>

#include<unistdh>

#include<signalh>

#include<timeh>

#include<sys/timeh>

#define N 100 //设置最大的定时器个数

int i=0,t=1; //i代表定时器的个数;t表示时间,逐秒递增

 

struct Timer //Timer结构体,用来保存一个定时器的信息

{

    int total_time; //每隔total_time秒

    int left_time; //还剩left_time秒

    int func; //该定时器超时,要执行的代码的标志

}myTimer[N]; //定义Timer类型的数组,用来保存所有的定时器

 

void setTimer(int t,int f) //新建一个计时器

{

    struct Timer a;

    atotal_time=t;

    aleft_time=t;

    afunc=f;

    myTimer[i++]=a;

}

 

void timeout() //判断定时器是否超时,以及超时时所要执行的动作

{

    printf("Time: %d\n",t++);

    int j;

    for(j=0;j<i;j++)

    {

       if(myTimer[j]left_time!=0)

           myTimer[j]left_time--;

       else

       {

           switch(myTimer[j]func)

           {      //通过匹配myTimer[j]func,判断下一步选择哪种 *** 作

           case 1:

              printf("------Timer 1: --Hello Aillo!\n");break;

           case 2:

              printf("------Timer 2: --Hello Jackie!\n");break;

           case 3:

              printf("------Timer 3: --Hello PiPi!\n");break;

           }

           myTimer[j]left_time=myTimer[j]total_time; //循环计时

       }

    }

}

 

int main() //测试函数,定义三个定时器

{

    setTimer(3,1);

    setTimer(4,2);

    setTimer(5,3);

    signal(SIGALRM,timeout); //接到SIGALRM信号,则执行timeout函数

   

    while(1)

    {

       sleep(1); //每隔一秒发送一个SIGALRM

       kill(getpid(),SIGALRM);

    }

    exit(0);

}

你可以在蜂鸣器子程序中的while(1)内加一个按键扫描程序,如果扫描到撤警键可以跳出这个while(1)死循环,可以用go

to函数(出错的可能性要大一些,但一般也没事)。或者你把while(1)改成while(key);key为一个变量,外界可以将key置1(调用蜂鸣器),当蜂鸣器内部扫描到撤警键后将key置0,这样也可以跳出这个循环。要不你就把程序直接发出来,帮你

改一下

你看过汇编吗?与汇编的格式是一样的。具体就是先开中断允许标志位(IE里面对应的各个位)在设定TMOD工作方式。下一步就是设定初始值了(TH、TL)。设置完这些就可以开定时器了。写中断中段函数是是需要另加interrupt 加上一个常数(比如是定时器0就在后面加上1)。我用89S52芯片编过一个定时器程序你参考一下,希望对你有一点帮助。

//功能:感应外界温度并用数码管显示

//时间:2005年6月20日

//设计人:

#include<reg52h>

#define uchar unsigned char

sbit ad0809_oe=P1^0; //定义各个位

sbit ad0809_start=P1^1;

sbit ad0809_ale=P1^2;

sbit ls595_rclk=P1^3;

sbit ad0809_eoc=P1^5;

sbit ls595_oe=P1^4;

sbit ls595_ser=P3^0;

sbit ls595_srclr=P3^1;

uchar nn,mm;

uchar code tab[]=;

send(uchar); //声明函数

AD(uchar);

void display(uchar);

void init();

//普通口输入数据

send(uchar shu) //普通口串行输入

{

unsigned char i,k;

k=0x01;

for(i=0;i<8;i++)

{

if(k==(k&shu)) //判断每位上是否为1

ls595_ser=1;

else

ls595_ser=0;

k<<=1; //左移一位

ls595_srclr=0; //输入一个上升沿讲数送入595中

ls595_srclr=1;

}

}

//595显示子程序

void display(uchar du)

{

uchar ge,shi,flge; //ge拆字后个位的存放处shi拆字后十位的存放处flge ℃的存放处

shi=tab[du/10]; //拆字

send(shi); //给595送数

ge=tab[du%10];

send(ge);

flge=0xb1;

send(flge);

ls595_rclk=0; //上升沿送出数据

ls595_rclk=1;

}

//初始化程序

void init() //初始化AD、定时器

{

ad0809_start=0; //Start管教上升沿将AD内部寄存器清零

ad0809_start=1;

ad0809_ale=1; //ALE高电平选择通道

nn=0;

mm=0;

TMOD=0x01; //定时器初始化

//IE=0x82;

EA=1;

ET0=1;

TCON=0x00;

TL0=(65536-50000)%256; //定时50ms

TH0=(65536-50000)/256;

}

AD(uchar wen)

{

// unsigned char tt=0;

// ad0809_ale=1; //选择通道

ad0809_start=1;

ad0809_start=0; //start下降沿启动转换信号

while(ad0809_eoc==0); //判断转换是否结束

ad0809_oe=1; //转换结束送出转换数据

wen=P2;

return (wen);

}

//中断服务程序

void tiam0() interrupt 1 using 1 //中断服务程序

{

TL0=(65536-50000)%256; //定时50ms

TH0=(65536-50000)/256;

nn++;

if(nn==10) //05秒M加一

{

mm++;

nn=0;

}

}

//主程序

void main()

{

unsigned char bb,aa,cc; //bb=计算后得到温度,aa=AD输出数据

unsigned char wen; //wen存放转换的得到的数据

init();

// wen=17;

ls595_oe=0;

cc=0;

TR0=1;

while(1)

{

aa=AD(wen);

// ad0809_oe=0;

aa=~aa;

bb=aa/4;

if(mm==2)

{

mm=0;

cc=bb;

}

display(cc); //调用显示子程序

}

}

这个程序用多线程比较好解决

#include <windowsh>

#include <iostream>

#include <conioh>

using namespace std;

const int MAX_SECOND = 1000 60;

DWORD WINAPI MyThread(PVOID pParam)

{

int nSum = 0;

DWORD dwFirstTime = GetTickCount();

cout<<"做题开始,请在"<<MAX_SECOND / 1000 <<"秒内回答"<<endl;

do

{

cout<<"1 + 2 = 请回答:"<<endl;

nSum = getch();

cout<<char(nSum)<<endl;

if(nSum == 3 + '0')

{

cout<<"答案正确"<<endl;

return 0;

}

}while(GetTickCount() - dwFirstTime <= MAX_SECOND);

return 0;

}

int main()

{

HANDLE hThread = CreateThread(NULL, 0, MyThread, 0, NULL, NULL);

WaitForSingleObject(hThread, MAX_SECOND);

CloseHandle(hThread);

return 0;

}

假设你用的晶振为12m,用p10口输出周期为2ms的方波。使用定时器工作方式1

至于计数初值的计算,授之以鱼不如授之以渔!

在定时器模式下,计数器的计数脉冲来自于晶振脉冲的12分频信号,即对机器周期进行计数。若选择12m晶振,则定时器的计数频率为1mhz。假设定时时间为t,机器周期为t1,即12/晶振频率。x为定时器初值。则

x=2^n-t/t1。方式0,n=13,方式1时,n=16,方式2和方式3,n=8

自己算去吧!

#include

void

inittimer0(void)//

{

tmod

=

0x01;

th0

=

0x0fc;

//计数器初值

tl0

=

0x18;

ea

=

1;

et0

=

1;

tr0

=

1;//开启定时器t0

}

void

main(void)

{

inittimer0();

}

void

timer0interrupt(void)

interrupt

1

{

th0

=

0x0fc;//重新赋初值

tl0

=

0x18;

p10=~p10;

//输出方波

}

程序依靠调用外部shutdown实现关机。

本例中定时100秒。

打开后计时,在DOS窗口按任意键停止

关机 *** 作。

你可以将100改为0,实现立即关机。

#include

<stdioh>

#include

<conioh>

void

main(void)

{

system("shutdownexe

-s

-t

100");

getch();

system("shutdownexe

-a");

}

以上就是关于求linux下用c语言编写的定时器程序全部的内容,包括:求linux下用c语言编写的定时器程序、C语言定时中断程序、C语言定时器求助等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9355046.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存