//一个示例程序。
#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语言定时器求助等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)