当前位置: 首页 > news >正文

单片机C语言实例:6、定时器的应用

一、定时器0控制LED闪烁

实例程序1:

#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义sbit LED = P1^2;    //定义LED端口/*------------------------------------------------定时器初始化子程序
------------------------------------------------*/
void Init_Timer0(void)
{TMOD |= 0x01;	  //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响		     TH0=0x00;	      //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出TL0=0x00;EA=1;            //总中断打开ET0=1;           //定时器中断打开TR0=1;           //定时器开关打开
}/*------------------------------------------------主程序
------------------------------------------------*/
main()
{Init_Timer0();while(1);
}/*------------------------------------------------定时器中断子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1 using 1
{TH0=0x00;		  //重新赋值TL0=0x00;LED=~LED;        //指示灯反相,可以看到闪烁
}

二、定时器1控制LED闪烁

程序实例2:

#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义sbit LED = P1^3;    //定义LED端口/*------------------------------------------------定时器初始化子程序
------------------------------------------------*/
void Init_Timer1(void)
{TMOD |= 0x10;	  //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响 TH1=0x00;	      //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出TL1=0x00;EA=1;            //总中断打开ET1=1;           //定时器中断打开TR1=1;           //定时器开关打开
}/*------------------------------------------------主程序
------------------------------------------------*/
main()
{Init_Timer1();while(1);
}
/*------------------------------------------------定时器中断子程序
------------------------------------------------*/
void Timer1_isr(void) interrupt 3 using 1
{TH1=0x00;		 //重新赋值TL1=0x00;LED=~LED;       //LED闪烁
}

三、定时器2控制LED闪烁

程序实例3:

#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义sbit LED = P1^0;    //定义LED端口/*------------------------------------------------定时器初始化子程序
------------------------------------------------*/
void TIM2Inital(void)
{RCAP2H = (65536-60000)/256;//晶振12M 60ms 16bit 自动重载RCAP2L = (65536-60000)%256;ET2=1;                     //打开定时器中断EA=1;                      //打开总中断TR2=1;                     //打开定时器开关
}/*------------------------------------------------主程序
------------------------------------------------*/
main()
{TIM2Inital();while(1);
}/*------------------------------------------------定时器中断子程序
------------------------------------------------*/
void TIM2(void) interrupt 5 using 1//定时器2中断
{TF2=0;LED=~LED;               //指示灯反相  
}

四、定时器0产生1ms方波

程序实例4:

#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义sbit OUT = P1^2;    //定义OUT输出端口/*------------------------------------------------定时器初始化子程序
------------------------------------------------*/
void Init_Timer0(void)
{TMOD |= 0x01;	  //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响		     //TH0=0x00;	      //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出//TL0=0x00;EA=1;            //总中断打开ET0=1;           //定时器中断打开TR0=1;           //定时器开关打开
}
/*------------------------------------------------主程序
------------------------------------------------*/
main()
{Init_Timer0();while(1);
}/*------------------------------------------------定时器中断子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1 using 1
{TH0=(65536-500)/256;		  //重新赋值 12M晶振计算,指令周期1uS,TL0=(65536-500)*256;         //1mS方波半个周期500uS,即定时500次//溢出然后输出端取反OUT=~OUT;        //用示波器可看到方波输出 
}

五、定时器0产生200ms方波

程序实例5:

#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义sbit OUT = P1^2;    //定义OUT输出端口/*------------------------------------------------定时器初始化子程序
------------------------------------------------*/
void Init_Timer0(void)
{TMOD |= 0x01;	  //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响		     //TH0=0x00;	      //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出//TL0=0x00;EA=1;            //总中断打开ET0=1;           //定时器中断打开TR0=1;           //定时器开关打开
}
/*------------------------------------------------主程序
------------------------------------------------*/
main()
{Init_Timer0();while(1);
}/*------------------------------------------------定时器中断子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1 using 1
{static unsigned char i;TH0=(65536-10000)/256;	//重新赋值 12M晶振计算,指令周期1uS,//200mS方波半个周期100mS,由于定时器//最大值65536 即65.536ms 所以TL0=(65536-10000)*256;  //直接定时器不够用,需要用循环处理,//定时10ms,然后循环10次后输出 10x10=100msi++;if(i==11){i=0;OUT=~OUT;        //用示波器可看到方波输出 }}

六、产生多路不同频率方波

程序实例6:

#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义/*------------------------------------------------定时器初始化子程序
------------------------------------------------*/
void Init_Timer0(void)
{TMOD |= 0x01;	  //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响		     //TH0=0x00;	      //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出//TL0=0x00;EA=1;            //总中断打开ET0=1;           //定时器中断打开TR0=1;           //定时器开关打开
}
/*------------------------------------------------主程序
------------------------------------------------*/
main()
{Init_Timer0();while(1);
}/*------------------------------------------------定时器中断子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1 using 1
{static unsigned char i;//重新赋值 12M晶振计算,指令周期1uS,500x2=1mS方波TH0=(65536-500)/256;		  TL0=(65536-500)*256;        i++;P1=i; 	//P1口8路输出不同频率,相当于一个分频器,高频用示波//器测量,低频可以直接用led观测//P1.0输出1ms方波,P1.1输出2ms,p1.2输出4ms,以此类推}

http://www.lryc.cn/news/161669.html

相关文章:

  • ChatGPT Prompting开发实战(五)
  • MySQL——DQL union合并、limit限制与DDL建表和删表
  • Java“牵手”唯品会商品列表数据,关键词搜索唯品会商品数据接口,唯品会API申请指南
  • Springboot整合JWT完成验证登录
  • centos7 下使用docker安装常见的软件:Redis
  • sql:SQL优化知识点记录(十五)
  • vue3+ts 分享海报
  • Ubuntu23.10将推出全磁盘加密功能,提高系统安全性
  • 防火墙的设置主要是为了防范什么
  • Vim9和其他软件的文本复制、粘贴
  • MySQL学习5:事务、存储引擎
  • redis如何保证接口的幂等性
  • 避坑之路 —— 前后端 json 的注意问题
  • [构建 Vue 组件库] 小尾巴 UI 组件库 —— 横向商品卡片(仿淘宝)
  • 【Python】Python实现五子棋游戏(带可视化界面)【独一无二】
  • 用Maloja创建音乐收听统计数据
  • GRU门控循环单元
  • 使用Puppeteer构建博客内容的自动标签生成器
  • 大数据分析案例-基于随机森林算法构建二手房价格预测模型
  • SLAM从入门到精通(ROS安装)
  • Linux 下spi设备驱动
  • 一:图形的位置和尺寸测量
  • rtthread下基于spi device架构MCP25625驱动
  • Open3D 点云投影到圆柱(python详细过程版)
  • Unity实战(10):如何将某个相机的画面做成贴图(RenderTexture)
  • STL- 函数对象
  • 前端 JS 经典:上传文件
  • 数据分析面试
  • Open3D(C++) 整体最小二乘拟合平面
  • 【android12-linux-5.1】【ST芯片】【RK3588】【LSM6DSR】HAL源码分析