#include<reg51.h> //包含 51 单片机寄存器定义的头文件
void main(void)
{TMOD=0x01;// 使用定时器 T0 的模式 1TH0=(65536-46083)/256; // 定时器 T0的高 8 位赋初值TL0=(65536-46083)%256; // 定时器 T0的低 8 位赋初值TR0=1; // 启动定时器 T0TF0=0; //清定时器溢出标志位P2=0xff;  while(1)// 无限循环等待查询  {  while(TF0==0);  TF0=0;  P2=~P2;//按位取反  TH0=(65536-46083)/256; // 定时器 T0 的高 8 位赋初值  TL0=(65536-46083)%256; // 定时器 T0 的低 8 位赋初值}
}

分析:新的寄存器出现了,它们分别是TMOD、TH0、TL0、TR0、TF0,只要掌握调用顺序就可以玩好定时器了。

实例 43 :用定时器 T1 查询方式控制单片机发出 1KHz 音频
#include<reg51.h> //  包含 51 单片机寄存器定义的头文件
sbit sound=P3^7;
void main(void){ TMOD=0x10;// 使用定时器 T1 的模式 1TH1=(65536-921)/256; // 定时器 T1 的高 8 位赋初值TL1=(65536-921)%256; // 定时器 T1 的低 8 位赋初值TR1=1; TF1=0;  // 启动定时器 T1while(1)// 无限循环等待查询{while(TF1==0);TF1=0;sound=~sound; // 将 P3.7引脚输出电平取反TH1=(65536-921)/256; // 定时器 T0的高 8 位赋初值TL1=(65536-921)%256; // 定时器 T0的低 8 位赋初值}}  

实例 44:将计数器 T0 计数的结果送 P1 口 8 位 LED 显示
#include<reg51.h> //  包含 51 单片机寄存器定义的头文件
sbit S=P3^4; // 将 S位定义为 P3.4引脚
void main(void)
{// EA=1;  // 开总中断// 定时器 T0 中断允许  //   ET0=1; TMOD=0x02;// 使用定时器 T0 的模式 2TH0=256-156; // 定时器 T0的高 8 位赋初值TL0=256-156; // 定时器 T0 的高 8 位赋初值TR0=1;    // 启动定时器 T0while(1)// 无限循环等待查询{while(TF0==0) // 如果未计满就等待{if(S==0) // 按键 S按下接地,电平为 0P1=TL0; //计数器 TL0加 1 后送 P1口显示}TF0=0; // 计数器溢出后,将 TF0清 0}
}  

分析:理论结合实例,效果很好吧。

实例 45:用定时器 T0 的中断控制 1 位 LED 闪烁
#include<reg51.h> //  包含 51 单片机寄存器定义的头文件
sbit D1=P2^0; // 将 D1 位定义为 P2.0引脚
void main(void)
{EA=1;// 开总中断 ET0=1;// 定时器 T0 中断允许 TMOD=0x01;// 使用定时器 T0 的模式 1TH0=(65536-46083)/256; //定时器 T0 的高 8 位赋初值TL0=(65536-46083)%256; //定时器 T0的高 8 位赋初值TR0=1; // 启动定时器 T0while(1);
}/**************************************************************
函数功能:定时器 T0 的中断服务程序
**************************************************************/
void Time0(void) interrupt 1 using 0 //寄存器
{D1=~D1; // 按位取反操作,将 P2.0引脚输出电平取反TH0=(65536-46083)/256; //定时器 T0 的高 8 位重新赋初值TL0=(65536-46083)%256; //定时器 T0的高 8 位重新赋初值
}  

实例 46:用定时器 T0 的中断实现长时间定时
#include<reg51.h> // 包含 51 单片机寄存器定义的头文件
sbit D1=P2^0; // 将 D1 位定义为 P2.0引脚
unsigned char Countor; //设置全局变量,储存定时器 T0 中断次数
void main(void)
{EA=1; ET0=1; TMOD=0x01; TH0=(65536-46083)/256; //定时器 T0的高 8 位赋初值TL0=(65536-46083)%256; //定时器 T0的低 8 位赋初值TR0=1; // 启动定时器 T0Countor=0; // 从 0 开始累计中断次数while(1);
}
/**************************************************************
函数功能:定时器 T0 的中断服务程序
**************************************************************/
void Time0(void) interrupt 1 using 0
{Countor++;   // 中断次数自加 1if(Countor==20) // 若累计满 20 次,即计时满 1s{D1=~D1;   // 按位取反操作,将 P2.0引脚输出电平取反Countor=0; // 将 Countor 清 0,重新从 0 开始计数}TH0=(65536-46083)/256; //定时器 T0 的高 8 位重新赋初值TL0=(65536-46083)%256; //定时器 T0的高 8 位重新赋初值
}  

分析:这就是外存库,之前整理的中断和定时器没想到就是这里的片段。

实例 47:用定时器 T1 中断控制两个 LED 以不同周期闪烁
#include<reg51.h> // 包含 51 单片机寄存器定义的头文件
sbit D1=P2^0; // 将 D1 位定义为 P2.0引脚
sbit D2=P2^1; // 将 D2 位定义为 P2.1引脚
unsigned char Countor1; //设置全局变量,储存定时器 T1 中断次数
unsigned char Countor2; //设置全局变量,储存定时器 T1 中断次数
void main(void)
{EA=1;// 开总中断 ET1=1; // 定时器 T1 中断允许TMOD=0x10; // 使用定时器 T1 的模式 1TH1=(65536-46083)/256; //定时器 T1 的高 8 位赋初值TL1=(65536-46083)%256; //定时器 T1的高 8 位赋初值TR1=1;    // 启动定时器 T1  Countor1=0; // 从 0 开始累计中断次数Countor2=0; while(1);
}
void Time1(void) interrupt 3 using 0
{Countor1++; //Countor1 自加 1Countor2++;//Countor2 自加 1if(Countor1==2) // 若累计满 2 次,即计时满 100ms{D1=~D1;  // 按位取反操作,将 P2.0引脚输出电平取反Countor1=0; // 将 Countor1 清 0,重新从 0 开始计数}if(Countor2==8) // 若累计满 8 次,即计时满 400ms{D2=~D2; // 按位取反操作,将 P2.1引脚输出电平取反Countor2=0; // 将 Countor1 清 0,重新从 0 开始计数}TH1=(65536-46083)/256; //定时器 T1 的高 8 位重新赋初值TL1=(65536-46083)%256; //定时器 T1的高 8 位重新赋初值
}  

分析:慢慢欣赏吧,有问题欢迎评论。

实例 50-1 :输出 50 个矩形脉冲
#include<reg51.h> // 包含 51 单片机寄存器定义的头文件
sbit u=P1^4;   // 将 u 位定义为 P1.4
/*************************************************
函数功能:延时约 30ms (3*100*100=30 000μ s =30m
*************************************************/
void delay30ms(void)
{unsigned char m,n;for(m=0;m<100;m++)for(n=0;n<100;n++);
}
void main(void)
{unsigned char i;u=1; // 初始化输出高电平for(i=0;i<50;i++) //输出 50 个矩形脉冲{u=1;delay30ms();u=0;delay30ms(); }while(1);
}  

啦啦啦

实例 50-2:计数器 T0统计外部脉冲数
#include<reg51.h>
void main(void)
{TMOD=0x06; // TMOD=0000 0110B,使用计数器 T0 的模式 2EA=1; ET0=0; // 不使用定时器 T0 的中断TR0=1;  // 启动 T0TH0=0; // 计数器 T0 高 8 位赋初值TL0=0;// 计数器 T0 低 8 位赋初值  while(1) // 无限循环,不停地将 TL0计数结果送 P1口P1=TL0;
}

啊啊啊

实例 51-2 :定时器 T0 的模式 2 测量正脉冲宽度
#include<reg51.h> // 包含 51 单片机寄存器定义的头文件
sbit ui=P3^2; // 将 ui 位定义为 P3.0( INT0)引脚,表示输入电压
void main(void)
{TMOD=0x0a; // TMOD=0000 1010B,使用定时器 T0 的模式 2, GATE置 1EA=1; // 开总中断ET0=0;// 不使用定时器 T0 的中断 TR0=1;// 启动 T0 TH0=0; // 计数器 T0 高 8 位赋初值TL0=0;  // 计数器 T0 低 8 位赋初值while(1)  // 无限循环,不停地将 TL0计数结果送 P1口{    while(ui==0)  //INT0 为低电平, T0 不能启动TL0=0; //INT0 为高电平,启动 T0 计时,所以将 TL0清 0while(ui==1) // 在 INT0 高电平期间,等待,计时P1=TL0; // 将计时结果送 P1口显示 }
}

哈哈哈

实例 53:用外中断 0 的中断方式进行数据采集
#include<reg51.h>
sbit S=P3^2;// 将 S位定义为 P3.2
void main(void) // 包含 51 单片机寄存器定义的头文件
{EA=1; // 开放总中断EX0=1; // 允许使用外中断IT0=1; // 选择负跳变来触发外中断P1=0xff;while(1);
}
void int0(void) interrupt 0 using 0 // 外中断 0 的中断编号为 0
{P1=~P1; // 每产生一次中断请求, P1取反一次。
}  

呐呐呐

实例 54-1 :输出负脉宽为 200 微秒的方波
#include<reg51.h> // 包含 51 单片机寄存器定义的头文件
sbit u=P1^4;// 将u位定义为P1.4
void main(void)
{   TMOD=0x02; //TMOD=0000 0010B,使用定时器 T0 的模式 2EA=1;// 开总中断 ET0=1;// 定时器 T0 中断允许TH0=256-200; // 定时器 T0 的高 8 位赋初值TL0=256-200; // 定时器 T0 的高 8 位赋初值TR0=1; // 启动定时器 T0while(1);// 无限循环,等待中断
}
void Time0(void) interrupt 1 using 0 //"interrupt" 声明函数为中断服务函数
{u=~u; // 将 P1.4引脚输出电平取反,产生方波
}  

嗯嗯嗯

实例 54-2 :测量负脉冲宽度
#include<reg51.h> // 包含 51 单片机寄存器定义的头文件
sbit u=P3^2;// 将 u 位定义为 P3.2
void main(void)
{   TMOD=0x02; //TMOD=0000 0010B,使用定时器 T0 的模式 2EA=1; // 开放总中断EX0=1; // 允许使用外中断IT0=1; // 选择负跳变来触发外中断ET0=1; // 允许定时器 T0 中断TH0=0; // 定时器 T0 赋初值 0TL0=0; // 定时器 T0 赋初值 0TR0=0; // 先关闭 T0while(1)   ; // 无限循环, 不停检测输入负脉冲宽度
}
void int0(void) interrupt 0 using 0 // 外中断 0 的中断编号为 0
{TR0=1; // 外中断一到来,即启动 T0 计时 TL0=0; // 从 0 开始计时while(u==0)// 低电平时,等待 T0 计时P1=TL0; //将结果送 P1口显示TR0=0; // 关闭 T0
}  

咯咯咯

实例 55:方式 0 控制流水灯循环点亮
#include<reg51.h> // 包含 51 单片机寄存器定义的头文件
#include<intrins.h> // 包含函数 _nop_()定义的头文件
unsigned char code Tab[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};
// 流水灯控制码,该数组被定义为全局变量
sbit P17=P1^7;
/**************************************************************
函数功能:延时约 150ms
**************************************************************/
void delay(void)
{unsigned char m,n;for(m=0;m<200;m++)for(n=0;n<250;n++);
}
/**************************************************************
函数功能:发送一个字节的数据
**************************************************************/
void Send(unsigned char dat)
{P17=0;//P1.7 引脚输出清 0 信号,对 74LS164清 0  _nop_(); // 延时一个机器周期,保证清 0 完成P17=1;  // 结束对 74LS164的清 0_nop_(); // 延时一个机器周期SBUF=dat; // 将数据写入发送缓冲器,启动发送while(TI==0); // 若没有发送完毕,等待TI=0;// 发送完毕, TI被置“ 1”,需将其清 0
}
/*******************************************
函数功能:主函数
******************************************/
void main(void)
{unsigned char i;SCON=0x00; //SCON=0000 0000B,使串行口工作于方式 0while(1){for(i=0;i<8;i++){Send(Tab[i]); // 发送数据delay(); // 延时}}
}  

略略略

打开串口调试程序,将波特率设置为9600,无奇偶校验晶振11.0592MHz,发送和接收使用的格式相同,如都使用字符型格式,在发送框输入hello, I Love MCU ,在接收框中同样可以看到相同字符,说明设置和通信正确,
include <REG52.H>
void main (void)
{SCON = 0x50; //SCON:模式 1,8-bit UART,使能接收V TMOD = 0x20; /*TMOD: timer 1, mode 2,8-bit reload*/TH1 =0xFD;// TH1:重新加载值为9600波特TR1 = 1;// 启动定时器1EA = 1;    //幵总中断ES = 1;  //打开串口中断while (1);  //主循环不做任何动作
}
void UART_SER (void) interrupt 4 //串行中断服务程序
{unsigned char Temp; //定义临吋变量 if(RI)    //判断是接收中断产生{RI = 0;//标志位清零Temp = SBUF;//读入缓存区的值P1=Temp;//把值输出到P1口,用于观察SBUF = Temp;//把接收到的值再发回电脑端}if(TI)  //如果是发送标志位,淸零TI = 0;
}

#include<reg51.h>
void ConfigUART(unsigned int baud);
void main ()
{ConfigUART(9600);  //配置波特率为9600while(1){while (!RI);     //等待接收完成RI = 0;          //清零接收中断标志位SBUF = SBUF + 1; //接收到的数据+1后,发送回去;//等号左边的SBUF实际上就是发送SBUF,因为对它的操作是“写”;//等号右边的是接收SBUF,因为对它的操作是“读”。while (!TI);     //等待发送完成TI = 0;          //清零发送中断标志位}
}
void ConfigUART(unsigned int baud)  //串口配置函数,baud为波特率
{SCON = 0x50;   //配置串口为模式1TMOD &= 0x0F;  //清零T1的控制位TMOD |= 0x20;  //配置T1为模式2TH1 = 256 - (11059200/12/32) / baud;  //计算T1重载值TL1 = TH1;     //初值等于重载值  ET1 = 0;       //禁止T1中断TR1 = 1;       //启动T1
}

(⊙﹏⊙)词穷了

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uint infor;
void main()
{SCON=0x50;    //设置串口工作方式为:10位串口发送TMOD=0x20;    //0010 0000 表示定时器T1工作在定时模式、工作方式为:八位自动重装TH1=0xfd;     //通过波特率计算公式,计算出所需波特率对应的定时器的溢出率,设置相应重装的数,此处波特率为9600TL1=0xfd;     TR1=1;        //开启定时器让定时器T1工作EA=1;         //开总中断ES=1;         //开串口中断
//  REN=1;        //允许串口接收数据while(1);
}void CK_timer1() interrupt 4
{if(RI)                //判断是否是接收数据引起的中断{RI=0;         //清接收中断标志位infor=SBUF;   //从SBUF中读取接收到的数据REN=0;        //不允许串口接收数据
//      SBUF=infor;   //将数据送给SBUF,通过串口发送出数据。 }else                  //如果是发送数据完成引起的中断{TI=0;         //清发送中断标志位
//      REN=1;        //发送完成,允许串口接收数据。}
}
/*
串口实验注意事项:1、串口设置过程:设置串口工作方式、设置波特率2、串口中断程序运行条件:开串口中断、TI或RI置1。3、TI和RI都是由硬件置1,但需要由软件对其进行清零。4、输出SBUF和接收SBUF共用一个地址99H,但硬件上并不是同一个地方
*/ 

定时器工作方式0初值除32_51单片机C语言程序100例分析(2)定时器+中断相关推荐

  1. 51单片机C语言程序100例分析(1)IO+C语言+头文件

    51单片机C语言程序100例分析(1)IO+C语言+头文件 \\\插播一条:文章末尾有惊喜哟~///  P1=0xfe;//P1=11111110B,即P1.0输出低电平} 分析:通过这短短的几行代码 ...

  2. 51单片机如何跳出wile循环_51单片机C语言程序100例分析(4)外设

    和我预想的一致,接下来该涉及外设了! /******************************************************** *********数码管显示*****数码管显 ...

  3. 51单片机c语言编程100,51单片机C语言编程100例.doc

    51单片机C语言编程100例.doc 目 录实例3用单片机控制第一个灯亮3实例4用单片机控制一个灯闪烁认识单片机的工作频率3实例5将 P1口状态分别送入P0.P2.P3口认识I/O口的引脚功能4实例6 ...

  4. 单片机C语言应用100例(第二版)光盘资料 作者王东峰 陈圆圆 郭向阳

    单片机C语言应用100例(第二版)光盘资料 ,由于文件太多,所以分成4部分,如下所示; 360网盘; http://yunpan.cn/QDhNeBZ7WMg9s 访问密码 0c69 http://y ...

  5. 单片机c语言应用100例第3版课后答案,单片机C语言应用100例(第3版)(含光盘1张)...

    基 础 篇 第1章 单片机概述及实验器材介绍2 1.1 单片机概述2 1.1.1 单片机的定义.分类与内部组成2 1.1.2 单片机应用系统的结构及其工作过程5 1.1.3 单片机的应用6 1.2 单 ...

  6. 51标准c语言语句范例,51单片机C语言编程100例

    目录 实例3:用单片机控制第一个灯亮 (3) 实例4:用单片机控制一个灯闪烁:认识单片机的工作频率 (3) 实例5:将P1口状态分别送入P0.P2.P3口:认识I/O口的引脚功能 (4) 实例6:使用 ...

  7. 青花瓷音乐的单片机c语言程序,c语言曲谱_单片机c语言音乐简谱代码

    51单片机曲谱编写音乐程序,我看不懂曲谱,谁能教下我! //<世上只有妈妈好>51单片机C语言程序和音乐采灯程序 //此程序在硬件上调试通过 //本程序的单片机晶振采用11.0592MHZ ...

  8. 好听的歌曲单片机c语言程序,单片机C语言程序举例(三)

    原标题:单片机C语言程序举例(三) 14.音乐播放 //此程序在硬件上调试通过 //本程序的晶振采用11.0592M #include sbit speaker=P1^2; unsigned char ...

  9. 数码管c语言程序如何控制,跪求,8255控制数码管,单片机c语言程序;

    跪求,8255控制数码管,单片机c语言程序: 答案:3  信息版本:手机版 解决时间 2021-04-29 04:56 已解决 2021-04-28 12:39 8255 PA口--数码管的段选,82 ...

最新文章

  1. 基于PHP的图片共享网站设计,基于php实现的web图片共享系统(论文+程序)
  2. 蔡成功贷款警示:没事别玩高利贷
  3. python数据分析常用包之Scipy
  4. linux shell 高级编程,shell高级编程
  5. Python 爬取了马蜂窝的出行数据,告诉你这个夏天哪里最值得去!
  6. 我的工作网怎么样_分享一下我在珍爱网的相亲经历
  7. python json文件传输图片
  8. 广东省计算机考试图片大小,广东省计算机等级考试(20190423051419).doc
  9. label包裹input,点击label响应两次解决方法
  10. 【CVPR 2021】VarifocalNet: An IoU-aware Dense Object Detector的译读笔记
  11. Python教程_1_引言
  12. 鼠标被计算机无法识别怎么办,win7系统usb鼠标无法识别怎么解决 电脑usb鼠标无法识别解决方法...
  13. 网络专家预测未来互联网发展十大趋势
  14. 判断是否是anagram
  15. push_back讲解
  16. android 指纹验证api
  17. html下载链接引入element-ui
  18. 【图形学】计算机图形学-练习题7
  19. 在EXCEL中如何设置打印区域,只打印部分区域
  20. python-获取当前目录/上级目录/上上级目录...

热门文章

  1. FLOPS与GOPS:各平台及神经网络算力算量调研
  2. 激光雷达人眼安全认证
  3. 李开复:未来 15年AI 将接管人类一半工作
  4. vue项目浏览器兼容问题
  5. toast 停留时间_android 自定义toast停留时间
  6. 文件上传FileUpload
  7. C++ Primer Plus(第6版)中文版 [豆瓣评分 9.30] 强力推荐的一本C语言入门书籍
  8. Linux内核实验作业六
  9. JavaScript 粘贴事件 paste
  10. MFC中GetDlgItem()和GetWindowText()获取控件里面的数据并保存下来