2051的比较器模拟AD源程序(C语言)

发布者:phi31最新更新时间:2018-03-12 来源: eefocus关键字:比较器  模拟AD 手机看文章 扫描二维码
随时随地手机看文章

2051的比较器模拟AD源程序(C语言)

/* io分配:                                      *
;*  OUTPUT:                                                    *
;*      P1.0 ...... 模拟量输入    *
;*      P1.1 ...... DA输入比较基准电压    *
;*      P1.2~7..... R-2R DA电阻网络    *
;*      P3.7 ...... LED 模拟亮度输出    *
;* CPU CLOCK EQU 6M                                            */
//xiaoqi last edit in 2001.11
//#pragma SRC 
#i nclude "AT89x051.h"
#i nclude
#i nclude
#i nclude

//变量类型标识的宏定义,大家都喜欢这么做
#define Uchar unsigned char
#define Uint unsigned int

#define Ledlight() (P3 &= 0x7f)
#define Leddark()  (P3 |= 0x80)

sbit P36 = P3^6;  // 比较器内部判断脚
sbit LED = P3^7;  // 一个发光二级管观察亮度变化

// 内部标志位定义
bit less;  // 比较是否大于 1.小于,0.大于

// 全局变量定义
Uchar timer1,          // 通用延时计数器
 timer2,          // 按键蜂鸣器反应定时器
 adcdata,  // ad转换变量
 PWM1;  // PWM输出比例

// 函数列表
void DelayMs(unsigned int number);      // 毫秒延时
void timers0();          // 在定时器中断中做数码管的扫描显示(ct0)
void Initall(void);          // 系统初始化
void timers1(void);          // TC1定时器中断用于扫描显示与键盘
Uchar adcread(void);  // adc转换程序

void main(void)  using 0
{
 DelayMs(120);
 Initall();
 pwm1 = adcread();
 LED=1;
 while(1) 
 {
  pwm1 = adcread();
  timer2=10;
  while (timer2);
 }
}

// 毫秒延时
void DelayMs(unsigned int number) 
{
 unsigned char temp;

 for(;number!=0;number--) 
  for(temp=112;temp!=0;temp--);
}

/*************************************
  在定时器中断中做LED的PWM输出
*************************************/
void timers0() interrupt 1 using 1 
{
 TH0 = 0xff;
 TL0 = 0xd0;
 timer1--;
 if (timer1==pwm1)LED=0;
 if (timer1==0){
  LED=1;
  timer1=0x40;
  timer2--;
  };
}

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

;* 6位 ADC转换
;****************/
Uchar adcread(void)
{
 Uchar i=0x3f,temp=0;
 P36 =1;
 P1 = 3; _nop_();_nop_();  // 从零开始
 while ((i--)&& (P36))
  {
  temp += 4;
  P1 = temp|3;
  _nop_(); 
  }
 temp >>= 2;
 return temp;
}

 

/****************
;* 系统初始化
;****************/
void Initall(void)
{
 TMOD = 0x11;  // 0001 0001 16进制计数器
 IP = 0x8;  // 0000 1000 t1优先
        IE = 0x8A;  // 1000 1010 t0,t1中断允许
 TCON = 5;  // 0000 0101 外部中断低电平触发
        TR0 = 1;  // 打开定时器中断,IE中已经打开,在明示一下
 TR1 = 0;
        ET0 = 1;
 ET1 = 0;
        P1 = 0xff;
}
 
/*************************************
  TC1定时器中断用于扫描显示与键盘(ct1)
*************************************/
void timers1(void) interrupt 3 using 2 
{
_nop_();  //实验中没有启用
}


关键字:比较器  模拟AD 引用地址:2051的比较器模拟AD源程序(C语言)

上一篇:C51独立按键的识别示例程序
下一篇:如何以10进位显示8位数的七段显示器?

推荐阅读最新更新时间:2024-03-16 15:57

AT89C2051利用中断产生PWM
原理图 #include REG2051.H #include intrins.h #define uint unsigned int #define uchar unsigned char const TH_600=0xfd; const TL_600=0xd4; const TH_1200=0xfb; const TL_1200=0x7c; const TH_2400=0xf6; const TL_2400=0xa0; sbit PWM=P3^7; bit ld=0; //上一次发送的数据 uchar _pool ; //数据头 uchar _length; //当前数组长度 uchar _in
[单片机]
MSP430的比较器
这两天研究了一下430的比较器,开始的时候,没有看懂是怎么一回事,在网站看这方面的博客,好像懂了,但是一到编程,就变得无从下手,但是,皇天不负有心人,笔者还是把他弄懂了 其实这里就是看懂一幅图,两个寄存器,明白工作原理就可以了 这是比较器A的逻辑图,比价器A由4个部分组成 标号1:内部参考电压发生器,可以产生0.25V,0.50v的参考电压 标号2,:外部电压输入端,CA0对应P2.3,CA1对应P2.4 标号3:内部比较器,今天上课刚好上了比较器,也就是正输入端大于负输入端的时候,比较器输出一个1,同时产生一个中断标志位 标号4:也就是比较结果输入端 因此,一般的模版就可以出来了 1:设置内部的参考电压 2:打开外部
[单片机]
MSP430的<font color='red'>比较器</font>
比较器的合理选择与应用
长期以来,比较器的应用一直受到运算放大器的冲击,直到目前随着比较器性能指标的不断改进,这一现状才得到改善,本文主要介绍新型比较器的性能及其典型应用。 比较器的两路输入为模拟信号,输出则为二进制信号,当输入电压的差值增大或减小时,其输出保持恒定。因此,也可以将其当作一个1位模/数转换器(ADC)。运算放大器在不加负反馈时从原理上讲可以用作比较器,但由于运算放大器的开环增益非常高,它只能处理输入 差分电压非常小的信号。而且,一般情况下,运算放大器的延迟时间较长,无法满足实际需求。比较器经过调节可以提供极小的时间延迟,但其频响特性会受到一定限制。为避免输出振荡,许多比较器还带有内部滞回电路。因此,比较器不能当作运算放大器使用
[应用]
MSP430教程13:MSP430单片机比较器A模块
比较器A模块 以下图可以看出比较器A的结构大概可以分4部分构成,分别为模拟输入,比较器A核心,低通虑波器,基准电压部分和中断部分组成。 首先,整个比较器A的工作必需由CAON位置为1时才能工作的,此位属CACTL1控制寄存器。单片机上电时此位是为0的,也就是说比较器是不工作的。 以下大概讲述几个部分电路的功能和一些相关信息。 模拟输入电路: 外部模拟引脚信号CA0,CA1(正负端)可以分别由P2CA0,P2CA1位控制开或关。经过软件的设置可以分别与内部的几个基准电压进行比较(0.5VCC,0.25VCC,三极管门值电压)或外部其中的电压进行比较。 应用的硬件比较可以分为以下三种组合: 两个外部引脚输入信号进行比较 其中一个外部
[单片机]
MSP430教程13:MSP430单片机<font color='red'>比较器</font>A模块
C51---16 AD/DA 模拟数字转换
AD/DA介绍 硬件电路模型 运算放大器 运算放大电路 DA原理 AD原理 AD/DA性能指标 XPT2016芯片时序 AD采集可调电阻、热敏电阻、光敏电阻 main.c #include REGX52.H #include Delay.h #include LCD1602.h #include XPT2046.h unsigned int ADValue; void main(void) { LCD_Init(); LCD_ShowString(1,1, ADJ NTC GR ); while(1) { ADValue=XPT2046_ReadA
[单片机]
C51---16 <font color='red'>AD</font>/DA <font color='red'>模拟</font>数字转换
AT89C2051在点钞机外接显示屏中的应用
  大家知道,LED数码管是由发光二极管作为显示字段的数码型显示器件。在数码管显示器中,一般情况下都采用动态扫描式显示方式。所谓扫描式,就是当有多个七段(带小数点的为八段)显示器要显示时,将其各个对应引脚接在一起,也就是说,所有的a段接在一起,b段也接在一起,依此类推。而利用各七段显示器的共阳(或共阴)极来确定哪一个七段显示器要显示。这样做的目的有二:(1)省电;(2)节省输出端口。   本电路利用89C2051的端口与数码的笔段接法为: P1.1-- C; P1.2-- D; P1.3-- E; P1.4-- B; P1.5-- A; P1.6-- F; P1.7-- G ,且三只数码管的笔段a~g又是并联在一起的。数码管的公共端
[单片机]
AT89C<font color='red'>2051</font>在点钞机外接显示屏中的应用
利用比较器电路方便地转换电平和极性
数字系统经常采用单极性电源供电,于是经常会遇到如何将一串反极性的脉冲序列转换为正或负极性输出的问题。这里给出了几个实现这一功能的简单可靠的电路。 对于正电压供电的系统,可以利用图1a中的电路把负极性脉冲转换为正极性脉冲输出。双输出的比较器提供了同相和异相的输出。(如果系统只需要一种输出相位,可以采用单输出比较器。) 比较器的反转输入端电压在1.8V和3.0V之间波动。如果R1=R2,则可以把非反转输入电压设为2.5V。图中配置的互补比较器能够产生正的脉冲输出。 对于负电压供电的系统,可以利用图1b中的电路(与图1a及其类似)把正极性脉冲转换为负极性输出。比较器的反转输入端电压在1.8V和3.0V之间波动。设置R1=R2,可以把非
[模拟电子]
89C2051驱动步进电机的电路和源码,Stepper motor driver
程序 stepper.c stepper.hex /* * STEPPER.C * sweeping stepper's rotor cw and cww 400 steps * Copyright (c) 1999 by W.Sirichote */ #include c:mc518051io.h /* include i/o header file */ #include c:mc518051reg.h register unsigned char j,flag1,temp; register unsigned int cw_n,ccw_n; unsigned char step ={0x80,0xc0,0x40,0x
[单片机]
89C<font color='red'>2051</font>驱动步进电机的电路和源码,Stepper motor driver
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved