找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1709|回复: 6
打印 上一主题 下一主题
收起左侧

新手弄的单片机定时器延时代码

[复制链接]
跳转到指定楼层
#
新手弄的定时器延时代码欢迎高手指点

         #include <reg52.h>                        //头文件                        
         #include <intrins.h>

         #define uchar unsigned char // 数据类型简化-起别名
        #define uint unsigned int        // 数据类型简化-起别名
        uint n,i,j,m;


          //定时1ms ***************************************************
        {
           TMOD |= 0x01;                //定时器0,工作方式1,16位
            TH0 = 0xfc;                //初值高8位
            TL0 =0x66;                 //初值低8位
                TF0 =0;                  //溢出清0
            TR0 = 1;                          //打开定时器T0
                  EA=0;                                  //关闭总中断
                ET0=0;                                  //关闭T0中断
                while(TF0 ==0);              //溢出等待
                TR0 = 0;                          //暂停定时器T0
           }
//*************************************************************************
          //定时10ms ***************************************************
        {
           TMOD |= 0x01;                //定时器0,工作方式1,16位
            TH0 = 0xdc;                //初值高8位
            TL0 =0x00;                 //初值低8位
                TF0 =0;                  //溢出清0
            TR0 = 1;                          //打开定时器T0
                  EA=0;                                  //关闭总中断
                ET0=0;                                  //关闭T0中断
                while(TF0 ==0);              //溢出等待
                TR0 = 0;                          //暂停定时器T0
           }
//*************************************************************************
          //定时20ms ***************************************************
        {
           TMOD |= 0x01;                //定时器0,工作方式1,16位
            TH0 = 0xb8;                //初值高8位
            TL0 =0x00;                 //初值低8位
                TF0 =0;                  //溢出清0
            TR0 = 1;                          //打开定时器T0
                  EA=0;                                  //关闭总中断
                ET0=0;                                  //关闭T0中断
                while(TF0 ==0);              //溢出等待
                TR0 = 0;                          //暂停定时器T0
           }
//*************************************************************************
          //定时30ms ***************************************************
        {
           TMOD |= 0x01;                //定时器0,工作方式1,16位
            TH0 = 0x94;                //初值高8位
            TL0 =0x00;                 //初值低8位
                TF0 =0;                  //溢出清0
            TR0 = 1;                          //打开定时器T0
                  EA=0;                                  //关闭总中断
                ET0=0;                                  //关闭T0中断
                while(TF0 ==0);              //溢出等待
                TR0 = 0;                          //暂停定时器T0
           }
//*************************************************************************
          //定时40ms ***************************************************
        {
           TMOD |= 0x01;                //定时器0,工作方式1,16位
            TH0 = 0x70;                //初值高8位
            TL0 =0x00;                 //初值低8位
                TF0 =0;                  //溢出清0
            TR0 = 1;                          //打开定时器T0
                  EA=0;                                  //关闭总中断
                ET0=0;                                  //关闭T0中断
                while(TF0 ==0);              //溢出等待
                TR0 = 0;                          //暂停定时器T0
           }
//*************************************************************************
//定时50ms ***************************************************
        {
           TMOD |= 0x01;                //定时器0,工作方式1,16位
            TH0 = 0x4c;                //初值高8位
            TL0 =0x00;                 //初值低8位
                TF0 =0;                  //溢出清0
            TR0 = 1;                          //打开定时器T0
                  EA=0;                                  //关闭总中断
                ET0=0;                                  //关闭T0中断
                while(TF0 ==0);              //溢出等待
                TR0 = 0;                          //暂停定时器T0
           }
//*************************************************************************
//定时60ms ***************************************************
        {
           TMOD |= 0x01;                //定时器0,工作方式1,16位
            TH0 = 0x28;                //初值高8位
            TL0 =0x00;                 //初值低8位
                TF0 =0;                  //溢出清0
            TR0 = 1;                          //打开定时器T0
                  EA=0;                                  //关闭总中断
                ET0=0;                                  //关闭T0中断
                while(TF0 ==0);              //溢出等待
                TR0 = 0;                          //暂停定时器T0
           }
//*************************************************************************

//定时70ms ***************************************************
        {
           TMOD |= 0x01;                //定时器0,工作方式1,16位
            TH0 = 0x04;                //初值高8位
            TL0 =0x00;                 //初值低8位
                TF0 =0;                  //溢出清0
            TR0 = 1;                          //打开定时器T0
                  EA=0;                                  //关闭总中断
                ET0=0;                                  //关闭T0中断
                while(TF0 ==0);              //溢出等待
                TR0 = 0;                          //暂停定时器T0
           }
//*************************************************************************
void delay(n)           //定时1ms的n(n<10)倍数  ***************************
          {
           for(i=0;i<n;i++)                  
           {
            TMOD |= 0x01;                //定时器0,工作方式1,16位
            TH0 = 0xfc;                //初值高8位
            TL0 =0x66;                 //初值低8位
                TF0 =0;                  //溢出清0
            TR0 = 1;                          //打开定时器T0
                  EA=0;                                  //关闭总中断
                ET0=0;                                  //关闭T0中断
                while(TF0 ==0);              //溢出等待
                TR0 = 0;                          //暂停定时器T0
           }
          }
//*************************************************************************
void delay(m)           //定时50ms的m(m<=20)倍数  **************************
          {
           for(j=0;j<m;j++)                  
           {
            TMOD |= 0x01;                //定时器0,工作方式1,16位
            TH0 = 0x4c;                //初值高8位
            TL0 =0x00;                 //初值低8位
                TF0 =0;                  //溢出清0
            TR0 = 1;                          //打开定时器T0
                  EA=0;                                  //关闭总中断
                ET0=0;                                  //关闭T0中断
                while(TF0 ==0);              //溢出等待
                TR0 = 0;                          //暂停定时器T0
           }
          }
//*************************************************************************



评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

6#
ID:123289 发表于 2022-11-1 16:38 | 只看该作者
写出公式,做个EXCEL表贴出来就行了。
回复

使用道具 举报

5#
ID:260656 发表于 2022-10-30 16:01 | 只看该作者
ningsy 发表于 2022-10-29 21:35
STC-ISP 软件里也有一个定时器计算器,直接复制代码就行。

看了一下,真的有啊,才知道
回复

使用道具 举报

地板
ID:496636 发表于 2022-10-29 22:13 | 只看该作者
漏了二条语句
定时1毫秒,如果单片机的频率是11059200HZ,这个就是单片机的时钟频率,而机器工作频率则为时钟频率的12分之一,即921600HZ,我们关注的计数频率就是机器工作频率,意味着每1秒钟它可以数数921600,如果要定时1毫秒,那么在这1毫秒时间内,可以数数921.6。算它是922。而二个字节的最大数是65535,再加1就是65536(十六进制数就是0XFFFF,再加1就是0X10000)所以要让计数器数数922下,能产生溢出那么这个数就是65536-922=64614,转成十六进制数为FC66,其实要想让它精确点,应该比这个值大点,如是FC67,使定时微小于1毫秒,因为产生中断后,重载定时器等操作都需要额外的时间,如果前头定时刚好1毫秒,那么加上额外的时间,就会超过1毫秒了。
定时器的初始化,开总中断,还是开定时中断,还是开启定时器都是在main函数的除while(1)以前的语句执行的,这样之前的语句只执行一次,然后while(1)一直执行,在while(1)的循环体里,对TF溢出标志不断判断,来确定定时时间是否已到。

//定时1ms ***************************************************
        
           TMOD |= 0x01;                //定时器0,工作方式1,16位
            TH0 = 0xfc;                //初值高8位
            TL0 =0x66;                 //初值低8位
            EA=1;                        //开总中断
            ET0=1;                          //开定时器中断
            TR0 = 1;                          //打开定时器T0
            while(1)
        {
                 if(TF0==1)                    //判断定时器1是否溢出         
                {
                   TF0=0;
                TH0 = 0xfc;                //初值高8位
                    TL0 =0x66;                 //初值低8位
                //复位定时器0中断标志位
                   执行你要执行的语句,如计时,如某个变量加1

                }                                 
               
               
           }

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:496636 发表于 2022-10-29 22:00 | 只看该作者
在西门子S7-200PLC中,有系统特殊寄存器,如SM0.1和SM0.0还是SM0.5,都是特殊意义,SM0.1就是PLC开机首次扫描执行一次,然后就不执行了,它是起到初始化的作用,在单片机里实现,你可以在单片机开头书写,然后加个while(1)循环体,while(1)之前就是初始化,while(1)之后就是循环体内一直执行下去,它是不断往复执行下去。在PLC中编程,我一条语句只要开机执行一次,那只要在绘制梯形图时,在其能流左端加上sm0.1的常开触点即可。
而SM0.5,就是半秒ON(1),半秒OFF(0)的布尔变量,用它就能得到秒计数器,用它来使能一个计数器,就能得到一个秒表。
学习知识要懂得融汇贯通。
回复

使用道具 举报

沙发
ID:496636 发表于 2022-10-29 21:46 | 只看该作者
定时1毫秒,如果单片机的频率是11059200HZ,这个就是单片机的时钟频率,而机器工作频率则为时钟频率的12分之一,即921600HZ,我们关注的计数频率就是机器工作频率,意味着每1秒钟它可以数数921600,如果要定时1毫秒,那么在这1毫秒时间内,可以数数921.6。算它是922。而二个字节的最大数是65535,再加1就是65536(十六进制数就是0XFFFF,再加1就是0X10000)所以要让计数器数数922下,能产生溢出那么这个数就是65536-922=64614,转成十六进制数为FC66,其实要想让它精确点,应该比这个值大点,如是FC67,使定时微小于1毫秒,因为产生中断后,重载定时器等操作都需要额外的时间,如果前头定时刚好1毫秒,那么加上额外的时间,就会超过1毫秒了。
定时器的初始化,开总中断,还是开定时中断,还是开启定时器都是在main函数的除while(1)以前的语句执行的,这样之前的语句只执行一次,然后while(1)一直执行,在while(1)的循环体里,对TF溢出标志不断判断,来确定定时时间是否已到。

//定时1ms ***************************************************
        
           TMOD |= 0x01;                //定时器0,工作方式1,16位
            TH0 = 0xfc;                //初值高8位
            TL0 =0x66;                 //初值低8位
            EA=1;                        //开总中断
            ET0=1;                          //开定时器中断
            TR0 = 1;                          //打开定时器T0
            while(1)
        {
                 if(TF0==1)                    //判断定时器1是否溢出         
                {
                   TF0=0;                //复位定时器0中断标志位
                   执行你要执行的语句,如计时,如某个变量加1

                }                                 
               
               
           }
回复

使用道具 举报

楼主
ID:1044091 发表于 2022-10-29 21:35 | 只看该作者
STC-ISP 软件里也有一个定时器计算器,直接复制代码就行。



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表