导航:首页 > 编程语言 > 单片机pwm调光程序

单片机pwm调光程序

发布时间:2024-11-20 08:43:27

A. STC单片机PWM编程!

看看这个,单片机用的是,AD转换输出正弦波,和PWM原理类似。

2、源程序清单

DACCONEQU0xfD;定义模数转换控制器

DACHEQU0xfc;定义模数转换数据寄存器高8位

DACLEQU0xfb;定义模数转换数据寄存器低8位

ORG0000H

LJMPMAIN

ORG0200H

MAIN:MOVDACCON,#0fH;DACoperation

CLRA;

MOVDACH,A;模数转换高八位清零

PRG3:MOVR0,#09H;正弦波

MOVR4,#40H

LP11:MOVA,R0

MOVCA,@A+PC

MOVDACL,A;2

ACALLDELAY;2

INCR0;1

DJNZR4,LP11;2

SJMPPRG3;2

DATA0:

DB80H,8CH,98H,0A5H,0B0H,0BCH,0C7H,0D1H,0DAH,0E2H,0EAH

DB0F0H,0F6H,0FAH,0FDH,0FFH,0FFH,0FDH,0FAH,0F6H,0F0H

DB0EAH,0E2H,0DAH,0D1H,0C7H,0BCH,0B0H,0A5H,98H,8CH

DB80H,7FH,73H,67H,5AH,4FH,43H,38H,2EH,25H,1DH,15H

DB0FH,09H,05H,02H,00H,00H,02H,05H,09H,0FH,15H

DB1DH,25H,2EH,38H,43H,4FH,5AH,67H,73H,7FH

RET

DELAY:MOVR6,#10H

MOVR7,#0A1H

DELAYLOOP:;延时程序

DJNZR6,DELAYLOOP

DJNZR7,DELAYLOOP

RET

四、实验板插针配置:

无需插针配置,注意DAC是从CONDACOUT1端子输出,可用示波器观察DAC输出波形。若产生失真情况,请检查开发板DA输出端LM358运算放大器的放大倍数,适当更改所查函数表的范围。

五、思考题

1、改变程序,使能添加输出锯齿波;

2、改变程序,使输出添加三角波;

3、改变程序,使输出添加方波;

4、改变程序,并制作一个简单的函数发生器

B. 请问:单片机使用C语言编程,怎样控制led灯的完成亮度强弱变换

你可以使用ad转换 或者直接控制脉冲频率

C. 求一单片机程序(用光敏电阻,PWM输出控制LED亮度)

ORG 0000H
L0000: LJMP MIN00 ; 主程序
; / *** *** *** *** / 初始化 PWM
PCA00: MOV CMOD, #82H ; (fSYS/2)
MOV CCON, #00H
MOV CL, #00H
MOV CH, #00H
MOV CCAPM0, #00H ; PWM0 输出
MOV PCA_PWM0, #00H
SETB CR ; 开 PWM
RET
; / *** *** *** *** / 主程序
P1M0 EQU 91H
P1M1 EQU 92H
P3M0 EQU 0B1H
P3M1 EQU 0B2H
ADC_CONTR EQU 0C5H ; A/D 转换寄存器
ADC_DATA EQU 0C6H ; A/D 结果寄存器
MIN00: MOV P1M0, #08H ; 设置 P1.3 为高阻状态
MOV P1M1, #08H
MOV ADC_CONTR, #0E3H ; 开A/D 转换电源 P1.3
LCALL PCA00 ; 初始化 PWM
MIN10: NOP ; 主程序 入口
LCALL ADC00 ; 测光敏电阻电压
MOV CCAP0H, A ; 写入PWM 控制 发光亮度
LJMP MIN10
RET
; / *** *** *** *** / A/D 转换通道 测电压
ADC00: MOV ADC_DATA, #00H
ORL ADC_CONTR, #08H ; 启动 AD 转换
MOV A, #10H ; 判断 AD 转换是否完成
ANL A, ADC_CONTR
JZ ADC32 ; AD 转换尚未完成, 继续等待
ANL ADC_CONTR, #0E7H ; 清0 ADC_FLAG, ADC_START 位, 停止A/D 转换
MOV A, ADC_DATA ; A = AD 转换结果
RET
END

D. 单片机C语言PWM的典型程序谢谢

/ 利用定时器控制产生占空比可变的 PWM 波
// 按K1,PWM值增加,则占空比减小,电机减速。
// 按K2,PWM值减小,则占空比增加,电机加速。
// 当PWM值增加到最大值或减小到最小值时,蜂鸣器将报警。

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

#include<reg51.h>
#include<intrins.h>

sbit K1 =P1^4 ; //PWM值增加键
sbit K2 =P1^5 ; //PWM值减少键
sbit BEEP =P3^7 ; //蜂鸣器
unsigned char PWM=0x7f ; //赋初值

void Beep();
void delayms(unsigned char ms);
void delay(unsigned char t);

/*********************************************************/
void main()
{
P1=0xff;
TMOD=0x21 ;
TH0=0xfc ; //1ms延时常数
TL0=0x66 ; //频率调节

TH1=PWM ; //脉宽调节
TL1=0 ;

EA=1;
ET0=1;
ET1=1;

TR0=1 ;

while(1)
{
do{
if(PWM!=0xff)
{PWM++ ;delayms(10);}
else Beep() ;
}
while(K1==0);

do{
if(PWM!=0x02)
{PWM-- ;delayms(10);}
else Beep() ;
}
while(K2==0);
}
}

/*********************************************************/
// 定时器0中断服务程序 (频率)
/*********************************************************/
void timer0() interrupt 1
{
TR1=0 ;
TH0=0xfc ;
TL0=0x66 ;
TH1=PWM ;
TR1=1 ;
P0=0x00 ; //启动输出
}

/*********************************************************/
// 定时器1中断服务程序 (脉宽)
/*********************************************************/
void timer1() interrupt 3
{
TR1=0 ;
P0=0xff ; //结束输出
}

/*********************************************************/
//蜂鸣器子程序
/*********************************************************/

void Beep()
{
unsigned char i ;
for (i=0 ;i<100 ;i++)
{
delay(100) ;
BEEP=!BEEP ; //Beep取反
}
BEEP=1 ; //关闭蜂鸣器
delayms(100);
}

/*********************************************************/
// 延时子程序
/*********************************************************/
void delay(unsigned char t)
{
while(t--) ;
}

/*********************************************************/
// 延时子程序
/*********************************************************/
void delayms(unsigned char ms)

{
unsigned char i ;
while(ms--)
{
for(i = 0 ; i < 120 ; i++) ;
}
}

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

E. 请教51单片机利用PWM控制灯的亮度的程序

第一,要理解中断在这里的作用是固定的“一小段”时间进入一次。

第二,专PWM_ON在程序中的作用很大,它会属由0------>CYCLE------>0并且一直循环下去。可以把它看成一个有规律的变化的量。

第三,每进入中断一次count++,满足条件count==PWM_ON或count==CYCLE时改变LED的当前状态。作用是给小灯亮或灭的时间不同。

第四,LED的亮度与其通电时间有关,也可以说成是占空比。上面的条件要理解成是呈线性增加或减小的频率。可以理解成三角波,对应的面积就是通电时间。

不知能不能给你讲明白!

F. 51单片机如何用一个按键和一个定时器来模拟PWM控制一个LED灯的亮度

使用定时器T0产生PWM方波,
用按键调整占空比,20级可调
控制led灯的亮度等级.
#include "my51.h"
#include "timer0.h"

#define grading 20 //亮度20级变化
sbit keyS3=P3^5; //按键调整占空比,PWM_keyChange++
sbit keyS4=P3^6; // PWM_keyChange--

u8 PWM_keyChange=10; //初值,按键调整在1~20之间变化
//占空比 PWM_keyChange/grading

void T0_work() //本函数由T0定时器中断函数调用
{
if(timeMultiple1Flag)
{
led=off(7); //关闭7号灯
timeMultiple1Flag=0; //清定时器复用置位标志
}

if(timeMultiple2Flag)
{
led=on(7); //打开7号灯
timeMultiple2Flag=0; //清定时器复用置位标志
}
}

void main() //测试
{
u8 keyFlag=1; //程序中没有消抖处理,只是简易的按键进出自锁标志
led0=ledon; //先打开0号灯,用于和7号灯对比亮度
initT0(1,10,grading); //1毫秒的基本定时,亮的时间1*10毫秒,暗1*(grading-10)毫秒
while(1)
{
if(0==keyS3)
{
if(keyFlag) //防止一次按键中多次执行
{
keyFlag=0; //清标志,类似同步锁
if(++PWM_keyChange>grading)
{
PWM_keyChange=grading; //占空比最大100%
}
initT0(1,PWM_keyChange,grading);
}
}
else if(0==keyS4)
{
if(keyFlag)
{
keyFlag=0;
if(0==--PWM_keyChange) //占空比减小
{
PWM_keyChange=1; //最小占空比 1/20
}
initT0(1,PWM_keyChange,grading); //占空比减小
}
}
else
{
keyFlag=1; //按键锁释放标志,下一次按键时允许调整占空比
}
}
}

C代码
#ifndef _MY51_H
#define _MY51_H
#include <reg52.h>
//#include <math.h>
#include <intrins.h>
#include <stdio.h>
#include "mytype.h"

#ifndef _51LED_
#define _51LED_
#define led P1 //P1总线连8个led灯,灯连573锁存器,P1置低电平点亮
#define LED led
#define ON(x) P1&(~(1<<(x))) //打开某个灯,开多个灯用 ON(m) & ON(n)
#define OFF(x) P1|(1<<(x)) //关闭某个灯,关多个灯用 OFF(m)| OFF(n)
#define on(x) ON(x) //包含大小写
#define off(x) OFF(x)

#define ledon 0 //某个灯,打开
#define ledoff 1 //某个灯,关闭

sbit led0=P1^0;
sbit led1=P1^1;
sbit led2=P1^2;
sbit led3=P1^3;
sbit led4=P1^4;
sbit led5=P1^5;
sbit led6=P1^6;
sbit led7=P1^7;
sbit ledLock=P2^5; //锁定当前8个led的状态,0锁定 ,1不锁定

#endif

/*************二进制输入宏****************************/
#ifndef _LongToBin_
#define LongToBin(n) \
( \
((n >> 21) & 0x80) | \
((n >> 18) & 0x40) | \
((n >> 15) & 0x20) | \
((n >> 12) & 0x10) | \
((n >> 9) & 0x08) | \
((n >> 6) & 0x04) | \
((n >> 3) & 0x02) | \
((n ) & 0x01) \
)
#define bin(n) LongToBin(0x##n##l)
#define BIN(n) bin(n)
#define B(n) bin(n)
#define b(n) bin(n)
#endif

/*************单个数据位的置位宏*********************/
#ifndef _BIT_
#define BIT(n) (1<<n)
#define bit(n) BIT(n)
#endif

#define high 1 //高电平
#define low 0 //低电平

sbit beep=P2^3; //蜂鸣器

extern void delayms(u16 ms);
extern void delayXus(u8 us); //函数执行(8+6x)个机器周期, 即t=(8+6x)*1.085
/////////////////////////////////////////////////////////////////////////////

#endif

C代码
#ifndef _TIMER0_H
#define _TIMER0_H
#include "my51.h"

extern u8 timeMultiple1Flag; //中断时间复用置位标志,须手动清零
extern u8 timeMultiple2Flag; //中断时间复用置位标志,须手动清零
extern void T0_work(); //该函数未实现,需外部实现
extern void initT0(u8 ms,u16 t_multiple1,u16 t_multiple2) ; //定时器初始化

#endif

C代码
#include "timer0.h"

u8 TH0Cout=0 ; //初值
u8 TL0Cout=0 ;
u16 T0IntCouts1=0; //中断计数
u16 T0IntCouts2=0; //中断计数
u16 timeMultiple1=0; //中断复用时间的倍数
u16 timeMultiple2=0; //中断复用时间的倍数
u8 timeMultiple1Flag=0; //中断时间复用置位标志,须手动清零
u8 timeMultiple2Flag=0; //中断时间复用置位标志,须手动清零

//开启定时器,定时完成后需要手动关闭TR0,否则将循环定时
//参数一是定时的毫秒数,参数二和三是定时基时的倍率数(定时复用)
void initT0(u8 ms,u16 t_multiple1,u16 t_multiple2) //定时器初始化设定,ms取值不超过65
{
u16 N=11059.2*ms/12; //定时器总计数值
TR0=STOP; //停掉定时器
ET0=CLOSE; //关定时器中断

//对于110592晶振,ms为5的整数倍时没有计算误差,但ms最大不超过71毫秒
TH0Cout =(65536-N)/256; //装入计时值零头计数初值
TL0Cout =(65536-N)%256;
if(0==t_multiple1) //0倍的基准时间是不合理的,至少1倍
{
t_multiple1=1;
}
if(0==t_multiple2) //0倍的基准时间是不合理的,至少1倍
{
t_multiple2=1;
}
timeMultiple1=t_multiple1; //倍时
timeMultiple2=t_multiple2; //倍时
TMOD &= 0xf0; //清定时器0配置
TMOD |= 0x01; //配置定时器0的工作方式为1

EA =OPEN; //打开总中断
ET0=OPEN; //打开定时器中断

TH0=TH0Cout; //定时器装入初值
TL0=TL0Cout;
TR0=START; //启动定时器
}
void T0_times() interrupt 1 //T0定时器中断函数
{
TH0=TH0Cout; //重装初值
TL0=TL0Cout;
if(++T0IntCouts1==timeMultiple1) //判断是否复用定时器
{
T0IntCouts1=0; //中断次数清零,重新计时
timeMultiple1Flag=1; //复用定时器标志,须在T0_work()中手动清零
}
if(++T0IntCouts2==timeMultiple2) //判断是否复用定时器
{
T0IntCouts1=0; //这个也要清,防止到达最小公倍数时乱掉
T0IntCouts2=0; //中断次数清零,重新计时
timeMultiple2Flag=1; //复用定时器标志,须在T0_work()中手动清零
}
T0_work(); //调用工作函数
}

阅读全文

与单片机pwm调光程序相关的资料

热点内容
ps入门必备文件 浏览:348
以前的相亲网站怎么没有了 浏览:15
苹果6耳机听歌有滋滋声 浏览:768
怎么彻底删除linux文件 浏览:379
编程中字体的颜色是什么意思 浏览:534
网站关键词多少个字符 浏览:917
汇川am系列用什么编程 浏览:41
笔记本win10我的电脑在哪里打开摄像头 浏览:827
医院单位基本工资去哪个app查询 浏览:18
css源码应该用什么文件 浏览:915
编程ts是什么意思呢 浏览:509
c盘cad占用空间的文件 浏览:89
不锈钢大小头模具如何编程 浏览:972
什么格式的配置文件比较主流 浏览:984
增加目录word 浏览:5
提取不相邻两列数据如何做图表 浏览:45
r9s支持的网络制式 浏览:633
什么是提交事务的编程 浏览:237
win10打字卡住 浏览:774
linux普通用户关机 浏览:114

友情链接