51单片机 PWM电位器控制舵机

/*-----------------------------------------------

名称:IIC 协议 PCF8591ADDA转换

内容:此程序通过IIC 协议对DAAD 芯片操作,读取电位器的电压,并输出模拟量,用LED 亮度渐变指示, 晶体选用12MHz

------------------------------------------------*/

#include"reg52.h"

#include //包含NOP 空指令函数_nop_();

#define AddWr 0x90 //写数据地址

#define AddRd 0x91 //读数据地址

sbit Sda=P1^2; //定义总线连接端口

sbit Scl=P1^1;

sbit control_signal=P1^5;

data unsigned int Display[8];//定义临时存放数码管数值

unsigned char code Datatab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//7段数共阴码管段码表

unsigned int ADtemp; //定义全局变量

unsigned int high,low;

static unsigned int count1;

/*------------------------------------------------

延时程序

------------------------------------------------*/

void mDelay(unsigned char j)

{

unsigned int i;

for(;j>0;j--)

{

for(i=0;i

{;}

}

}

/*------------------------------------------------

初始化定时器0

------------------------------------------------*/

void Init_Timer0(void)

{

TMOD |=0x01; //定时器设置 0.1ms in 11.0592M crystal

TH0=(65536-78)/256;

TL0=(65536-78)%256; //定时0.1mS

ET0=1;//定时器中断打开

EA=1;//总中断

TR0=1; //启动定时器0

}

/*------------------------------------------------

启动IIC 总线

------------------------------------------------*/

void Start(void)

Sda=1;

_nop_();

Scl=1;

_nop_();

Sda=0;

_nop_();

Scl=0;

}

/*------------------------------------------------

停止IIC 总线

------------------------------------------------*/

void Stop(void)

{

Sda=0;

_nop_();

Scl=1;

_nop_();

Sda=1;

_nop_();

Scl=0;

}

/*------------------------------------------------

应答IIC 总线

------------------------------------------------*/

void Ack(void)

{

Sda=0;

_nop_();

Scl=1;

_nop_();

Scl=0;

_nop_();

}

/*------------------------------------------------

非应答IIC 总线

------------------------------------------------*/

void NoAck(void)

{

Sda=1;

_nop_();

Scl=1;

_nop_();

Scl=0;

_nop_();

}

/*------------------------------------------------

发送一个字节

------------------------------------------------*/

void Send(unsigned char Data)

{

unsigned char BitCounter=8;

unsigned char temp;

do

{

temp=Data;

Scl=0;

_nop_();

if((temp&0x80)==0x80)

Sda=1;

else

Sda=0;

Scl=1;

temp=Data

Data=temp;

BitCounter--;

}

while(BitCounter);

Scl=0;

}

/*------------------------------------------------

读入一个字节并返回

------------------------------------------------*/

unsigned char Read(void)

{

unsigned char temp=0;

unsigned char temp1=0;

unsigned char BitCounter=8;

Sda=1;

do

{

Scl=0;

_nop_();

Scl=1;

_nop_();

if(Sda)

temp=temp|0x01;

else

temp=temp&0xfe;

if(BitCounter-1)

{

temp1=temp

temp=temp1;

}

BitCounter--;

}

while(BitCounter);

return(temp);

}

/*------------------------------------------------

读取AD 模数转换的值,有返回值

------------------------------------------------*/

unsigned int ReadADC(unsigned char Chl)

{

unsigned int Data;

Start(); //启始信号

Send(AddWr);//0x90

Ack();

Send(0x40|Chl);//写入选择的通道,本程序只用单端输入,差分部分需要自行添加 //Chl的值分别为0、1、2、3,分别代表1-4通道

Ack();

Start();

Send(AddRd); //读入地址

Ack();

Data=Read(); //读数据

Scl=0;

NoAck();

Stop();

return Data; //返回值

}

/******************************************************************/

/* 主程序 */

/******************************************************************/

void main()

{

Init_Timer0();

while(1)

{

unsigned int angle;

ADtemp=ReadADC(0); //ADtemp的取值范围是0-255,定时的时间范围是0.5-2.5ms high=65075-7.2*ADtemp; //

( high=65035-7.8*ADtemp;12MHz)(65535-(460+7.2*ADtemp 11.0592MHz)

low=47563+7.2*ADtemp; // ( low=46035+7.8*ADtemp; )

( 65535-(17972-7.2*ADtemp 11.0592MHz )

angle=ADtemp*0.7;

Display[0]=Datatab[angle/100];//处理0通道电压显示

Display[1]=Datatab[(angle%100)/10];

Display[2]=Datatab[angle%10];

while(1)

{

P0=Display[count1];//用于动态扫描数码管

P2=count1;

mDelay(1);

count1++;

if(count1==3) //表示扫描8个数码管

{

count1=0;

break;

}

}

}

}

/******************************************************************/

/* 定时器中断函数, 需要更改

/******************************************************************/

void tim(void) interrupt 1 using 1

{

static unsigned char count;

if (!count)

{

control_signal = 1; //给高电平

TH0=high/256;

TL0=high%256; //定时0.05mS, 经过示波器的测量

}

else

{

control_signal=0 ;

TH0=low/256;

TL0=low%256; //定时0.05mS, 经过示波器的测量

}

count=~count;

}

/*-----------------------------------------------

名称:IIC 协议 PCF8591ADDA转换

内容:此程序通过IIC 协议对DAAD 芯片操作,读取电位器的电压,并输出模拟量,用LED 亮度渐变指示, 晶体选用12MHz

------------------------------------------------*/

#include"reg52.h"

#include //包含NOP 空指令函数_nop_();

#define AddWr 0x90 //写数据地址

#define AddRd 0x91 //读数据地址

sbit Sda=P1^2; //定义总线连接端口

sbit Scl=P1^1;

sbit control_signal=P1^5;

data unsigned int Display[8];//定义临时存放数码管数值

unsigned char code Datatab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//7段数共阴码管段码表

unsigned int ADtemp; //定义全局变量

unsigned int high,low;

static unsigned int count1;

/*------------------------------------------------

延时程序

------------------------------------------------*/

void mDelay(unsigned char j)

{

unsigned int i;

for(;j>0;j--)

{

for(i=0;i

{;}

}

}

/*------------------------------------------------

初始化定时器0

------------------------------------------------*/

void Init_Timer0(void)

{

TMOD |=0x01; //定时器设置 0.1ms in 11.0592M crystal

TH0=(65536-78)/256;

TL0=(65536-78)%256; //定时0.1mS

ET0=1;//定时器中断打开

EA=1;//总中断

TR0=1; //启动定时器0

}

/*------------------------------------------------

启动IIC 总线

------------------------------------------------*/

void Start(void)

Sda=1;

_nop_();

Scl=1;

_nop_();

Sda=0;

_nop_();

Scl=0;

}

/*------------------------------------------------

停止IIC 总线

------------------------------------------------*/

void Stop(void)

{

Sda=0;

_nop_();

Scl=1;

_nop_();

Sda=1;

_nop_();

Scl=0;

}

/*------------------------------------------------

应答IIC 总线

------------------------------------------------*/

void Ack(void)

{

Sda=0;

_nop_();

Scl=1;

_nop_();

Scl=0;

_nop_();

}

/*------------------------------------------------

非应答IIC 总线

------------------------------------------------*/

void NoAck(void)

{

Sda=1;

_nop_();

Scl=1;

_nop_();

Scl=0;

_nop_();

}

/*------------------------------------------------

发送一个字节

------------------------------------------------*/

void Send(unsigned char Data)

{

unsigned char BitCounter=8;

unsigned char temp;

do

{

temp=Data;

Scl=0;

_nop_();

if((temp&0x80)==0x80)

Sda=1;

else

Sda=0;

Scl=1;

temp=Data

Data=temp;

BitCounter--;

}

while(BitCounter);

Scl=0;

}

/*------------------------------------------------

读入一个字节并返回

------------------------------------------------*/

unsigned char Read(void)

{

unsigned char temp=0;

unsigned char temp1=0;

unsigned char BitCounter=8;

Sda=1;

do

{

Scl=0;

_nop_();

Scl=1;

_nop_();

if(Sda)

temp=temp|0x01;

else

temp=temp&0xfe;

if(BitCounter-1)

{

temp1=temp

temp=temp1;

}

BitCounter--;

}

while(BitCounter);

return(temp);

}

/*------------------------------------------------

读取AD 模数转换的值,有返回值

------------------------------------------------*/

unsigned int ReadADC(unsigned char Chl)

{

unsigned int Data;

Start(); //启始信号

Send(AddWr);//0x90

Ack();

Send(0x40|Chl);//写入选择的通道,本程序只用单端输入,差分部分需要自行添加 //Chl的值分别为0、1、2、3,分别代表1-4通道

Ack();

Start();

Send(AddRd); //读入地址

Ack();

Data=Read(); //读数据

Scl=0;

NoAck();

Stop();

return Data; //返回值

}

/******************************************************************/

/* 主程序 */

/******************************************************************/

void main()

{

Init_Timer0();

while(1)

{

unsigned int angle;

ADtemp=ReadADC(0); //ADtemp的取值范围是0-255,定时的时间范围是0.5-2.5ms high=65075-7.2*ADtemp; //

( high=65035-7.8*ADtemp;12MHz)(65535-(460+7.2*ADtemp 11.0592MHz)

low=47563+7.2*ADtemp; // ( low=46035+7.8*ADtemp; )

( 65535-(17972-7.2*ADtemp 11.0592MHz )

angle=ADtemp*0.7;

Display[0]=Datatab[angle/100];//处理0通道电压显示

Display[1]=Datatab[(angle%100)/10];

Display[2]=Datatab[angle%10];

while(1)

{

P0=Display[count1];//用于动态扫描数码管

P2=count1;

mDelay(1);

count1++;

if(count1==3) //表示扫描8个数码管

{

count1=0;

break;

}

}

}

}

/******************************************************************/

/* 定时器中断函数, 需要更改

/******************************************************************/

void tim(void) interrupt 1 using 1

{

static unsigned char count;

if (!count)

{

control_signal = 1; //给高电平

TH0=high/256;

TL0=high%256; //定时0.05mS, 经过示波器的测量

}

else

{

control_signal=0 ;

TH0=low/256;

TL0=low%256; //定时0.05mS, 经过示波器的测量

}

count=~count;

}


相关文章

  • 多路舵机控制器设计
  • 基于AT89C2051的多路舵机控制器设计 摘要 舵机是机器人.机电系统和航模的重要执行机构.舵机控制器为舵机提供必要的能源和控制信号.本文提出一种以外部中断计数为基础的PWM 波形实现方法.该方法具有简单方便,成本低,可实现多路独立PWM ...查看


  • 舵机驱动原理
  • 舵机驱动原理 1.舵机简介 2.舵机的组成 3.舵机工作原理 4.舵机选购 5.舵机控制原理及编程方法 6.实验室用舵机Futaba S3003使用说明 7.程序举例 1 概述 舵机也叫伺服电机,最早用于船舶上实现其转向功能,由于可以通过程 ...查看


  • 光电循迹小车使用手册
  • 光电循迹小车使用手册 1. 仿真软件介绍 在做实物之前,可以用仿真软件plastid进行在线仿真.这样不仅可以加快设计进度,同时可以减少实际电路的调试,减少出错,节约成本. Plastid是为"飞思卡尔"杯全国大学生智能 ...查看


  • 机器人舵机说明
  • 机器人舵机说明 一.舵机简介 舵机,顾名思义,大海航行靠舵手,舵机早期是应用在航模中控制方向的,在航空模型中,飞行器的飞行姿态是通过调整发动机和各个控制多面来实现的,后来有人发现这种机器的体积小.重量轻.扭矩大.精度高,由于具备了这样的优点 ...查看


  • 飞思卡尔-智能车入门
  • 从外观上看,智能车系统主要表现为由一系列的硬件组成,包括组成车体的底盘.轮胎.舵机装置.马达装置.道路检测装置.测速装置和控制电路板等.硬件是智能车系统的基础,没有一个好的硬件平台,智能车就无法运行.而软件部分则是整个智能车系统的灵魂,软件 ...查看


  • 舵机简介及其单片机控制方法
  • 舵机简介及其单片机控制方法(转贴) 由于rocky 于Sun May 18, 2003 12:59 pm 向本人提出希望了解有关舵机的知识,现将本人在航空模型运动中和机器人制作中积累的一点点经验写出来,奉献给大家,希望本文能起到抛砖引玉的作 ...查看


  • 智能车中的舵机入门
  • 单片机控制舵机 修改浏览权限 | 删除 . 什么是舵机: 舵机如下所示: 有三根线,一般依次是地,电源(5V 左右),信号(信号的幅值>=3.3V),不清 楚各个脚打开舵机一测量就知道了. 2. 其工作原理是: 控制信号由接收机的通道 ...查看


  • 基于激光传感器的智能车循迹系统
  • 装 订 线 河北大学工商学院 本科生毕业论文(设计) 题目: 学 部 信息科学与工程学部 学科门类 工学 专 业 电气工程及自动化 学 号 姓 名 指导教师 2013年5月16日 基于激光传感器的智能车循迹系统 摘 要 智能汽车是未来汽车发 ...查看


  • 机器人小车
  • 浙江大学第十二届"中控杯"机器人竞赛 技术报告 一.方案总述 我们通过红外传感器计算距离,当小车前端并排三个红外线传感器中的左右红外线传感器同时接收到反射回来的信号的时,记作移动一格,同时通过前后总共四个传感器使小车在白 ...查看


热门内容