历史上的今天

今天是:2024年10月28日(星期一)

正在发生

2019年10月28日 | 51单片机PCF8591 AD DA转换电位器控制舵机旋转的源程序

发布者:不染尘埃 来源: 51hei关键字:51单片机  PCF8591  DA转换  控制舵机 手机看文章 扫描二维码
随时随地手机看文章

这里用到PCF8591  AD DA芯片    和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<125;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<<1;
  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<<1;
   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)     //表示扫描3个数码管
   {
       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;        }
else
{
   control_signal=0 ;
      TH0=low/256; 
      TL0=low%256;     
}
count=~count;
}

关键字:51单片机  PCF8591  DA转换  控制舵机 引用地址:51单片机PCF8591 AD DA转换电位器控制舵机旋转的源程序

上一篇:单片机+ADC0832+MQ2温度烟雾报警控制
下一篇:出租车计费仿真原理图+单片机源程序

推荐阅读

        每经记者 刘春山 每经实习编辑 魏官红        10月22日晚间,中国移动(00941,HK)在港交所发布前三季财报。数据显示,中国移动2018年前9个月,营运收入为人民币5677亿元,比上年同期下降0.3%,净利润为人民币950亿元,比上年同期增长3.1%。值得注意的是,这是中国移动2014年以来首次出现营收下滑。        中国移动...
(文章来源:中科罗伯特机器人学院) 在2014年的时候ABB推出了一款协作机器人Yu,YuMi在英文中就是“你和我”协同工作的简称。这是协作机器人的第一次对大众的亮相,那时候谁都没想到协作机器人的出现,会在今天打破工业机器人市场增长缓慢局面的一把利刃。协作机器人是一种轻量化、安全化的新型工业机器人,它可以弥补生产中传统流水线的限制,可以进...
10月27日消息,一加在欧洲发布一加Nord系列新成员一加Nord N10。  和一加8T一样,一加Nord N10同样是挖孔屏、矩阵相机设计,主要区别在硬件配置。  一加Nord N10采用6.49英寸LCD挖孔屏,刷新率为90Hz,分辨率为FHD+。PS:一加8T为三星AMOLED挖孔屏,刷新率为120Hz。  规格方面,一加Nord N10搭载高通6系首款5G芯片骁龙690,该芯片采用...
高级定时器STM32F103有 2 个高级定时器 TIM1 和 TIM8,高级定时器的功能主要有定时、输入捕获、输出比较、互补输出等。高级定时器简介:计数器16bit,上 / 下 / 两边 计数,TIM1和TIM8,还有一个重复计数器RCR,独有;有4个GPIO,其中通道1 ~ 3还有互补输出GPIO;时钟来自PCLK2,为72M,可实现1~65536分频;高级定时器和通用定时器的引脚分布...

史海拾趣

问答坊 | AI 解惑

好资料“时钟参数shew和jitter介绍”!

这个资料不错,看看很有帮助的!…

查看全部问答∨

对中国目前3G的一点看法

3G时代,能否替代原有的固定宽带 2009年元月,中国3张3G牌照发放   电信 cdma2000  推出天翼品牌,声称测试速度已经达到3.3Mbps,年底升级到9Mbps。   联通 WCDMA   声称速度达到7.2Mbps,号称最成熟的3G制式。   ...…

查看全部问答∨

PCF8563在电子时钟设计中的应用

本帖最后由 paulhyde 于 2014-9-15 09:06 编辑 PCF8563在电子时钟设计中的应用  …

查看全部问答∨

问一下 元器件清单的公布问题

本帖最后由 paulhyde 于 2014-9-15 09:42 编辑 今年的元器件清单公布时间是29号? 不会提前公布出来么 早点公布也好早点猜题啊?  …

查看全部问答∨

原来,干电池就是这样制成的!

日前,笔者在松下中心东京(Panasonic Center Tokyo)亲身体验了干电池的制作。说是亲身体验,其实是参加了松下主办的干电池制作实践班,在旁边观看了孩子们制作电池的过程。虽为手工制作,但据说使用的部件与工厂实际使用的相同。此次制作的是锰干 ...…

查看全部问答∨

按键切换的动作,全部用串口进行通信???

“所有按键需要通过串口自发自收来调校各种功能” 本人太菜了,遇到了这个问题,虚心请教一下怎么样可以实现这种功能。 假如有4个以上的按键…

查看全部问答∨

关于 微信号数据采集系统设计的疑问

   本系统侧重点在微信号的采集,通过设计一个微信号采集和分析的系统,通过特定的集成电路对微小信号放大,转变为标准电流信号并能够传输到远端。通过模数转换器将其转换为数字量。利用相应软件对采集到的数字进行修正,使之能够比较准 ...…

查看全部问答∨

是不是有个flable工具或框架

能用于wince上,做pushmail 一朋友说他听到过,问我,我也不知道,来问问大家 单词可能拼写错误.thanks!…

查看全部问答∨

_tmain 的参数问题

在wince6.0下,我传给_tmain函数的argv[1]的是一个字符串,怎么用%s打印出来只是此字符串的首字符? 有人遇到过这个问题吗?…

查看全部问答∨

请问如何调试CE驱动

1)我自己写了一个GPIO驱动,和一个应用,烧到板后,用应用打开驱动时,打开失败,不知道为什么,请教大家怎么样能调试驱动,那些打印信息DEBUGMSG()在串口怎么让他显示呢? 2)在自己定制的NK.B0烧到板上,启动的时候,DN ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved