单片机_第6章 实例

这篇具有很好参考价值的文章主要介绍了单片机_第6章 实例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

建议配合本专栏的文章“单片机_第6章 单片机的定时/计数器”一起使用

目录

实例1 设单片机的fosc=12MHz,采用T1定时方式1在P2.0脚上输出周期为2ms的方波。

实例2 用单片机实现一个频率计功能,用于测量接在P3.4引脚的脉冲波频率(<10KHz),并将测量结果显示在数码管上。

实例3 采用T0定时方式2在P2.0口输出周期为0.5ms的方波(设fosc=12MHz)。

实例4  改进“计数显示器”采用的按键查询法,改为T0计数方式2 + 中断法,实现原有功能。

实例5(波形展宽)  由P3.4口输入一个低频窄脉冲信号。当该信号出现负跳变时,由P3.0口输出宽度为500μs的同步脉冲,如此往复。要求据此设计一个波形展宽程序(fosc= 6MHz)。

实例6(长延时、非对称)  采用10MHz晶振,在P2.0脚上输出周期为2.5s,高电平占空比为20%的脉冲信号。


实例1 设单片机的fosc=12MHz,采用T1定时方式1在P2.0脚上输出周期为2ms的方波。

实例1 设单片机的fosc=12MHz,采用T1定时方式1P2.0脚上输出周期为2ms的方波。单片机_第6章 实例

 分析周期为2ms的方波由2个半周期为1ms的正负脉冲组成
单片机_第6章 实例

 方波输出原理:定时1ms后将端口输出电平取反。
1ms定时的计数初值应为:
        a = 216 – t* fos / 12 = 216 – 1000* 12/ 12 = 64536 = 0xfc18
        TH1 =  0xfc      TL1 = 0x18
        (另一种简单计算的方法:TH1=64536/256,TL1=64536%256)
注意:需要不断重装计数初值。

1查询方式

#include <reg51.h>

sbit P2_0 = P2^0;

main () 
{
   TMOD = 0x10;          //设置T1定时方式1(0001 0000B)
   TR1=1;                //启动T0
   for(;;)
   {
      TH1 = 0xfc; 	     //装载计数初值 
      TL1 = 0x18;
      do{ } while(!TF1); //等待TF1溢出
      P2_0 =!P2_0;       //定时时间到P2.0反相
      TF1 = 0;           //TF1标志清0
    }
}

(2)中断方式

中断源等情况
单片机_第6章 实例

#include <reg51.h>

sbit P2_0=P2^0;

timer1 () interrupt 3      //T1中断函数
{
   P2_0 = !P2_0; 		   //P2.0取反
   TH1 = 0xfc; 		       //装载计数初值
   TL1 = 0x18;
}

main () 
{
   TMOD = 0x10; 		   //T1定时方式1
   TH1 = 0xfc;		       //装载计数初值
   TL1 = 0x18;
   EA=1; 			       //开总中断
   ET1=1; 			       //开T1中断(总中断与部分中断的书写顺序无关紧要)
   TR1=1; 			       //启动T1,一定要最后书写,最后使用
   while(1);
}

实例1仿真运行
单片机_第6章 实例

 仿真结果:生成了满足提示要求的波形

小结:方式1连续定时编程一般框架单片机_第6章 实例

思考(我这里只讲一点思路,大家可以自己动手实验)

 1怎样实现较长的定时?(增加一个值count来记录中断的次数,count达到一定值时让它产生反应)

2怎样输出特定占空比的矩形波?(将高电平和低电平的时间单独表示)


实例2 用单片机实现一个频率计功能,用于测量接在P3.4引脚的脉冲波频率(<10KHz),并将测量结果显示在数码管上。

实例用单片机实现一个频率计功能,用于测量接在P3.4引脚的脉冲波频率(<10KHz),并将测量结果显示在数码管上。

硬件:  脉冲波信号源、四位数码管
软件:  T0: 计数         T1:定时1s             数码管显示(主程序)

单片机_第6章 实例


实例3 采用T0定时方式2在P2.0口输出周期为0.5ms的方波(设fosc=12MHz)。

实例3 采用T0定时方式2P2.0口输出周期为0.5ms的方波(fosc=12MHz)

编程步骤
 (1)设置TMOD;  
 (2)计算计数初值;        ((1)(2)步骤可以调换)
 (3) 选择溢出结果处理方式;        (中断:中断初始化)
 (4)启动定时计数器;
 (5)定时或计数时间到的处理工作;        (中断方式在中断函数中处理)
 (6)清除溢出标志。        (仅针对查询方式)

分析:计数初值TL0= ((256-250)*12/12)%256 = 0x06TMOD = 0x02

1查询方式

#include <reg51.h>

sbit P2_0 = P2^0;

main()
{
    TMOD = 0x02;      
    TH0= TL0 = 0x06;
    TR0=1; 
    for(;;)
    {
        do{} while(!TF0);  
        P2_0 =!P2_0;       
        TF0 = 0; 
	}
}

2中断方式

#include <reg51.h>

sbit P2_0=P2^0;

timer0 () interrupt 1 
{
   P2_0 = !P2_0; 	//与方式1相比,少了赋初值的部分,是因为方式2自己独特的性质
}

main()
{
    TMOD = 0x02; 	
	TH0 = TL0 = 0x06;
    EA= ET0 = 1;
    TR0=1; 		
	while(1);
}

实例3仿真运行
单片机_第6章 实例

 仿真结果:生成了满足提示要求的波形


实例4  改进“计数显示器”采用的按键查询法,改为T0计数方式2 + 中断法,实现原有功能。

实例4  改进“计数显示器”采用的按键查询法,改为T0计数方式2 + 中断法,实现原有功能。

电路改造:按键由P3.7改为P3.4(T0)接入。 
单片机_第6章 实例

 分析:T0计数方式2的初始化;定数计数N=1时的初值计算;T0中断初始化

T0计数方式2:TMOD = 0000 0110B = 0x06
计数初值: a = 2 8 – 1 = 255 = 0xff
T0中断初始化:ET0 = EA = 1

//中断方式的计数显示器

#include <reg51.h>

sbit p3_4=P3^4;
unsigned char num=0;
unsigned char led[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

void main()
{
	TMOD=0x06;//00000110
	EA=ET0=1;
	TH0=TL0=0xff;
	TR0=1;
	while(1)
	{
		P0=led[num/10];
		P2=led[num%10];
	}
} 

count0_srv() interrupt 1
{
	num++;
	if(num==100) num=0;
}

 仿真结果单片机_第6章 实例


 

实例5(波形展宽)  由P3.4口输入一个低频窄脉冲信号。当该信号出现负跳变时,由P3.0口输出宽度为500μs的同步脉冲,如此往复。要求据此设计一个波形展宽程序(fosc= 6MHz)。

实例5(波形展宽)  P3.4口输入一个低频窄脉冲信号。当该信号出现负跳变时,由P3.0口输出宽度为500μs的同步脉冲,如此往复。要求据此设计一个波形展宽程序(fosc= 6MHz)。
单片机_第6章 实例

 1、检测P3.4窄脉冲下降沿;
   将定时计数器当做外部中断检测下降沿;
   T0、方式2、查询方式、计数

    TMOD=0x06;
    TH0=TL0=0xff;
    TRO=1;
    while(!TF0);
    TF0=0;

2、P3.0低电平展宽500us;
   T0、方式2、查询方式、定时

    TMOD=0x02;
    TH0=TL0=0x06;
    P3_0=0;
    TRO=1;
    while(!TF0);
    TF0=0;
    P3_0=1;

3、重复1、2过程

总结

//波形展宽 

#include <reg51.h>
sbit P3_0=P3^0;
void main (){
   TMOD = 0x06; 	//设置为T0计数方式2
   TL0 = 0xff;		//初值0xff可使1个外来脉冲即产生溢出
   TR0 = 1;			//启动计数器
   while (1){
     while (!TF0);	//等待首次溢出
     TF0 = 0;		//清TF0溢出标志
     TMOD = 0x02; 	//设置为T0定时方式2
	 TL0=0x06;		//500微秒定时初值
     P3_0 = 0;
     while (!TF0);	//等待再次溢出
     TF0 = 0;		//清TF0溢出标志
     P3_0 = 1;
     TMOD = 0x06;	//设置为T0计数方式2
     TL0 = 0xff;	//1次溢出计数初值
   }
}

方法二

 

#include <reg51.h>

sbit p3_0=P3^0;

void main()
{
	TMOD=0x16;//T0用于计数方式2,T1用于定时方式1,00010110
	TH0=TL0=0xff; 
	EA=1;ET0=1;ET1=1; 
	TR0=1;TR1=1;
	while(1);
 } 

count0_srv() interrupt 1
{
	p3_0=0; 
	TH1=65286/256;TL1=65286%256;//65536-250(因为这里是6MHz的晶振)=65286
}

timer1_srv() interrupt 3
{
	p3_0=1;
}

仿真结果

单片机_第6章 实例


实例6(长延时、非对称)  采用10MHz晶振,在P2.0脚上输出周期为2.5s,高电平占空比为20%的脉冲信号。

实例6(长延时、非对称)  采用10MHz晶振,在P2.0脚上输出周期为2.5s,高电平占空比为20%的脉冲信号。
单片机_第6章 实例

分析:最大定时时间:10MHz->54.613ms

定时与软件计数联合
单片机_第6章 实例

单片机_第6章 实例

//pro17:P127 6.4 实例6 制定脉冲信号 

#include <reg51.h>

sbit p2_0=P2^0;
unsigned char num=0;//用于占空比
unsigned char count=0; //用于使其为0.5s,即500ms=10*50ms 

void main()
{
	TMOD=0x01;//T0用于定时方式1,00000001
	TH0=23869/256;TL0=23869%256;//65536-50000(50ms)*10/12=23869.33333 
	EA=1;ET0=1;
	TR0=1;
	while(1);
 } 

timer0_srv() interrupt 1
{
	count++;
	if(count==10)
	{
		count=0;
		num++;
		if(num==1) p2_0=0;
		else if(num==5)
		{
			p2_0=1;
			num=0;
		}
	}
	TH0=23869/256;TL0=23869%256;
}

运行结果
单片机_第6章 实例文章来源地址https://www.toymoban.com/news/detail-451919.html

到了这里,关于单片机_第6章 实例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 单片机C语言实例:1、点亮LED的多种方法

    不管学习什么单片机,通常点灯是迈入编程的第一步,点灯虽然简单,但是玩出花样来,需要的知识点还是不少的,本文归纳了15种点灯方式,看看自己会几种,看看是否能帮到努力点灯的工程师们。 程序实例1: 程序实例2: 程序实例3: 程序实例4: 程序实例5: 程序实例

    2024年02月09日
    浏览(38)
  • 单片机C语言实例:18、LCD1602液晶显示

    学单片机的小朋友应该都见过这个显示器--LCD1602,这是最古老最简单的显示屏,上世纪80年代的产物。 它显示的图案如下所示 显示部分放大就是下面这样 ,像素就是一个个小方块,相当于描点法绘图了。 如果把所有像素全部显示出来就是下面这样,全部是小黑点  全部点亮

    2024年02月09日
    浏览(49)
  • 单片机C语言实例:4、数码管左右移显示

    程序实例1: 程序实例2: 程序实例3: 程序实例4: 程序实例5: 程序实例6: 程序实例7: 程序实例8:

    2024年02月02日
    浏览(36)
  • 单片机C语言实例:2、点亮数码管的多种方法

    一、共阳数码管静态显示 程序实例1: 二、1个共阳数码管显示变化的数字 程序实例2: 三、单个数码管模拟水流 程序实例3: 四、按键控制单个数码管显示 程序实例4: 五、单个数码管指示逻辑电平 程序实例5: 六、8位数码管显示其中之一 程序实例6: 七、8位数码管静态显

    2024年02月04日
    浏览(41)
  • 【51单片机实例教程】智能小车(一)让你的小车跑起来

    文章目录 前言 一、硬件 1.小车底盘 2.51单片机最小系统板 3.L298N双路电机驱动板

    2024年02月11日
    浏览(58)
  • 51单片机io口的应用,注意事项及实例代码并标注

      51单片机是一种广泛使用的8位微控制器,它具有多个I/O(输入/输出)端口。根据不同的厂商,51单片机可能有不同数量的I/O端口。在此,我们以常见的AT89C51单片机为例,讨论其各I/O端口的区别及应用实例。 1. P0端口:P0端口为地址/数据复用端口,其控制信号线共用。在实际

    2024年02月06日
    浏览(57)
  • 单片机C语言实例:3、数码管累加与累减动态显示

    程序实例1: 程序实例2: 程序实例3: 程序实例4: 程序实例5: 程序实例6: 程序实例7: 程序实例8: 程序实例9: 程序实例10: 程序实例11:

    2024年02月09日
    浏览(42)
  • 从头开始学51单片机之实例4:用定时器输出方波

    Proteus8.9 Keil5 需求:fosc = 12MHz,利用T0实现在P1.0输出周期为1ms的方波 机器周期:T = 12/fosc = 1us 每隔一定时间让P1.0信号翻转,就能得到方波信号 方波周期为1ms,半周期为500us 所以t = 500us,T = 1us 定时器初值: 将TC拆为高8位和低5位,其中高8位1111 0000B(F0H)、低5位0 1100B(0CH),

    2024年02月12日
    浏览(60)
  • 嵌入式物联网单片机项目开发实例-4G DTU边缘数据采集网关开发

    链接:https://pan.baidu.com/s/163D-kElFqXov629YaSrWDw?pwd=1688 提取码:1688 [1.EC200S_STM32F103_4G CAT1网络TCP和UDP的透传字符串] [2.EC200S_STM32F103_4G CAT1网络TCP和UDP的透传十六进制包含0x00] [3.EC200S_STM32F103_4G CAT1通过外置MQTT协议发送定位和固定数据到ONENET] [4.EC200S_STM32F103_4G CAT1通过外置MQTT协议发送

    2024年01月16日
    浏览(52)
  • STM32F103单片机通过SPI全双工通信协议与W25Q64(FLASH)进行通信【串行同步通信(数据线与时钟线配合),(一主多从模式)】附相关驱动代码详解

    1.W25Qxx系列是一种低成本、小型化、使用简单的 非易失性存储器 ,常应用于数据存储、字库存储、固件程序存储等场景 2.存储介质: Nor Flash(闪存) 3.时钟频率:80MHz / 160MHz (Dual SPI) / 320MHz (Quad SPI) 4.存储容量(24位地址): W25Q40: 4Mbit / 512KByte W25Q80: 8Mbit / 1MByte W25Q16: 16

    2024年04月13日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包