当前位置:文档之家› 51单片机控制输出pwm信号控制舵机

51单片机控制输出pwm信号控制舵机

51单片机控制输出pwm信号控制舵机
51单片机控制输出pwm信号控制舵机

利用51单片机控制输出pwm信号控制舵机

# include

#define uchar unsigned char

#define uint unsigned int

void keyscan(void);

uint a,b,c,d;

/*a为舵机1的脉冲宽度,b为舵机2的脉冲宽度,单位1/1000 ms */ /*c、d为中间变量*/

/*以下定义输出管脚*/

sbit p12=P1^2;

sbit P13=P1^3;

sbit p16=P1^6;

sbit p15=P1^5;

sbit p17=P1^7;

void delay(void);

/*以下两个函数为定时器中断函数*/

/*定时器1,控制舵机1,输出引脚为P12,可自定义*/

void timer0(void) interrupt 1 using 1

{p12=!p12; /*输出取反*/

c=18432-c; /*20000代表20 ms,为一个周期的时间*/

TH0=-(c/256); TL0=-(c%256); /*重新定义计数初值*/

if(c>=470&&c=2300)c=a;

else c=18432-a; /*判断脉宽是否在正常范围之内*/

}

/*定时器2,控制舵机2,输出引脚为P13,可自定义*/

void timer1(void) interrupt 3 using 1

{P13=!P13;

d=18432-d;

TH1=-(d/256); TL1=-(d%256);

if(d>=470&&d=2304)d=b;

else d=18432-b;

}

/*主程序*/

void main(void)

{TMOD=0x11; /*设初值*/

p12=1;

P13=1;p17=1;

a=2000;

b=566; /*数值1500即对应1.5ms,为舵机的中间90度的位置*/

c=a;d=b;

TH0=-(a/256); TL0=-(a%256);

TH1=-(b/256); TL1=-(b%256); /*设定定时器初始计数值*/

EA=1;

ET0=1; TR0=1;EX0=1;EX1=1;

ET1=1; TR1=1;

PX0=0;PX1=0;PT1=1;PT0=1;/*设定中断优先级*/ for(;;)

{

keyscan();

}

}

/*在这个for循环中,可以根据程序需要

在任何时间改变a、b值来改变脉宽的输

出时间,从而控制舵机*/

void keyscan(void)

{

if(p16==0)

{

delay();

if(p16==0)

{

if(500=a&&a=2100)a+=50;

p17=!p17;

while(p16==0);

}

}

if(p15==0)

{

delay();

if(p15==0)

{

if(550=a&&a=2150)a-=30;

p17=!p17;

while(p15==0);

}

}

}

void delay (void)

{

uint uidata;

for(uidata=1;uidata=500;uidata++);

}

# include

#define uchar unsigned char

#define uint unsigned int

void keyscan(void);

uint a,b,c,d;

/*a为舵机1的脉冲宽度,b为舵机2的脉冲宽度,单位1/1000 ms */ /*c、d为中间变量*/

/*以下定义输出管脚*/

sbit p12=P1^2;

sbit P13=P1^3;

sbit p16=P1^6;

sbit p15=P1^5;

sbit p17=P1^7;

void delay(void);

/*以下两个函数为定时器中断函数*/

/*定时器1,控制舵机1,输出引脚为P12,可自定义*/

void timer0(void) interrupt 1 using 1

{p12=!p12; /*输出取反*/

c=18432-c; /*20000代表20 ms,为一个周期的时间*/

TH0=-(c/256); TL0=-(c%256); /*重新定义计数初值*/

if(c>=470&&c=2300)c=a;

else c=18432-a; /*判断脉宽是否在正常范围之内*/

}

/*定时器2,控制舵机2,输出引脚为P13,可自定义*/

void timer1(void) interrupt 3 using 1

{P13=!P13;

d=18432-d;

TH1=-(d/256); TL1=-(d%256);

if(d>=470&&d=2304)d=b;

else d=18432-b;

}

/*主程序*/

void main(void)

{TMOD=0x11; /*设初值*/

p12=1;

P13=1;p17=1;

a=2000;

b=566; /*数值1500即对应1.5ms,为舵机的中间90度的位置*/

c=a;d=b;

TH0=-(a/256); TL0=-(a%256);

TH1=-(b/256); TL1=-(b%256); /*设定定时器初始计数值*/

EA=1;

ET0=1; TR0=1;EX0=1;EX1=1;

ET1=1; TR1=1;

PX0=0;PX1=0;PT1=1;PT0=1;/*设定中断优先级*/

for(;;)

{

keyscan();

}

}

/*在这个for循环中,可以根据程序需要在任何时间改变a、b值来改变脉宽的输出时间,从而控制舵机*/

void keyscan(void)

{

if(p16==0)

{

delay();

if(p16==0)

{

if(500=a&&a=2100)a+=50;

p17=!p17;

while(p16==0);

}

}

if(p15==0)

{

delay();

if(p15==0)

{

if(550=a&&a=2150)a-=30;

p17=!p17;

while(p15==0);

}

}

}

void delay (void)

{

uint uidata;

for(uidata=1;uidata=500;uidata++);

}

51单片机超高精度6路舵机控制程序

51单片机超高精度6路舵机控制程序 #include //包含单片机寄存器的头文件 #define uchar unsigned char #define uint unsigned int P0M1=0X00; P0M0=0XFF;//设置P0 为强推挽输出 sbit servo0=P0^0; sbit servo1=P0^1; sbit servo2=P0^2; sbit servo3=P0^3; sbit servo4=P0^4; sbit servo5=P0^5; sbit servo6=P0^6; sbit servo7=P0^7; uchar serVal[2]; uint pwm[]={1382,1382,1382,1382,1382,1382,1382,1382}; //初始90度,(实际是1382.4,取整得1382) uchar pwm_flag=0; uint code ms0_5Con=461; //0.5ms计数(实际是460.8,取整得461) uint code ms2_5Con=2304; //2.5ms计数 /******************************************************************** * 功能: 串口初始化,晶振11.0592,波特率9600,使能了串口中断 ***********************************************************************/ void Com_Init() { TMOD |= 0x20; //用定时器设置串口波特率 TH1=0xFD; //256-11059200/(32*12*9600)=253 (FD) TL1=0xFD;//同上 TR1=1;//定时器1开关打开 REN=1; //开启允许串行接收位 SM0=0;//串口方式,8位数据 SM1=1;//同上 EA=1; //开启总中断 ES=1; //串行口中断允许位 } /******************************************************************** * 功能: 舵机PWM中断初始化 ***********************************************************************/ void Timer0Init()

脉冲控制器

科信学院 课程设计说明书(2012 /2013学年第二学期) 课程名称:《单片机应用》课程设计 题目:脉冲控制器 专业班级:电气2班 学生姓名:赵永章 学号:100062223 指导教师:段广玉王静爽韩昱 设计周数:两周 设计成绩: 2013年07月11日

目录 1. 课程设计目的................................................................................................32. 课程设计内容及设计过程说明...........................................................................32.1功能介绍................................................................................................32.2.1电路原理..........................................................................................32.2.2protel原理图....................................................................................42.2.3各功能模块电路设计...........................................................................52.2.3.1LED和蜂鸣器模块.....................................................................52.2.3.2硬件复位模块和晶振模块............................................................52.2.3.3段码输出和共阴极数码管模块......................................................62.2.4 PCB图.............................................................................................72.2.5 共阴极数码管显示码对照表..................................................................72.3元件清单................................................................................................82.4实际电路板成品图....................................................................................92.5程序流程图 (10) 2.6汇编程序 (11) 2.6.1程序源代码 (11) 2.6.2代码分析 (13) 3. 课程设计结论 (13) 4. 参考文献 (14) 1、课程设计目的

51红外循迹小车报告(舵机版)最终版

简易教程

前言 往届全国大学生电子设计竞赛曾多次出现了集光、机、电于一体的简易智能小车题目,此次,笔者在通过多次论证、比较与实验之后,制作出了简易小车的寻迹电路系统。 整个系统基于普通玩具小车的机械结构,利用小车的底盘、前后轮电机及其自动复原装置,能够平稳跟踪路面黑色轨迹运行。系统分为检测、控制、驱动三个模块。首先利用光电对接收管和路面信号进行检测,然后经过比较器处理,对软件控制模块进行实时控制,输出相应的信号给驱动芯片驱动电机转动,从而控制整个小车的运动。 智能小车能在画有黑线的白纸“路面”上行驶,这是由于黑线和白纸对光线的反射系数不同,小车可根据接收到的反射光的强弱来判断“道路”---黑线,最终实现简单的循迹运动。 个人水平有限,有错误不足之处,还望各位前辈同学多多包含,指出修正,完善。谢谢! 李学云王维 2016年7月27号

目录 前言 (1) 第一部分硬件设计 (1) 1.1 车模选择 (1) 1.2传感器选择 (1) 1.3 控制模块选择 (2) 第二部分软件设计及调试 (3) 2.1 开发环境 (3) 2.2总体框架 (3) 2.3 舵机程序设计与调试 (3) 2.3.1 程序设计 (3) 2.3.2 调试 (3) 2.3.3 程序代码 (4) 2.4 传感器调试 (5) 2.4.1 传感器好坏的检测 (5) 2.4.2 单片机能否识别信号并输出信号 (5) 2.5 综合调试 (7) 附录1 (9) 第一篇舵机(舵机及转向控制原理) (9) 1.1概述 (9) 1.2舵机的组成 (10) 1.3舵机工作原理 (11) 1.4舵机使用中应注意的事项 (12) 1.5如何利用程序实现转向 (12) 1.6舵机测试程序 (13) 附录2 (14) 第二篇光电红外传感器 (14) 2.1传感器的原理 (14) 2.2红外光电传感器ST188 结构图 (15) 2.3传感器的选择 (15) 2.4传感器的安装 (16) 2.5使用方法 (16) 2.7红外传感器输入输出调试程序 (17)

基于单片机的温度控制器设计

技术参数和设计任务:1、利用单片机AT89S51实现对温度物理量的控制,以实现对温度控制的目的;2、为达到电源输出5V电压目标,完成电源电路的设计;3、为达到数码管显示目标,完成显示电路的设计;4、为达到键盘控制的目标,完成键盘电路的设计;5、为达到检测温度的目标,完成检测电路的设计;6、完成报警设计;7、进行软件设计[分配系统资源,编写系统初始化和主程序模块;编写数字调节器软件模块;编写A/D转换器处理程序模块;编写输出控制程序模块;其它程序模块(数字滤波、显示与键盘等处理程)等等。一、本课程设计系统概述1、系统原理温度传感器 DS18B20 从设备环境的不同位置采集温度,单片机 AT89S51 获取采集的温度值,经处理后得到当前环境中一个比较稳定的温度值,再根据当前设定的温度上下限值,通过加热和降温对当前温度进行调整。当采集的温度经处理后超过设定温度的上限时,单片机通过三极管驱动继电器开启降温设备 (压缩制冷器) ,当采集的温度经处理后低于设定温度的下时 , 单片机通过三极管驱动继电器开启升温设备 (加热器) 。当由于环境温度变化太剧烈或由于加热或降温设备出现故障,或者温度传感头出现故障导致在一段时间内不能将环境温度调整到规定的温度限内的时候,单片机通过三极管驱动扬声器发出警笛声。系统中将通过串口通讯连接PC机存储温度变化时的历史数据,以便观察整个温度的控制过程及监控温度的变化全过程。2、系统结构图本设计以AT89S51单片机为主控核心设计的一个温度控制系统,低温时可控制加热设备,高温时控制风扇,超出设定最高温度值时蜂鸣器发出声响报警。 图1 总体硬件方框图 3、文字说明控制方案(1)温度测量部分方案 DS18B20是DALLAS公司生产的一线式数字温度传感器,它具有微型化、低功耗、高性能抗干扰能力、强易配处理器等优点,特别适合用于构成多点温度测控系统,可直接将温度

基于51单片机的USB键盘设计与实现

三江学院 本科生毕业设计(论文)题目基于51单片机的USB键盘设计与实现高职院院(系)电气工程及其自动化专业 学生姓名梁邱一学号 G105071013 指导教师孙传峰职称讲师 指导教师工作单位三江学院 起讫日期 2013年12月10日至2014年4月12日

摘要 随着计算机技术的不断更新和多媒体技术的快速发展,传统的计算机外设接口因为存在许多缺点已经不能适应计算机的发展需要。比起传统的AT,PS/2,串口,通用串行总线USB,具有速度快,使用方便灵活,易于扩展,支持即插即用,成本低廉等一系列优点,得到了广泛的应用。 本论文阐述了51系列单片机和USB的相关内容,详细介绍了系统的一些功能设计,包括硬件设计和软件设计。在程序调试期间用简单的串口通信电路,通过串口调试助手掌握了USB指令的传输过程,这对整个方案的设计起到了很大的指导作用。论文以单片机最小系统配合模拟键盘组成的USB键盘硬件系统,通过对D12芯片的学习与探索,在其基本命令接口的支持下,结合硬件进行相应的固件程序设计,使其在USB协议下,实现USB模块与PC的数据通信,完成USB键盘的功能模拟。 总结论文研究工作有阐述USB总线的原理、对本设计的系统要求作出了分析、根据要求选定元件和具体编程方案、针对系统所要实现的功能对相关芯片作了详细介绍以及在硬件部分设计了原理图。 关键词:USB;D12;PC

Abstract With the rapid development of computer technology and multimedia technology constantly updated, traditional computer peripheral interface because there are many shortcomings have been unable to meet the development needs of the https://www.doczj.com/doc/ec12997438.html,pared to traditional AT, PS / 2, serial, Universal Serial Bus USB, with fast, flexible and easy to use, easy to expand, support Plug and Play, a series of advantages, such as low cost, has been widely used. This paper describes the 51 series and USB related content, detailing some of the features of the system design, including hardware and software design.During debugging a simple serial communication circuit, through the serial port debugging assistant master USB transfer instructions, which designed the entire program has played a significant role in guiding.Thesis smallest single-chip system consisting of analog keyboard with a USB keyboard hardware system, by learning and exploration D12 chips, with the support of its basic command interface, in conjunction with the corresponding hardware firmware design, making it in the USB protocol, USB module data communication with the PC, the USB keyboard to complete the functional simulation. This paper summarizes research work has elaborated the principle of the USB bus, the system is designed to require the analysis, components and solutions based on the specific requirements of the selected programming for the system to achieve the function of the relevant chips are described in detail in the hardware part of the design as well as the principle of Figure. Keywords:USB;D12;PC

51单片机程序:按键控制舵机角度

#include "reg52.h" unsigned char count; //0.5ms次数标识 sbit pwm =P2^7 ; //PWM信号输出 sbit jia =P2^4; //角度增加按键检测IO口 sbit jan =P2^5; //角度减少按键检测IO口 unsigned char jd=5; //角度标识 void delay(unsigned char i)//延时 { unsigned char j,k; for(j=i;j>0;j--) for(k=125;k>0;k--); } void Time0_Init() //定时器初始化 { TMOD = 0x01; //定时器0工作在方式1 IE = 0x82; TH0 = 0xfe; TL0 = 0x33; //11.0592MZ晶振,0.5ms TR0=1; //定时器开始 } void Time0_Int() interrupt 1 //中断程序 { TH0 = 0xfe; //重新赋值 TL0 = 0x33; if(count< jd) //判断0.5ms次数是否小于角度标识 pwm=1; //确实小于,PWM输出高电平 else pwm=0; //大于则输出低电平 count=(count+1); //0.5ms次数加1 count=count%40; //次数始终保持为40 即保持周期为20ms } void keyscan() //按键扫描 { if(jia==0) //角度增加按键是否按下 { delay(10); //按下延时,消抖 if(jia==0) //确实按下 { jd++; //角度标识加1 count=0; //按键按下则20ms周期从新开始 if(jd==6) jd=5; //已经是180度,则保持 while(jia==0); //等待按键放开

单片机课程设计外部脉冲计数器

目录 摘要:单片机是一种集成在电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能集成到一块硅片上构成的一个小而完善的计算机系统。本课程设计的指导思想是控制单片机实现从0到99的计数功能,其结果显示在两位一体的共阳极数码管上。 关键词:脉冲计数器数码管单片机 本设计基于单片机技术原理,以单片机芯片STC89C52作为核心控制器,通过硬件电路的制作以及软件程序的编制,设计制作出一个计数器,包括以下功能:输出脉冲,按下键就开始计数,并将数值显示在两位一体的共阳极数码管上。 1课题原理 PCB板上设置开始计数按键和清零按键,以上按键与89C52单片机的P1口连接,通过查询按键是否被按下来判断进行计数或者清零。若按下计数健,则单片机控制两位一体的共阳极数码管显示从00开始的数字,按下一次,则数字加一,一次类推;若按下清零键,则程序返回程序开始处,并且数码管显示00。

2 硬件及软件设计 2.1 硬件系统 2.1.1 硬件系统设计 此设计是在单片机最小系统的基础上进行开发和拓展,增加了按键电路和和数码管显示电路,由于单片机输出电流不足以驱动数码管发光,所以数码管需要驱动电路。我们采用了三极管对数码管电流进行放大,使电流大小达到要求值。 2.1.2 单元电路设计 基本框架如下图2.1 2.1基本框架

1.STC89C52芯片 STC89C52RC芯片包括: 8k字节 Flash,512字节RAM, 32位I/O口 线,看门狗定时器,两个数据指针, 三个16位定时器/计数器,一个6向 量2级中断结构,全双工串行口,片 内晶振及时钟电路。STC89C52RC芯片 可降至0Hz静态逻辑操作,时钟频率 0-80MHz,支持2种软件可选择节电 模式。空闲模式下,CPU停止工作, 允许RAM、定时器/计数器、串口、中 断继续工作。掉电保护方式下,RAM 内容被保存,振荡器被冻结,单片 机一切工作停止,直到下一个中断或 硬件复位为止。8位微控制器8K字节 在系统可编程。芯片如图2.4所示。 图2.4 STC89C52芯片 2.按键电路 K1键为启动键,K2键为清零键,K3键为计数键,通过按钮的连接,实现开始、计数清零功能,连接电路如图2.5所示。 图2.5 按键电路

基于单片机的风扇控制器设计

基于单片机的风扇控制器设计 序言 自然风是指自然界里的天然阵风,风量时大时小,给人以舒适感觉。在生活中,我们可以感受自然风给我们带来的清爽,也可以享受空调带来的阵阵凉意。 风扇虽然在一定程度上给人们的生活带来了便捷,而电风扇的风量则不同,它是固定不变的,虽然配以摇头装置,仍不能达到自然风的效果。长时间吹固定不变的风量,不但会感到不舒服,而且对人的健康也不利,随着变频空调的发明,我们设想能否设计一种风扇,其工作效果可以象变频空调一样,象自然风一样,来解决经济条件还没有能接受空调或在一些不适合使用空调的地方的人们生活矛盾。 解决的方法是给电风扇安装一个摸拟自然风控制器,有了它可使电风扇发出变化的风量,好像自然界里的天然阵风,这种模拟自然风对老人和小孩尤为适宜,同时设计的风扇具备多档定时功能,也使其适合夜间睡眠使用。 该设计控制器期望能达到长期可靠运行,风扇速度可调节并不少于8档,能实现定时关机。风扇能模拟自然风,其转速能由快到慢,再由慢到快反复循环。 在本次设计,制作,调试过程中得到了李月红老师的大力支持,指导和帮助。特此表示感谢! ××××× 2007.5.28

第1章智能化风扇控制器硬件设计 1.1智能化风扇控制器系统设计方案及简介 方案一:采用数字电路控制。其原理方框图如图1-1所示。采用数字集成电路通过对脉冲振荡器的调节和脉冲计数实现定时关机。电路可由可控式振荡器、脉冲计数与分频器、脉冲译码与分配器与晶闸管触发电路。但是不能随意控制档速,而且硬件的连接有些复杂。不够实用。 图1-1数字电路控制方案 方案二:采用单片机控制。利用单片机丰富的I/O端口,及其控制的灵活性,采用数模转换实现基本的调速功能、还有时钟显示功能。其原理如图1-2所示。 通过比较以上两种方案,单片机有较大的活动空间,既能实现所要求的功能,又能在很大的程度上扩展功能,而且可以方便的对系统进行升级,所以我们采用后一种方案[1]。

51单片机控制舵机程序演讲稿.doc

#include #define Stop 0 //宏定义,停止 #define Left 1 //宏定义,左转 #define Right 2 //宏定义,右转 sbit ControlPort = P2^0; //舵机信号端口 sbit KeyLeft = P1^0; //左转按键端口 sbit KeyRight = P1^1; //右转按键端口 sbit KeyStop = P1^2; //归位按键端口 unsigned char TimeOutCounter = 0,LeftOrRight = 0; //TimeOutCounter:定时器溢出计数LeftOrRight:舵机左右旋转标志 void InitialTimer ( void ) { TMOD=0x10; //定时/计数器1工作于方式1 TH1 = ( 65535 - 500 ) / 256; //0.25ms TL1 = ( 65535 - 500 ) % 256; EA=1; //开总中断 ET1=1; //允许定时/计数器1 中断 TR1=1; //启动定时/计数器1 中断 } void ControlLeftOrRight ( void ) //控制舵机函数 { if( KeyStop == 0 ) { //while ( !KeyStop ); //使标志等于Stop(0),在中断函数中将用到 LeftOrRight = Stop; } if( KeyLeft == 0 ) { //while ( !KeyLeft ); //使标志等于Left(1),在中断函数中将用到 LeftOrRight = Left; } if( KeyRight == 0 ) { //while ( !KeyRight ); //使标志等于Right(2),在中断函数中将用到 LeftOrRight = Right; }

舵机控制程序

在机器人机电控制系统中,舵机控制效果是性能的重要影响因素。舵机可以在微机电系统和航模中作为基本的输出执行机构,其简单的控制和输出使得单片机系统非常容易与之接口。 舵机是一种位置伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。其工作原理是:控制信号由接收机的通道进入信号调制芯片,

获得直流偏置电压。它内部有一个基准电路,产生周期为20ms,宽度为1.5ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。最后,电压差的正负输出到电机驱动芯片决定电机的正反转。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。舵机的控制信号是PWM信号,利用占

空比的变化改变舵机的位置。一般舵机的控制要求如图1所示。 图1 舵机的控制要求 单片机实现舵机转角控制可以使用FPGA、模拟电路、单片机来产生舵机的控制信号,但FPGA成本高且电路复杂。对于脉宽调制信号的脉宽变换,常用的一种方法是采用调制信号获取有源滤波后的直流电压,但是需要50Hz(周期是20ms)的信号,这对运放 器件的选择有较高要求,从电路体积和功耗考虑也不易采用。5mV 以上的控制电压的变化就会引起舵机的抖动,对于机载的测控系统而言,电源和其他器件的信号噪声都远大于5mV,所以滤波

电路的精度难以达到舵机的控制精度要求。 也可以用单片机作为舵机的控制单元,使PWM信号的脉冲宽度实现微秒级的变化,从而提高舵机的转角精度。单片机完成控制算法,再将计算结果转化为PWM信号输出到舵机,由于单片机系统是一个数字系统,其控制信号的变化完全依靠硬件计数,所以受外界干扰较小,整个系统工作可靠。 单片机系统实现对舵机输出转角的控制,必须首先完成两个任务:首先是产生基本的PWM周期信号,本设计是产生20ms的周期信号;其次是脉宽的调整,即单片机模拟PWM信号的输出,并且调整占空比。当系统中只需要实现一个舵机的控制,采用的控制方式是改变单片机的一个定时器中断的初值,将20ms分为两次中断执行,一次短定时中断和一次长定时中断。这样既节省了硬件电路,也减少了软件开销,控制系统工作效率和控制精度都很高。 具体的设计过程: 例如想让舵机转向左极限的角度,它的正脉冲为2ms,则负脉冲为 20ms-2ms=18ms,所以开始时在控制口发送高电平,然后设置定时器在

51单片机按键控制数码管程序

#define uint unsigned int #define uchar unsigned char uchar c; sbit p10=P1^0; sbit p11=P1^1; sbit p12=P1^2; sbit p13=P1^3; sbit p14=P1^4; sbit p15=P1^5; sbit p16=P1^6; sbit p17=P1^7; void delay(uint z); int b[]={0,1,2,3,4,5,6,7};//设置每一位显示的数字 unsigned char code Tab[]={0xc0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8, 0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};//共阳极数码管 int a[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; void main() { EA=1; EX0=1; IT0=1; P1=0xff; while(1) { for(c=0;c<8;c++)//数码管扫描显示

P2=a[c]; P0=Tab[b[c]]; delay (1); } } } void delay(uint z) { uint a,b; for(a=z;a>0;a--) for(b=110;b>0;b--); } int_0()interrupt 0 { EA=0; if(p10==0) b[0]=(b[0]+1)%10; if(p11==0) b[1]=(b[1]+1)%10; if(p12==0) b[2]=(b[2]+1)%10; if(p13==0) b[3]=(b[3]+1)%10; if(p14==0) b[4]=(b[4]+1)%10; if(p15==0) b[5]=(b[5]+1)%10; if(p16==0) b[6]=(b[6]+1)%10; if(p17==0) b[7]=(b[7]+1)%10;

51单片机控制舵机程序精度,数量,占用时间优化方案及程序

#include #include //本程序经软仿真调试在机器周期为1us时理论误差为0,不需要占用太多的cpu运行时间就可以控制8路舵机,精度为1ms-2ms 平均分成100份,在时间消耗和舵机数量上 //明显优于网上常见的舵机控制程序,keil3使用9(最高)编译器优化时达到理论误差为0,编译器优化级别过低时无法使用unsigned char gai; unsigned char nt[8]; unsigned char nw[8]; unsigned char pwmbuffer[8] = {50,50,50,50,50,50,50,50}; void set(unsigned char m,unsigned char n){ if((m<8)&&(n<101)){ //如果输入合法则记录新数据并将状态改变标志置位pwmbuffer[m] = n; gai = 1; } } void tim(void){ unsigned char a1,a2,tempt,tempw; //a1,a2作为循环变量,tempt,tempw作为排序交换用临时变量 for(a1 = 0; a1 < 8; a1++){ //由舵机控制数据设置用于排序的表(两行八列)nt[a1] = pwmbuffer[a1]; //第几个舵机所需的高电平时长 nw[a1] = 1 << a1; //用第几位置一来表示第几个舵机 } for(a1 = 0; a1 < 7; a1++){ //简单排序算法,找出最小的与第一个交换,在从剩余的中找出最小的与第二个交换,以此类推 unsigned char min = a1; //用于记录哪一个是最小的 for(a2 = a1 + 1; a2 < 8; a2++){ //从剩余项中找出最小的 if(nt[a2] < nt[min]){ min = a2; } } tempt = nt[a1]; //交换 tempw = nw[a1]; nt[a1] = nt[min]; nw[a1] = nw[min]; nt[min] = tempt; nw[min] = tempw; } for(a1 = 1; a1 < 8; a1++){ //之前记录应该变成低电平的输出口,之后记录应该是低电平的输出口nw[a1] |= nw[a1-1]; } a2 = 0; for(a1 = 0; a1 < 7; a1++){ //去掉重复 if(nt[a1] != nt[a1 + 1]){ nt[a2] = nt[a1]; nw[a2] = nw[a1]; a2++; } } nt[a2] = nt[7]; nw[a2] = nw[7]; for(a2++; a2 < 8; a2++){ nt[a2] = 0; nw[a2] = 0xFF;

51控制舵机程序大全

#include void InitTimer0(void) { TMOD = 0x01; TH0 = 0x0B1; TL0 = 0x0E0; EA = 1; ET0 = 1; TR0 = 1; }void delay(1)(void) { unsigned char a,b,c; for(c=1;c>0;c--) for(b=142;b>0;b--) for(a=2;a>0;a--); } void main(void) { InitTimer0(); P1_2=0; while(1); } void Timer0Interrupt(void) interrupt 1 { //20ms中断 TH0 = 0x0B1; TL0 = 0x0E0; P1_2=1; delay(1); P1_2=0; }

#include #include #include #define uchar unsigned char #define uint unsigned int sbit IN1=P0^0; sbit IN2=P0^1; sbit EA1=P0^5; sbitdj=P0^7; //舵机口 uint t=0;//中断次数 ucharzk;//高电平中断次数uchar p=0;//定义pwm占空比void delay(uint z) { uinti,j; for(i=0;i>8;//100us一次中断TL0=-100%256; if(t==0)zk=p; if(t=zk) dj=0; t++; if(t>=200) t=0;//20mspwm周期 } void turn_left() { IN1=1;IN2=0;EA1=1;//电机工作p=5;//0.5ms delay(600); } void turn_right() { IN1=1;IN2=0;EA1=1;//电机工作p=25;//2.5ms delay(600);

基于89C51单片机脉冲宽度的测量的设计

单片机原理与应用课程设计报告 院系:电气信息工程学院 班级: 08测控2班 学号: 08314237 姓名:董亮 合作者:虞波 指导教师:黄阳 2011年09月25日

目录 序言 (2) 一.设计内容与技术指标 (3) 1.1设计内容 (3) 1.2技术指标 (3) 二.工作原理及设计方案 2.1工作原理 (4) 2.2系统设计方案 (4) 2.2.1电路原理图 (5) 2.2.2硬件焊接图 (5) 2.2.3软件流程图 (7) 2.2.4程序清单 (8) 三.系统调试及结果分析 (14) 3.1硬件调试 (14) 3.2软件调试 (14) 3.3结果分析 (14) 四. 注意事项 (14) 五. 心得体会 (15) 六.参考文献 (16)

基于89C51单片机脉冲宽度的测量设计 序言: 近年来随着科技的飞速发展,单片机的应用正在不断地走向深入同时带动传统控制检测日新月益更新。单片机诞生30多年以来,其品种、功能和应用技术都得到飞速的发展,单片机的应用已深入国民经济和日常生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。导弹的导航装置,飞机上各种仪表的控制,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理等。 本次课程设计目的主要是培养学生综合运用所学的知识,完成一个单片机应用系统设计。主要任务是通过解决一些实际问题,巩固和加深课程中所学的理论知识和实验能力,基本掌握单片机应用电路的一般设计方法,提高电子电路的设计和实验能力。加深对单片机软件硬件知识的理解,获得初步的应用经验,为以后从事生产和科研工作打下一定的基础。 本系统采用单片机AT89C51为中心器件来设计脉冲宽度测量器,系统实用性强、操作简单、扩展性强。在现有的单片机仿真机系统上掌握相关软硬件设计与调试知识,根据所选择题目,焊接好硬件电路,正确进行元器件的测试与调试,并在计算机上编写汇编程序调试运行,并实现参考选题中要求的设计。

51单片机按键控制花样灯

51单片机按键控制花样灯 时间:2018-09-10 13:50:11 来源:51hei 作者: /**************************************************** * 本程序实现用按键控制花样灯。 * * 当K1按下时,灯从0xfe向左跑一遍; * * 当K2按下时,LED灯从0x7f向右跑一遍到了0xfe右跑回到起始位置; * * 当K3键按下时,LED灯从0xfe开始作流水灯形式运行一次,然后再流回来。 * * 当K4键按下时,LED灯先亮前四个,接着再转向亮后四个。 * * 当K5键按下时,结束任意正在进行的程序,使LED灯全部熄灭。 * ******************************************************/ ************************************************* 连接方法:P0接独立按键JP5。P2接LED灯接口JP1 * ***********************************************************/ #include //头文件,函数声明 #include //定义按键所在位 sbit K1=P0^0。 sbit K2=P0^1。 sbit K3=P0^2。 sbit K4=P0^3。 sbit K5=P0^4。 unsigned char led。 unsigned char j。 void delayms(unsigned char ms> // 1ms标准延时 { while(ms--> { for(j=0。j<110。j++>。 //还是无法设置比较标准的延时,如1S等;所以应该用定时器延时才最准确 } } void main(> { //P2=led。 unsigned int i。

【51单片机】控制8路舵机源程序

仿真截图: //仿真文件网盘地址:https://www.doczj.com/doc/ec12997438.html,/s/1ntLqf3N //程序: #include sbit PWM0 = P1^0; sbit PWM1 = P1^1; sbit PWM2 = P1^2; sbit PWM3 = P1^3; sbit PWM4 = P1^4; sbit PWM5 = P1^5; sbit PWM6 = P1^6; sbit PWM7 = P1^7; sbit ADD = P3^6; sbit SUB = P3^7; #define uchar unsigned char #define uint unsigned int uint t_up0 = 1500; //舵机PWM高电平时间1000~2000表示1ms到2ms uint t_up1 = 1500; uint t_up2 = 1500; uint t_up3 = 1500;

uint t_up4 = 1500; uint t_up5 = 1500; uint t_up6 = 1500; uint t_up7 = 1500; uint t0_h; uint t0_l; void delayms(uint ms) { unsigned char a,b,c; while(ms--) { for(c=1;c>0;c--) for(b=142;b>0;b--) for(a=2;a>0;a--); } } void timer_init() { EA = 1; ET0 = 1; PT0 = 1; TMOD = 0x11; TH0 = (65536 - t_up0)/256; TL0 = (65536 - t_up0)%256; } uchar t0_flag = 0; uint num_max = 65535; //直接用65535 - t_up 不用变量- t_up 时,误差较大,原因暂时不明【注:65536不能存到uint类型变量中】 uint t_change = 63036;//换路周期2.5ms 8路 uchar error0 = 45; uchar error1 = 45; uchar error2 = 52; uchar error3 = 52; uchar error4 = 57; uchar error5 = 57; uchar error6 = 63; uchar error7 = 63; uchar error8 = 70; uchar error9 = 70;

51单片机一个定时器控制多路舵机

#ifndef __interrupt0_H__ #define __interrupt0_H__ void interrupt0() //STM中断服务子程序 { _t2af = 0 ; switch (cnt) { case 0: PWMOUT_2 = PWMOUT_3 = PWMOUT_4 = PWMOUT_5 = PWMOUT_6 = 0; PWMOUTbuf_1 = (PWMbuf - PWMOUTbuf_1); _tm2al = PWMOUTbuf_1 & 0x00ff; _tm2ah = PWMOUTbuf_1 >>8 ; //重新定义计数初值 if( PWMOUTbuf_1 >= PWMOUTbufmin1 && PWMOUTbuf_1 <= PWMOUTbufmax1) {PWMOUTbuf_1 = PWMOUTcnt_1; PWMOUT_1 = 1;} else {PWMOUTbuf_1 = PWMbuf-PWMOUTcnt_1; PWMOUT_1 = 0 ; cnt = 1;} //判断脉宽是否在正常范围之内 break; case 1: PWMOUT_1 = PWMOUT_3 = PWMOUT_4 = PWMOUT_5 = PWMOUT_6 = 0; PWMOUTbuf_2 = (PWMbuf - PWMOUTbuf_2); _tm2al = PWMOUTbuf_2 & 0x00ff; //重新定义计数初值 _tm2ah = PWMOUTbuf_2 >> 8; if(PWMOUTbuf_2 >= PWMOUTbufmin1 && PWMOUTbuf_2 <= PWMOUTbufmax1) {PWMOUTbuf_2 = PWMOUTcnt_2; PWMOUT_2 = 1;} else {PWMOUTbuf_2 = PWMbuf-PWMOUTcnt_2;PWMOUT_2 = 0;cnt = 2;} //判断脉宽是否在正常范围之内 break; case 2: PWMOUT_1 = PWMOUT_2 = PWMOUT_4 = PWMOUT_5 = PWMOUT_6 = 0; PWMOUTbuf_3 = (PWMbuf - PWMOUTbuf_3); _tm2al = PWMOUTbuf_3 & 0x00ff; //重新定义计数初值 _tm2ah = PWMOUTbuf_3 >> 8; if(PWMOUTbuf_3 >= PWMOUTbufmin1 && PWMOUTbuf_3 <= PWMOUTbufmax1) {PWMOUTbuf_3 = PWMOUTcnt_3; PWMOUT_3 = 1;}

基于单片机控制的时钟控制器

单片机原理与应用技术课程设计报告 题目:基于单片机控制的时钟控制器 专业班级:电气工程及其自动化064班 时间:2009.2.16~2009.3.6 指导教师:__孔晓红邵锋_ 陈艳锋 _ 2009年3月6日

时钟控制器课程设计任务书 1.设计目的与要求 设计出一个时钟控制器。准确地理解有关要求,独立完成系统设计,要求所设计的电路具有以下功能: (1)显示:可以显示时、分和秒; (2)调时功能:时(0-24)、分和秒(0-60)可以连续可调; (3)扩展功能:增加整点报时功能,增加闹钟任意设定功能; 2.设计内容 (1)画出电路原理图,正确使用逻辑关系; (2)确定元器件及元件参数; (3)进行电路模拟仿真; (4)SCH文件生成与打印输出; 3.编写设计报告 写出设计的全过程,附上有关资料和图纸,有心得体会。 4.答辩 在规定时间内,完成叙述并回答问题。

目录 1.引言 (1) 2.总体设计方案 (1) 2.1 设计思路 (1) 2.2 总体设计框图及电路组成 (1) 3.设计原理分析 (2) 3.1蜂鸣报警电路 (2) 3.2显示电路 (2) 3.3时间调整电路 (3) 3.4系统软件 (3) 4.结束语 (5) 参考文献 (5) 附录1 (6) 附录 2 (7)

基于单片机控制的时钟控制器 电气064 梁成才 摘要:本设计多功能数字钟是以A T89S51单片机为核心控制器构成的电子时钟,数字电子钟是采用数字电路实现对“时”、“分”、“秒”数字显示的计时装置。由于数字集成电路的发展和石英振荡的广泛应用,使得数字钟的精度、稳定度远远超过了老式机械钟表。在数字显示方面目前已有集成的计数、译码电路,它可以直接驱动数码显示器件还可以直接采用CMOS-LED光点组合器件,构成模块式石英晶体数字钟。这些电路装置十分小巧,安装使用也方便。 关键词:A T89S51 数码管时钟74LS164 1引言 数字钟是采用数字电路实现对时,分,秒.数字显示的计时装置,广泛用于个人家庭,车站, 码头办公室等公共场所,成为人们日常生活中不可少的必需品,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表, 钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。因此,研究数字钟及扩大其应用,有着非常现实的意义。 2总体设计方案 2.1 设计思路 本电路采用89S51为核心的时钟控制电路,由于单片机简单可靠,便于用户使用,所以采用单片机控制时钟,其控制电路共有六部分组成,单片机是其核心部件,要完成整点报时需要报警电路。对当前的时间修改需要对按键的操作,所以还需要按键电路,单片机将其信号输出应该反映在显示电路中,应采用六位数码管构成的显示电路。电路中还应该具有复位电路。其设计思路有多种,其输出可以采用动态显示和静态显示两种方式,采用动态方式的电路比较复杂,采用静态方式输出可采用单片机串行口输出,电路相对较简单。该电路应该具有任意时间可调的功能,所以外围采用开关按键来实现。在软件设计方面,应完成时钟控制电路的各项要求整个系统工作时,秒信号产生器是整个系统的时基信号,它直接决定计时系统的精度,将标准秒信号送入“秒计数器”,“秒计数器”采用60进制计数器,每累计60秒发出一个“分脉冲”信号,该信号将作为“分计数器”的时钟脉冲。“分计数器”也采用60进制计数器,每累计60分钟,发出一个“时脉冲”信号,该信号将被送到“时计数器”。“时计数器”采用24进制计数器,可实现对一天24小时的累计。显示电路将“时”、“分”、“秒”计数器的输出,通过六个七段LED显示器显示出来。校时电路是直接加一个脉冲信号到时计数器或者分计数器或者秒计数器来对“时”、“分”、“秒”显示数字进行校对调整。 2.2总体设计框图及电路组成 时钟控制电路应该由六部分组成,单片机是其核心部件,要完成整点报时需要报警电路。对当前的时间修改需要对按键的操作,所以还需要按键电路,单片机将其信号输出应该反映在显示电路中,应采用六位数码管构成的显示电路。电路中还应该具有复位电路。整体设计框图

相关主题
文本预览
相关文档 最新文档