历史上的今天
返回首页

历史上的今天

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

正在发生

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

2019-10-28 来源:51hei

这里用到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;
}

推荐阅读

史海拾趣

乔光电子(FTR)公司的发展小趣事

Futaba Electric Co., Ltd. 的五个发展故事

故事一:从真空管到VFD的转型

Futaba Electric Co., Ltd.(原名双叶电子)成立于1948年,最初以生产收音机收讯真空管起家。然而,随着技术的飞速发展和市场需求的变迁,公司在1970年做出了关键的战略调整,决定放弃真空管业务,转而专注于萤光表示管(VFD)的研发与生产。这一决定极具前瞻性,因为VFD以其高清晰度、广视角和出色亮度等独特优势,迅速赢得了市场的青睐。Futaba凭借在VFD领域的持续创新和卓越品质,逐渐确立了其在全球市场的领先地位,市场份额超过60%,成为行业内的佼佼者。

故事二:无线电控制技术的突破

进入1960年代,Futaba在电子领域不断拓宽其技术边界。1962年,公司推出了无线电控制设备和冲压金属模用部件,旨在提升工业生产的品质和效率。这一创新不仅解决了工业控制领域中长期存在的供应商品质和交货期问题,还引领了模具制造行业的标准提升。Futaba的无线电控制技术逐渐在模具制造、工业自动化等领域得到广泛应用,为公司后续在无线遥控领域的深入发展奠定了坚实基础。

故事三:无线遥控技术的领导者

随着技术的不断积累和市场的日益扩大,Futaba在无线遥控领域取得了显著成就。特别是在1990年,公司成功研发出高频无线展频通讯技术,该技术以其高可靠性和抗干扰性,在卫星通讯、工业用机器人和工业控制设备等领域展现出巨大潜力。Futaba的无线遥控产品如遥控飞机、车、船等,在休闲娱乐市场也广受欢迎,进一步巩固了公司在无线遥控技术领域的领先地位。

故事四:VFD在汽车行业的广泛应用

Futaba的VFD产品凭借其卓越的性能和稳定的品质,赢得了众多汽车制造商的信赖。自1983年Futaba的VFD产品被福特汽车公司采用以来,其在美国三大汽车厂的市场占有率迅速攀升至100%。这一成就不仅证明了Futaba产品在汽车行业的广泛应用和市场认可度,也为其在高端消费性电子设备市场的进一步拓展提供了有力支持。

故事五:中国市场的深入布局

为了更好地服务于中国市场,Futaba成立了双叶电子科技开发(北京)有限公司,专营日本双叶(Futaba)的全线产品。这家公司在北京设立,不仅负责Futaba真空荧光显示管及模组、RC遥控器等产品的生产和销售,还积极开拓中国市场,参与行业交流和合作。双叶电子科技开发(北京)有限公司的成立,标志着Futaba在全球化战略中对中国市场的高度重视和深入布局。通过不断提升产品质量和服务水平,Futaba在中国市场也取得了显著成绩,为公司的持续发展注入了新的动力。

Datalinear公司的发展小趣事

随着科技的快速发展,数据处理行业也在不断变化。为了保持竞争优势,Datalinear公司投入大量资金进行技术创新。经过数年的研发,公司成功推出了一款基于人工智能的数据分析系统,能够自动识别数据中的模式并给出预测。这一技术的突破让Datalinear公司在行业内树立了技术领先的形象,也赢得了众多客户的青睐。

Dynex公司的发展小趣事

在国内市场取得成功后,Datalinear公司开始寻求国际化的发展。公司派遣团队前往欧美等发达国家进行市场调研,并根据当地市场需求进行产品定制。通过不懈的努力,Datalinear公司的产品在海外市场取得了良好的销售业绩,并逐步建立了全球化的销售网络。

Catalyst / ON Semiconductor公司的发展小趣事

为了进一步扩大市场份额和提升品牌影响力,Catalyst / ON Semiconductor公司开始实施全球扩张战略。公司先后在多个国家和地区设立了分支机构和研发中心,以便更好地服务当地客户并吸引优秀人才。同时,公司还积极与其他知名企业进行战略合作,共同推动半导体技术的创新和应用。

E-CMOS(飞虹高科)公司的发展小趣事

展望未来,飞虹高科公司将继续秉承“创新、质量、服务”的企业精神,致力于CMOS技术的研发和应用。公司将密切关注市场动态和技术发展趋势,不断调整和优化产品结构和市场布局。同时,公司还将加强与国际同行的合作与交流,共同推动电子行业的进步与发展。飞虹高科坚信,在全体员工的共同努力下,公司一定能够在电子行业中取得更加辉煌的成就。

BOPLA公司的发展小趣事

随着电子行业的快速发展,BOPLA意识到传统的电子元件已经无法满足市场的需求。于是,公司投入大量资源进行技术研发,成功推出了一系列具有创新性的电子元件产品。这些产品不仅性能优异,而且具有更高的可靠性和稳定性,赢得了市场的广泛好评。

问答坊 | AI 解惑

模拟电路一日通(Ti的模拟电路应用基础资料)

本帖最后由 dontium 于 2015-1-23 11:33 编辑 模拟电路一日通(Ti的模拟电路应用基础资料) 本人认为很好的资料 …

查看全部问答>

eeworld论坛这里怎么获得积分啊,我初学者,很多问题又都回答不了,拿不了分,但我的分又快用完了……

eeworld论坛这里怎么获得积分啊,我初学者,很多问题又都回答不了,拿不了分,但我的分又快用完了………

查看全部问答>

Wince5.0 With PlatForm Builder 安装补丁后的问题。

PB5.0,安装了2007年全年的补丁(下载地址:http://www.microsoft.com/downloads/details.aspx?FamilyID=a54779d5-f4a5-49f0-9e36-979d461f536c&DisplayLang=en)后,编译生成的NK.bin,烧入2410的板子后,系统启动时候出现,     致命 ...…

查看全部问答>

vxworks对java的支持?

请教:    想在vxworks下做java 开发,不知道能不能行得通?听说vxworks6.4+workbench可以,但却没有这方面的资料.希望高手给予指点.有此想发的朋友一起研究. qq:120964089…

查看全部问答>

驱动获得系统目录

驱动里面怎么获得系统目录啊。。…

查看全部问答>

PB编译错误

ERROR: Res2Exe: WriteResFile: Open input file D:\\WINCE500\\PBWorkspaces\\GDI1029\\RelDir\\Emulator_x86_Release\\shlwapi.dll failed. ERROR: Res2Exe: WriteResFile: Open input file D:\\WINCE500\\PBWorkspaces\\GDI1029\\RelDir\\Emula ...…

查看全部问答>

二个spi设备使用一个驱动程序

阅读完linux内核中的spi驱动程序有点乱,现在想用一个spi驱动程序,打开二个spi设备,而且可以使用二个spi设备,只需要在probe的时候,注册二个spi设备即可吗?具体应该怎么做?请高手明示。…

查看全部问答>

k51开发环境是针对几位单片机的呀?因为不同位的单片机汇编器是不同的呀。

k51开发环境是针对几位单片机的呀?因为不同位的单片机汇编器是不同的呀。…

查看全部问答>

MSP430 FLASH 请教

IAR编译器以下显示是不是说 FLASH 程序占用8 884 bytes对吗?那也可以说是9K不到是吗? 8 884 bytes of CODE memory 788 bytes of CONST memory (+ 14 bytes shared) 357 bytes of DATA memory (+ 64 bytes shared)…

查看全部问答>

stm32驱动ov7660工作的时候出问题了。。。求指点呀!!!!

程序老是卡在摄像头初始化那块。。。这该如何是好呀?????    …

查看全部问答>