单片机的四种延时方式的对比总结

一、精确延时

1、使用库函数_nop_();精确延时的方式
一个_nop_()函数运行所消耗的时间就是一个机器周期,这个库函数包含在intrins.h这个头文件中,如果要使用这个库函数,只需要在程序最开始,和包含reg52.h这个头文件一样,写入#include<intrins.h>语句后,在程序中就可以使用这个库函数了,不需要额外编写此函数的语句。
如下列代码所示:

#include <reg52.h>	//包含特殊功能能寄存器定义的头文件
#include<intrins.h>	//包含软件自带的库函数的头文件

#define IIC_delay()	{_nop_();	_nop_();	_nop_();	_nop_();}	//宏定义,定义IIC_delay()为四个机器周期时间的精确延时

sbit IIC_SCL  P3^0;		//位地址声明,定义单片机P3.0口为EEPROM的时钟线
sbit IIC_SDA  P3^1;		//位地址声明,定义单片机P3.1口为EEPROM的数据线

void main ()
{
	bit ack;	//定义位变量ack为EEPROM在IIC通信时的应答位,
	//ack=0,表示单片机发送的从机的地址存在
	//ack=1,表示单片机发送的从机的地址不存在
	while(1)
	{
……                              //此处省略后面的代码,只是为了说明库函数_nop_()的用法
	}
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
单片机课程设计任务书 一、基本情况 学时:2周 学分:2学分 适应班级:电气工程及其自动化 二、课程设计的意义、性质、目标、要求 1.意义 课程设计是单片机课程教学的最后一个环节,是对学生进行全面的系统的训练。进行 课程设计可以让学生把学过的比较零碎的知识系统化,真正的能够把学过的知识落到实 处,能够开发简单的系统,也进一步激发了学生再深一步学习的热情,因此课程设计是 必不少的,是非常必要的。 2.性质 课程设计是提高学生单片机技术应用能力以及文字总结能力的综合训练环节,是配合 单片机课程内容掌握、应用得的专门性实践类课程。 3.目标 通过典型实际问题的实际,训练学生的软硬件的综合设计、调试能力以及文字组织能 力,建立系统设计概念,加强工程应用思维方式的训练,同时对教学内容做一定的扩充 。 4.要求 (1)课程设计的基本要求 单片机课程设计的主要内容包括:理论设计与撰写设计报告等。其中理论设计又包括 选择总体方案,硬件系统设计、软件系统设计;硬件设计包括单元电路,选择元器件及 计算参数等;软件设计包括模块化层次结构图,程序流程图。程序设计是课程设计的关 键环节,通过进一步完善程序设计,使之达到课题所要求的指标。课程设计的最后要求 是写出设计总结报告,把设计内容进行全面的总结,若有实践条件,把实践内容上升到 理论高度。 (2)课程设计的教学要求 单片机课程设计的教学采用相对集中的方式进行,以班为单位全班学生集中到设计室 进行。做到实训教学课堂化,严格考勤制度,在实训期间(两周)累计旷课达到6节以上 ,或者迟到、早退累计达到8次以上的学生,该课程考核按不及格处理。在实训期间需要 外出查找资料,必须在指定的时间内方可外出。 课程设计的任务相对分散,每3—5名学生组成一个小组,完成一个课题的设计。小组 成员既有分工、又要协作,同一小组的成员之间可以相互探讨、协商,可以互相借鉴或 参考别人的设计方法和经验。但每个学生必须单独完成设计任务,要有完整的设计资料 ,独立撰写设计报告,设计报告雷同率超过50%的课程设计考核按不及格处理。 三、课程设计题目及设计过程 (一)十字路口交通灯控制系统的设计 利用单片机的定时器产生秒信号,控制十字路口的红绿黄灯交替点亮和熄灭。要求能用 按键设置两个方向的通行时间(绿灯点亮的时间)和暂缓通行时间(黄灯点亮的时间) ,系统的工作符合一般交通灯控制要求。 (二)设计过程 1、设计要求 十字交叉路口的交通灯控制系统的结构如图1.1所示。往南和往北的信号一致,即红灯( 绿灯或黄灯)同时亮或同时熄灭。实现红、绿、黄灯的循环控制。要实现此功能需要表 示三种不同颜色的LED灯分别接在P1个管脚,用软件实现。往东和往西方向的信号一致, 其工作方式与南北方向一样,也采用三种不同颜色的LED灯分别接在P1个管脚,用软件实 现。当南北方向为绿灯和黄灯时,东西向的红灯点亮禁止通行;而东西方向为绿灯和黄 灯时,南北向的红灯点亮禁止通行。 图1.1 十字路口交通灯控制示意图 假设南北方向为主干道,通行时间为20秒,东西方向是次干道,通行时间为20秒,黄 灯点亮的时间均为5秒,则其工作方式如表1.1所示循环点亮信号灯。 表1.1 交通信号灯工作方式 "南北向 "绿灯亮 "黄灯亮 "红灯亮24秒 " " "20秒 "5秒 " " "东西向 "红灯亮24秒 "绿灯亮 "黄灯亮 " " " "20秒 "5秒 " 具体设计要求如下: 1、设计一交通灯控制系统,其结构如图1.1所示,工作方式满足上述要求。 2、主干道和次干道的通行时间及黄灯点亮的时间可以手动设置。 3、在没有手动设置通行时间时,系统自动按表1.1的模式进行工作。 2、设计要点 (1)硬件设计: 实现红、绿、黄灯的循环控制。要实现此功能需要表示三种不同颜色的LED灯分别接 在P1个管脚,用软件实现。 要求东西车道和南北车道上的车辆交替运行,每次通行时间为20s; 要求黄灯先亮5秒钟,才能变换车道。 黄灯亮时要求每秒闪亮一次; 要求绘出原理图; 根据设计要求和技术指标设计好电路。 (2)本系统的工作流程: 1)接通电源时或系统复位后,系统按程序给定的时间工作,即南北向通行20秒,东西向 通行20秒,黄灯亮5秒,工作模式如表1.1所示。首先南北向通行,然后东西向通行,如 此循环。 (3) 软件设计: 1)系统资源分配:为了便于程序的设计、阅读及修改,需要先对系统的存储器资源进行 分配和说明。 2)软件模块:根据上述工作流程和设计要求,软件设计可以分为以下几个功能模块 : 先了解实际交通灯的变化规律,假设一个十字路口为东西南北走向。初始状态0为东西红 灯,南北红灯;然后转状态1南北绿灯通车,东西红灯。过一段时间转状态2,南北绿灯 闪几次转黄灯,延时几秒,东西仍然红灯。再转状态3,东西绿
在上一期的项目:最简单DIY的51蓝牙遥控小车设计方案 访问地址是:https://www.cirmall.com/circuit/20328源码里面有舵机控制部分的程序,但是被我注释掉了,由于舵机控制还是比较复杂,这里还是开一个专题来讲解51单片机如何控制180度舵机。接线请看详细的程序注解吧,学过51肯定啃得动的。 #include "reg52.h" unsigned char count; //0.5ms 次数标识 sbit pwm =P2^7 ; //PWM信号输出,接舵机的数据线 sbit jia =P3^7; //角度增加按钮 sbit jan =P3^6; //角度减少按钮,低电平触发 unsigned char jd; //角度标识 1.0ms->45 1.5->90 2.0->135 2.5->180 void delay(unsigned char i)//普通延时函数 { unsigned char j,k; for(j=i;j>0;j--) for(k=125;k>0;k--); } void Time0_Init() //定时器0初始化 { TMOD = 0x01; //定时器0工作在方式1,16位增计数定时器,16位全是1,最大计数值是65535,就溢出了 IE = 0x82;//EA=1全局中断允许,ET0=1,定时器中断允许 TH0 = 0xfe;//(65536-N)/256=0xef=254推出N=512,N就是需要计数的个数,机器周期是1.09us,所以 //512*1.09us=0.5ms,这时候舵机为0度,1ms是45度,2.5ms是180度,其他的类推 TL0 = 0x33; //11.0592MHz晶振的单片机,导致0.5ms计数器溢出一次,产生定时器中断 TR0=1; //开启定时器 } void Time0_Int() interrupt 1 //定时器0中断服务程序 { TH0 = 0xfe; //重新装载初值 TL0 = 0x33; if(count< jd) //判断计数次数是否小于标识 pwm=1; //输出高电平PWM else pwm=0; //低电平PWM count=(count+1); //计数次数继续增加 count=count@; //计数次数必须小于40,因为0.5ms*40=20ms,这是舵机PWM的固定周期 } void keyscan() //按键扫描 { if(jia==0) //按下增加按钮 { delay(10); //消除抖动 if(jia==0) //按下增加按钮 { jd++; //标识增加,一共有5档,jd=1对应0度,jd=2对应0,45度,jd=3对应90,4对应135,5对应180度 count=0; //计数清0,当count加到2的时候,溢出两次,时间是0.5*2=1ms,对应舵机转到45度 if(jd==6) jd=5; //标识清0 while(jia==0); //等待按键释放 } } if(jan==0) //按下减少按钮 { delay(10); if(jan==0) { jd--; //同理 count=0; if(jd==0) jd=1; //复位 while(jan==0); } } } void main() { jd=1; count=0; Time0_Init(); while(1) { keyscan(); //死循环,按键检测 } } 程序分析结束了。 总结: 根据工作原理,舵机的具体控制方法就是需要一个20ms左右的时基脉冲, 该脉冲的高电平部分一般为0.5ms~2.5ms范围内的角度控制脉冲部分。 脉冲宽度从0.5ms~2.5ms,相对应舵盘的位置为0~180度,呈线性变化。 ***************一般舵机脉冲宽度20ms,高电平宽度与角度对应关系*********** 0.5ms————0度; 1.0ms————45度; 1.5ms————90度; 2.
程序说明:   (1)定义矩阵键盘管脚。   (2)将扫描时用到的管脚四种输出电平状态定义成一个数组。   (3)按键扫描程序。   (4)定义两个临时变量key,i。   (5)让键盘管脚的高四位输出高电平,第四位为低电平,为扫描按键准备。   (6)如果此时管脚状态电平发生变化。   (7)将之前定义的数组中的值赋予管脚,开始逐次扫描。   (8)延时一段时间,去抖。   (9)输出扫描按键的电平。   (10)再延时一段时间。   (11)如果此时按键管脚电平依旧不是输出的默认电平,表示有键按下。   (12)延时一段时间,让电平稳定。   (13)读取当前按键管脚电平,即键值。   (14)等待按键抬起,死循环,如果按键一直按下则一直等待。   (15)返回键值。   四、调试要点与实验现象   接好硬件,通过冷启动方式将程序所生成的。hex文件下载到单片机运行后,打开串口调试助手软件,设置好波特率9600,复位单片机,然后按下板上的4×4按键中的任意一个,并注意观串口调试助手上的显示。(见图3),可以观察到在接收窗口有按键的数据显示。 图3 按键通过串口调试助手显示界面   此外,在本文所附的实验程序中,其中与串口通信中调用了发送字符函数与发送字符串函数。在没有仿真器和遇到需要显示一些提示信息的时候,可以采用串口打印的方式,这样不仅直观方便而且不增加其他成本。   五、总结   本文介绍了单片机外接键盘的工作原理并给出了实例,通过该文,我们可以知道一个完善的键盘控制程序应具备以下功能:   (1) 检测有无按键按下,并采取硬件或软件措施,消除键盘按键机械触点抖动的影响。   (2) 有可靠的逻辑处理办法。每次只处理一个按键,其间对任何按键的操作对系统不产生影响,且无论一次按键时间有多长,系统仅执行一次按键功能程序。   (3) 准确输出按键值(或键号),以满足按键功能要求。对于矩阵键盘而言,必须将行线、列线信号配合起来作适当处理,才能确定闭合键的位置。   此外,按键的扫描方式有多种,本文中所述的是程序扫描方式,另外常见的还有定时扫描方式和中断扫描方式,这些方式均可以在本学习板上实现,因此希望读者结合前几讲的知识,自行进行程序的编写与调试。下讲将讲述单片机动态驱动数码管原理与实例,敬请期待。
目 录 一、设计要求 …………………………………………2 二、设计方案和论证 …………………………………2 (一)总设计原理图 ………………………………… 2 (二)设计方案的选择 ………………………………2 硬件部分 ………………………………………4 软件部分 ………………………………………8 三、设计总结…………………………………………26 四、参考文献…………………………………………26 一、设计要求 1、准确计时,以数字形式显示时、分、秒的时间。 2、小时以24小时计时形式,分秒计时为60进位。 3、校正时间功能,即能随意设定走时时间。 4、闹钟功能,一旦走时到该时间,能以声或光的形式告警提示。 5、设计5V直流电源,系统时钟电路、复位电路。 6、能指示秒节奏,即秒提示。 7、可采用交直流供电电源,且能自动切换。 二、设计方案和论证 本次设计时钟电路,使用了ATC89C51单片机芯片控制电路,单片机控制电路简单且 省去了很多复杂的线路,使得电路简明易懂,使用键盘键上的按键来调整时钟的时、分 、秒,用一扬声器来进行定时提醒,同时使用汇编语言程序来控制整个时钟显示,使得 编程变得更容易,这样通过四个模块:键盘、芯片、扬声器、LED显示即可满足设计要求 。 (一) 总设计原理框图如下图所示: (二)设计方案的选择 1.计时方案 方案1:采用实时时钟芯片 现在市场上有很多实时时钟集成电路,如DS1287、DS12887、DS1302等。这些实 时时钟芯片具备年、月、日、时、分、秒计时功能和多点定时功能,计时数据的更新 每秒自动进行一次,不需要程序干预。因此,在工业实时测控系统中多采用这一类专 用芯片来实现实时时钟功能。 方案2:使用单片机内部的可编程定时器。 利用单片机内部的定时计数器进行中端定时,配合软件延时实现时、分、秒的计 时。该方案节省硬件成本,但程序设计较为复杂。 2.显示方案 对于实时时钟而言,显示显然是另一个重要的环节。通常LED显示有两种方式: 动态显示和静态显示。 静态显示的优点是程序简单、显示亮度有保证、单片机CPU的开销小,节约CPU的 工作时间。但占有I/O口线多,每一个LED都要占有一个I/O口,硬件开销大,电路复 杂。需要几个LED就必须占有几个并行口,比较适用于LED数量较少的场合。当然当L ED数量较多的时候,可以使用单片机的串行口通过移位寄存器的方式加以解决,但程 序编写比较麻烦。 LED动态显示硬件连接简单,但动态扫描的显示方式需要占有CPU较多的时间,在 单片机没有太多实时测控任务的情况下可以采用。 本系统需要采用6位LED数码管来分别显示时、分、秒,因数码管个数较多,故本 系统选择动态显示方式。 (三)硬件部分 1、STC89C51单片机介绍 STC89C51单片机是由深圳宏晶公司代理销售的一款MCU,是由美国设计生产的一 种低电压、高性能CMOS 8位单片机,片内含8kbytes的可反复写的FlashROM和128bytes的RAM,2个16位定时计 数器[5]。 STC89C51单片机内部主要包括累加器ACC(有时也简称为A)、程序状态字PSW、地 址指示器DPTR、只读存储器ROM、随机存取存储器RAM、寄存器、并行I/O接口P0~P3、 定时器/计数器、串行I/O接口以及定时控制逻辑电路等。这些部件通过内部总线联接 起来,构成一个完整的微型计算机。其管脚图如图所示。 STC89C51单片机管脚结构图 VCC:电源。 GND:接地。 P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第 一次写1时,被定义为高阻输入。P0能够用于外部程 序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。 P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电 流。P1口管脚写入1后,被内部上拉为高,可用作 输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编 程和校验时,P1口作为第八位地址接收。 P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电 流,当P2口被写"1"时,其管脚被内部上拉电阻 拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由 于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存 储器进行存取时,P2口输出地址的高八位。在给出地址"1"时,它利用内部上拉优势,当 对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器 的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值