电工优优今天要和大家分享的单片机相关信息,接下来我将从51单片机学习:DAC模数转换实验这个方面来介绍。
实验名称:DAC模数转换实验接线说明:实验现象:下载程序后,DAC(PWM)模块上的指示灯DA1呈呼吸灯效果,由暗变亮再由亮变暗注意事项:***************************************************************************************/#include "public.h"#include "pwm.h"
/******************************************************************************** 函 数 名 : main* 函数功能 : 主函数* 输 入 : 无* 输 出 : 无*******************************************************************************/void main(){u8 dir=0;//默认为0u8 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_scaleduty: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模式,工作方式1TH0 = 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;elsePWM=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--);}