请问单片机C语言定时器程序怎么写?

请问单片机C语言定时器程序怎么写?,第1张

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

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

//时间:2005年6月20日

//设计人扒慧:

#include<春袜答reg52.h>

#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[]={0x81,0xcf,0x92,0x86,0xcc,0xa4,0xa0,0x8f,0x80,0x84}

send(uchar) //声明函数

AD(uchar)

void display(uchar)

void init()

//********普通口输入数据*****************

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

{

unsigned char i,k

k=0x01

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

{

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)//0.5秒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 <stdio.h>

#include <windows.h>

void 数宽歼main()

{

int _t=60

while (_t>薯冲0)

{

Sleep(1000)

_t--

}

/*

 巧州     60秒后要执行的语句

*/

}

 //一个示例程序。

#include<stdlib.h>

#include<unistd.h>

#include<signal.h>

#include<time.h>

#include<sys/time.h>

#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

    a.total_time=t

    a.left_time=t

    a.func=f

    myTimer[i++]=a

}

 

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

{

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

    int j

    for(j=0j<ij++)

    {

       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)

}


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

原文地址:https://54852.com/yw/12415775.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存