51单片机学习:DAC模数转换实验

发布者:快乐旅途最新更新时间:2023-02-02 来源: zhihu关键字:51单片机  DAC  模数转换 手机看文章 扫描二维码
随时随地手机看文章

实验名称:DAC模数转换实验
接线说明:
实验现象:下载程序后,DAC(PWM)模块上的指示灯DA1呈呼吸灯效果,由暗变亮再由亮变暗
注意事项:
***************************************************************************************/
#include "public.h"
#include "pwm.h"


/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{
u8 dir=0;//默认为0
u8 duty=0;

pwm_init(0XFF,0XF6,100,0);//定时时间为0.01ms,PWM周期是100*0.01ms=1ms,占空比为0%

while(1)
{
if(dir==0)//当dir为递增方向
{
duty++;//占空比递增
if(duty==70)dir=1;//当到达一定值切换方向,占空比最大能到100,但到达70左右再递增,
//肉眼也分辨不出亮度变化
}
else
{
duty--;
if(duty==0)dir=0;//当到达一定值切换方向
}
pwm_set_duty_cycle(duty);//设置占空比
delay_ms(1);//短暂延时,让呼吸灯有一个流畅的效果
}
}

#include "pwm.h"

//全局变量定义
u8 gtim_h=0;//保存定时器初值高8位
u8 gtim_l=0;//保存定时器初值低8位
u8 gduty=0;//保存PWM占空比
u8 gtim_scale=0;//保存PWM周期=定时器初值*tim_scale


/*******************************************************************************
* 函 数 名 : pwm_init
* 函数功能 : PWM初始化函数
* 输 入 : tim_h:定时器高8位
tim_l:定时器低8位
tim_scale:PWM周期倍数:定时器初值*tim_scale
duty:PWM占空比(要小于等于tim_scale)
* 输 出 : 无
*******************************************************************************/
void pwm_init(u8 tim_h,u8 tim_l,u16 tim_scale,u8 duty)
{
gtim_h=tim_h;//将传入的初值保存在全局变量中,方便中断函数继续调用
gtim_l=tim_l;
gduty=duty;
gtim_scale=tim_scale;

TMOD|=0X01; //选择为定时器0模式,工作方式1
TH0 = gtim_h; //定时初值设置
TL0 = gtim_l;
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
}

/*******************************************************************************
* 函 数 名 : pwm_set_duty_cycle
* 函数功能 : PWM设置占空比
* 输 入 : duty:PWM占空比(要小于等于tim_scale)
* 输 出 : 无
*******************************************************************************/
void pwm_set_duty_cycle(u8 duty)
{
gduty=duty;
}

void pwm(void) interrupt 1 //定时器0中断函数
{
static u16 time=0;

TH0 = gtim_h; //定时初值设置
TL0 = gtim_l;

time++;
if(time>=gtim_scale)//PWM周期=定时器初值*gtim_scale,重新开始计数
time=0;
if(time<=gduty)//占空比
PWM=1;
else
PWM=0;
}


#include "public.h"

/*******************************************************************************
* 函 数 名 : delay_10us
* 函数功能 : 延时函数,ten_us=1时,大约延时10us
* 输 入 : ten_us
* 输 出 : 无
*******************************************************************************/
void delay_10us(u16 ten_us)
{
while(ten_us--);
}

/*******************************************************************************
* 函 数 名 : delay_ms
* 函数功能 : ms延时函数,ms=1时,大约延时1ms
* 输 入 : ms:ms延时时间
* 输 出 : 无
*******************************************************************************/
void delay_ms(u16 ms)
{
u16 i,j;
for(i=ms;i>0;i--)
for(j=110;j>0;j--);
}



关键字:51单片机  DAC  模数转换 引用地址:51单片机学习:DAC模数转换实验

上一篇:51单片机学习:ADC模数转换实验--外部通道电压采集
下一篇:51单片机学习:LCD1602液晶显示实验

推荐阅读最新更新时间:2024-10-31 04:01

51单片机学习笔记:红外接收
正点原子的ALIENTEK遥控器 用户码00ff 16进制键值码表 45 46 47 44 40 43 07 15 09 16 19 0d 0c 18 5e 08 1c 5a 42 ☻ 4a 红外接收管 通用型即可 --------------------------------------------------------------------------- 下面是类似的波形图,这个是网上找的,图片较大,缩小后看上去有些模糊,不过没关系,数据手册上一般都有 遥控器在发射红外信号之前,我们的mcu已经开启了定时器 在定时器中断函数中的全局变量irTimeCounts++ 一
[单片机]
<font color='red'>51单片机</font>学习笔记:红外接收
51单片机扩展IO口后扩展口的地址如何确定
1. 然后它说8255的A口、B口、C口、控制寄存器的地址分别为7FFCH、7FFDH、7FFEH、7FFFH。这个是怎么算出来的? 高八位7F是因为p2.7为0是选通8255的cs片选端,第八位是FC,FD,FE,FF是由8255内部结构决定的,芯片的技术手册上会有,其实也是由最后两位的组合进行选择 2.在用C51的P0,P2口做外部扩展时使用,其中XBYTE ,P2口对应于地址高位,P0口对应于地址低位。一般P2口用于控制信号,P0口作为数据通道。 比如:P2.7接WR,P2.6接RD,P2.5接CS,那么就可以确定个外部RAM的一个地址,想往外部RAM的一个地址写一个字节时,地址可以定为XBYTE ,其中WR,
[单片机]
<font color='red'>51单片机</font>扩展IO口后扩展口的地址如何确定
AT89S51单片机的看门狗功能设计
在ATMEL的89S51系列的89S51与89C51功能相同。指令兼容。HEX程序无需任何转换可以直接使用。89S51只比89C51增加了一个看门狗功能。89S51的其它功能可以参见89C51的资料。 看门狗具体使用方法如下: 在程序初始化中向看门狗寄存器(WDTRST地址是0A6H)中先写入01EH,再写入0E1H。即可激活看门狗。 Org 0000 Ljmp begin Begin: Mov 0A6H,#01EH ;先送1E Mov 0A6H,#0E1H ;后送E1 在程序初始化中激活看门狗。 For: Mov 0A6H,#01EH ;先送1E Mov 0A6H,#0E1H ;后送E1 喂狗指令 Ljmp for
[单片机]
AT89S<font color='red'>51单片机</font>的看门狗功能设计
51单片机之C语言-4.4运算符及表达式
4.4 运算符及表达式 前面三节实际是讲如何定义一个数据类型,所谓数据类型其实就是不同存储空间的形状,也就是不同单元格的组合方式。既然定义了数据类型,我们的目的当然是如何使用它们,比如赋值,比较大小,移位变化,等待。简单的讲就是 谁 -数据类型, 怎么样 -如何运算。往我们定义的单元格中填充内容。既然要运算当然有配套的运算符和表达式,现在将各种运算符及表达式总结如表4-4-1所示。 这里我们选取几个在单片机编程中比较常见的运算符进行讲解。 (1) 自增运算和自减运算 对于运算符相信大家非常熟悉,这里不细讲。值得提醒一下的是,自增和自减运算符, ++a: a的值先增加1后,再参与其他运算 a++: a的值先参与其他运算,再使
[单片机]
<font color='red'>51单片机</font>之C语言-4.4运算符及表达式
51单片机OLED+dht11显示温度的源程序
入门51单片机一个多月,参加一个比赛熬夜写出了OLED+DHT11程序。 单片机源程序如下: #include REG51.h #include oled.h #include intrins.h typedef unsigned char BYTE; typedef unsigned int WORD; #define uint unsigned int #define uchar unsigned char sbit io=P1^2;//dht11data端接单片机的P1^0口// sbit IN1 = P1^0; sbit IN2 = P1^1; //输入电机接口 sbit K1 = P3^
[单片机]
51单片机实验(一)定时/计数器及其中断
我们这学期开了单片机的课,不知道为什么我们要用汇编语言写程序,感觉汇编程序真的挺难写的,所以把实验记录下来把。 如果没有学过汇编的小伙伴建议先去熟悉一下简单的汇编指令,之前简单的实验我就不记录了,我们从定时计数器实验开始吧。 首先来回顾一下和中断,定时有关的知识 51单片机中断级别 中断源 中断允许寄存器IE EA---全局中允许位。 EA=1,打开全局中断控制,在此条件下,由各个中断控制位确定相应中断的打开或关闭。 EA=0,关闭全部中断。 -------,无效位。 ET2---定时器/计数器2中断允许位。 EA总中断开关,置1为开; ET2=1,打开T2中断。 EX0为外部中断0(INT0)开关,…… ET
[单片机]
<font color='red'>51单片机</font>实验(一)定时/计数器及其中断
51单片机(十四)—— 中断功能介绍
中断是单片机的一个重要功能,本文我们就对51单片机的中断进行介绍。 所谓“中断”,通俗一点讲,就是单片机停止正在执行的任务,转去执行其它的急需解决的任务,当这个任务完成之后,在回到原来的任务继续执行。中断就是为了使单片机能够对外部或内部随机发生的事件进行实时处理而设计的。中断功能的存在,很多程度上提高了单片机处理外部或内部事件的能力。中断功能是我们在学习单片机过程中必须掌握的。 STC89C516单片机内部有6个中断源,也就是说,有6种情况发生时,会使单片机去处理中断程序。 为了能让大家更容易理解中断的概念,我们举一个通俗的例子:你打开火,烧一壶水,然后去扫地。在扫地过程中,突然听到水壶发出
[单片机]
<font color='red'>51单片机</font>(十四)—— 中断功能介绍
MCS-51单片机串行口IP核的实现
   1 引言   随着集成电路的深亚微米制造技术和eda技术的迅猛发展,芯片的密度和复杂度不断提高,复用以前的设计模块用于asic芯片和在一块芯片上实现嵌入式系统的功能形成所谓的片上可编程系统( system on programmable chip,sopc) 已成为一种发展的新趋势。ip core(知识产权核) 设计的重用性以及sopc 技术的出现,以其设计的灵活性大大缩短了产品的设计周期,减少了设计成本,降低了设计风险, 加快了产品的上市速度。本文中介绍的串行口控制器是一种功能和通信协议与mcs-51系列单片机的串行口相兼容,性能有大幅提高的数据通信部件,其往往于低速低成本的微机与下位机的通讯中,并允许在串行链路上进
[单片机]
MCS-<font color='red'>51单片机</font>串行口IP核的实现
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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