STC单片机PWM编程! STC 89C51,单片机C语言程序,P10输出PWM方波

STC\u5355\u7247\u673a\u8f93\u51faPWM\u4fe1\u53f7\uff0c\u9891\u7387\u898125KHz,\u8bf7\u5927\u795e\u6307\u6559\uff0c\u600e\u4e48\u5b9e\u73b0\uff0c\u6216\u8005\u76f4\u63a5\u7ed9\u6211\u4e00\u4e2a\u7a0b\u5e8f\uff0c\u8c22\u8c22\uff01

void PWM_init (void){//PWM\u521d\u59cb\u5316\u51fd\u6570
CMOD=0x02; //\u8bbe\u7f6ePCA\u5b9a\u65f6\u5668,\u8ba1\u6570\u9891\u7387\u4e3a\u6676\u632f\u9891\u7387/2 \u5f53\u4e3a12Mhz\u65f6,PWM\u8f93\u51fa\u9891\u7387\u7ea623.4Khz
//CMOD=0x00; //\u8bbe\u7f6ePCA\u5b9a\u65f6\u5668,\u8ba1\u6570\u9891\u7387\u4e3a\u6676\u632f\u9891\u7387/12 \u5f53\u4e3a12Mhz\u65f6,PWM\u8f93\u51fa\u9891\u7387\u7ea63.9Khz
//CMOD=0x04; //\u8bbe\u7f6ePCA\u5b9a\u65f6\u5668,\u8ba1\u6570\u9891\u7387\u4e3a\u5b9a\u65f6\u56680\u7684\u6ea2\u51fa\u7387\uff0c\u5982\u679c\u8ba9\u5b9a\u65f6\u56680\u8bbe\u4e3a16\u4f4d\u8ba1\u6570\u6a21\u5f0f\uff0c\u5176\u6ea2\u51fa\u9891\u7387\u53ef\u4ee5\u5728\u5f88\u5927\u8303\u56f4\u5185\u8c03\u8282\uff0c\u4ece\u800c\u4ee5\u4ea7\u751f\u5f88\u9ad8\u6216\u5f88\u4f4e\u7684PWM\u9891\u7387
CL=0x00;
CH=0x00;
CCAPM1=0x42; //PWM1\u8bbe\u7f6ePCA\u5de5\u4f5c\u65b9\u5f0f\u4e3aPWM\u65b9\u5f0f\uff080100 0010\uff09
CCAP1L=0x00; //\u8bbe\u7f6ePWM1\u521d\u59cb\u503c\u4e0eCCAP0H\u76f8\u540c
CCAP1H=0x00; // PWM1\u521d\u59cb\u65f6\u4e3a0
CR=1; //\u542f\u52a8PCA\u5b9a\u65f6\u5668
}
\u5b9e\u9645\u4e0a\u8981\u4ea7\u751f\u4f4e\u9891\u7387\u7684PWM\u6ce2\uff0c\u4e0d\u7528\u5176\u786c\u4ef6PWM\u529f\u80fd\u5b8c\u5168\u53ef\u4ee5
\u7528\u5b9a\u65f6\u5668\u4e2d\u65ad\u65b9\u5f0f\u5373\u53ef\u5b9e\u73b0
\u8ba9\u5b9a\u65f6\u5668 200us\u4e2d\u65ad\u4e00\u6b21(\u4e2d\u65ad\u4e0d\u7b97\u9891\u7e41\u5440\uff09 \uff0c\u8bbe\u4e00\u53d8\u91cfa\uff0c\u6bcf\u6b21\u4e2d\u65ada\u52a01\uff0c100\u6b21\u5c31\u662f20ms,\uff0c\u53e6\u8bbe\u4e00\u53d8\u91cfb,\u6570\u503c\u57281\uff0d100\u4e4b\u95f4\uff0c\u6bcf\u6b21\u4e2d\u65ad\u6bd4\u8f83a\u548c b\u7684\u5927\u5c0f\uff0c\u5982\u679ca<b,\u5219\u5f15\u811a \u8f93\u51fa\u9ad8\u7535\u5e73\uff0c\u5426\u5219\u4e3a\u4f4e\u7535\u5e73\uff0c\u8fd9\u6837\u901a\u8fc7\u6539\u53d8b\u7684\u503c\uff0c\u5c31\u53ef\u5b9e\u73b0\u9891\u7387\u4e3a50HZ\uff0c\u5360\u7a7a\u6bd41\uff0d100\uff05\u53ef\u8c03\u7684PWM\u65b9\u6ce2

\u4e32\u53e3\u8fd8\u662fP10\uff1f\u6211\u4e0b\u9762\u8d34\u51faP10\u8f93\u51faPWM\u7684\u4ea7\u751f\u4ee3\u7801\uff0c\u5e0c\u671b\u5bf9\u4f60\u80fd\u6709\u5e2e\u52a9\u3002
#include # t 10000/100 //\u4fee\u653910000\u66f4\u6539\u5468\u671f \u5355\u4f4dus T(us)=10^6/f(hz) \u81f3\u5c1110000us# Duty_cycle 10 ///\u66f4\u6539\u6b64\u66f4\u6539\u5360\u7a7a\u6bd4 0-100unsigned char percent=0;sbit work_pin P1^0;void Timer0Init() //\u5b9a\u65f6\u56680\u521d\u59cb\u5316{TMOD|=0X01;//\u9009\u62e9\u4e3a\u5b9a\u65f6\u56680\u6a21\u5f0f\uff0c\u5de5\u4f5c\u65b9\u5f0f1\uff0c\u4ec5\u7528TR0\u6253\u5f00\u542f\u52a8\u3002TH0=0xff;TL0=0x9c;ET0=1;//\u6253\u5f00\u5b9a\u65f6\u56680\u4e2d\u65ad\u5141\u8bb8EA=1;//\u6253\u5f00\u603b\u4e2d\u65adTR0=1;//\u6253\u5f00\u5b9a\u65f6\u5668}void PWM_work() interrupt 1 {TH0=0xff;TL0=0c9c; percent++;if(percentt) percent=0;}else work_pin=0; }void main(){Timer0Init();while(1);}

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



实验八 D/A转换实验

一、实验目的

1.了解芯片内部D/A转换模块设置方法。

2.了解D/A转换原理。

3.  了解Keil软件中逻辑分析仪的使用方法。

4.   了解用单片机产生正弦信号的基本方法。

二、实验原理

ADuC848中包含一个12位电压输出DAC模块,DAC模块中寄存器的设置如下:

DAC控制寄存器:DACCON

NC表示未定义;

DACPIN为DAC输出引脚选择;

1 = 设置DAC输出引脚为Pin 13 (AINCOM); 

0 = 设置DAC输出引脚为Pin 14 (DAC);

DAC8为DAC转换位数模式选择位;

1 = 设置DAC为8位转换;

0 = 设置DAC为12位转换;

DACRN为DAC输出范围选择位;

1 = 设置DAC的输出范围为 0 V - AVDD;

0 = 设置DAC的输出范围为 0 V - 2.5 V (VREF);

DACCLR为DAC清除位;

1 = 设置DAC为正常操作模式;

0 = 复位DAC数据寄存器DACL/H to 0;

DACEN为DAC使能位

1 = 使能DAC转换;

0 = 不使能DAC转换;

DAC数据寄存器:DACH/L

DACH为12位转换的高位数据寄存器

四、程序流程图和源程序

1、主程序流程图

 

2、源程序清单

     DACCON EQU 0xfD  ;定义模数转换控制器

      DACH   EQU 0xfc  ;定义模数转换数据寄存器高8位

      DACL   EQU 0xfb  ;定义模数转换数据寄存器低8位

  ORG 0000H

      LJMP MAIN

      ORG 0200H

 MAIN:MOV DACCON , #0fH;    DAC operation

      CLR A   ;

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

PRG3:MOVR0,#09H;正弦波

MOVR4,#40H

LP11:MOV A,R0

    MOVCA,@A+PC

MOV  DACL,A   ;2

    ACALL DELAY ;2

INCR0;1

DJNZR4,LP11  ;2

  SJMP PRG3   ;2

DATA0:

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

DB 0F0H,0F6H,0FAH,0FDH,0FFH,0FFH,0FDH,0FAH,0F6H,0F0H

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

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

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

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

RET

DELAY: MOV R6,#10H

    MOV R7,#0A1H

DELAYLOOP: ;延时程序

    DJNZ R6,DELAYLOOP

    DJNZ R7,DELAYLOOP

    RET

      END

四、实验板插针配置: 

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

五、思考题

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

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

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

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



Pwm电机调速原理
对于电机的转速调整,我们是采用脉宽调制(PWM)办法,控制电机的时候,电源并非连续地向电机供电,而是在一个特定的频率下以方波脉冲的形式提供电能。不同占空比的方波信号能对电机起到调速作用,这是因为电机实际上是一个大电感,它有阻碍输入电流和电压突变的能力,因此脉冲输入信号被平均分配到作用时间上,这样,改变在始能端PE2 和PD5 上输入方波的占空比就能改变加在电机两端的电压大小,从而改变了转速。
此电路中用微处理机来实现脉宽调制,通常的方法有两种:
(1)用软件方式来实现,即通过执行软件延时循环程序交替改变端口某个二进制位输出逻
辑状态来产生脉宽调制信号,设置不同的延时时间得到不同的占空比。
(2)硬件实验自动产生PWM 信号,不占用CPU 处理的时间。
这就要用到ATMEGA8515L 的在PWM 模式下的计数器1,具体内容可参考相关书籍。

51单片机PWM程序
产生两个PWM,要求两个PWM波形占空都为80/256,两个波形之间要错开,不能同时为高电平!高电平之间相差48/256,
PWM这个功能在PIC单片机上就有,但是如果你就要用51单片机的话,也是可以的,但是比较的麻烦.可以用定时器T0来控制频率,定时器T1来控制占空比:大致的的编程思路是这样的:T0定时器中断是让一个I0口输出高电平,在这个定时器T0的中断当中起动定时器T1,而这个T1是让IO口输出低电平,这样改变定时器T0的初值就可以改变频率,改变定时器T1的初值就可以改变占空比。

*程序思路说明: *
* *
*关于频率和占空比的确定,对于12M晶振,假定PWM输出频率为1KHZ,这样定时中断次数 *
*设定为C=10,即0.01MS中断一次,则TH0=FF,TL0=F6;由于设定中断时间为0.01ms,这样*
*可以设定占空比可从1-100变化。即0.01ms*100=1ms *
******************************************************************************/
#include <REGX51.H>

#define uchar unsigned char
/*****************************************************************************
* TH0和TL0是计数器0的高8位和低8位计数器,计算办法:TL0=(65536-C)%256; *
* TH0=(65536-C)/256,其中C为所要计数的次数即多长时间产生一次中断;TMOD是计数器*
* 工作模式选择,0X01表示选用模式1,它有16位计数器,最大计数脉冲为65536,最长时 *
* 间为1ms*65536=65.536ms *
******************************************************************************/
#define V_TH0 0XFF
#define V_TL0 0XF6
#define V_TMOD 0X01

void init_sys(void); /*系统初始化函数*/
void Delay5Ms(void);

unsigned char ZKB1,ZKB2;

void main (void)
{
init_sys();
ZKB1=40; /*占空比初始值设定*/
ZKB2=70; /*占空比初始值设定*/
while(1)
{
if (!P1_1) //如果按了+键,增加占空比
{
Delay5Ms();
if (!P1_1)
{
ZKB1++;
ZKB2=100-ZKB1;
}
}

if (!P1_2) //如果按了-键,减少占空比
{
Delay5Ms();
if (!P1_2)
{
ZKB1--;
ZKB2=100-ZKB1;
}
}
/*对占空比值限定范围*/
if (ZKB1>99) ZKB1=1;
if (ZKB1<1) ZKB1=99;
}
}

/******************************************************
*函数功能:对系统进行初始化,包括定时器初始化和变量初始化*/
void init_sys(void) /*系统初始化函数*/
{
/*定时器初始化*/
TMOD="V"_TMOD;
TH0=V_TH0;
TL0=V_TL0;
TR0=1;
ET0=1;
EA="1";
}

//延时
void Delay5Ms(void)
{
unsigned int TempCyc = 1000;
while(TempCyc--);
}

/*中断函数*/
void timer0(void) interrupt 1 using 2
{
static uchar click="0"; /*中断次数计数器变量*/
TH0=V_TH0; /*恢复定时器初始值*/
TL0=V_TL0;
++click;
if (click>=100) click="0";

if (click<=ZKB1) /*当小于占空比值时输出低电平,高于时是高电平,从而实现占空比的调整*/
P1_3=0;
else
P1_3=1;

if (click<=ZKB2)
P1_4=0;
else
P1_4=1;

} <

1.下面是AVR的程序,51产生PWM波麻烦,可以用AVR。主要是设置存放的TOP值 (OCR1A的值),然后你要多大的占空比 再设置OCR1B的值,至于持续时间就更简单了,你要产生多久,就调用此函数就可以了哈
2.产生方波的频率计算公式(KHZ)
f=fclk(晶振)/{*N(1+OCRNA)}
N:代表分频因子
根据你要的产生方波的频率,就能算出OCRNA的值,就可以了!

/***************在OCR1B(PD4)上可测到100HZ的PWM波***********************/
/***************在OCR1A(PD5)上可测到50HZ的方波************************/
#include <iom16v.h>
#include <macros.h>
void PWM()
{
DDRD=0X30;//设置OC1B(PD4)和OC1A(PD5)为输出
TCCR1A=0X63;
TCCR1B=0X1B;

OCR1A=7;//得到10KHZ的PWM波
OCR1B=5;//得到2ms(1810/5)的高电平时间
}

PWM 主要是定时器 和 寄存器的配置 只要配置合适 PWM就出来了

  • stc鍗曠墖鏈浜х敓pwm,杩欐湁涓涓▼搴,鏈変汉鑳借缁嗚В閲婁笅瀹冩庝箞浜х敓pwm娉㈠悧...
    绛旓細閭d箞CCAP0H=pwm[0]; 锛宲wm[0]瀵瑰簲鏁板瓧閲岄潰鐨255锛屽瘎瀛樺櫒CCAP0H=255锛涜繖涓瘎瀛樺櫒绛変簬255锛PWM杈撳嚭灏辨槸涓涓皬鑴夊锛涗笅涓娆′腑鏂瑿CAP0H=240浜嗭紝鑴夊鏈夊鍔犱簡涓鐐癸紱鑷充簬CCAP0H閫佷竴涓暟鎹氨鏈夎剦瀹借緭鍑猴紝杩欎釜鏄敱鍗曠墖鏈纭欢鏈韩鍐冲畾鐨勶紱浣犵湅鐪嬫墜鍐屽氨鐭ラ亾浜嗭紱杩欎釜宸茬粡璇村緱寰堟槑鐧戒簡鍚э紱绱锛屾墦瀛楅兘鎵撲簡20鍒嗛挓锛
  • stc8051 鎬庝箞鐢ㄥ畾鏃跺櫒杈撳嚭pwm淇″彿 璇风粰涓弬鑰冪▼搴忓挴!
    绛旓細濡傛灉瑕佽緭鍑洪珮棰戜俊鍙凤紝璁╂柟娉㈢殑棰戠巼杈惧埌鍑犲崄K鐢氳嚦鍑犵櫨K鐨勮瘽锛屾渶濂界敤涓插彛鏉ュ彂銆傝屽鏋滀粎浠呮槸鍑燢璧吂鐨勮瘽閭e氨鐢ㄥ畾鏃跺櫒鍜備笅闈㈡槸涓浜涘弬鑰冦倂oid main(){ TOMD=0X02; //瀹氭椂鍣0宸ヤ綔鏂瑰紡浜 TH0=0XFE;TL0=0XFE;EA=1; //寮鎬讳腑鏂 ET0=1; //浣胯兘瀹氭椂鍣0涓柇 TRO=1; //寮瀹氭椂...
  • 璺眰STC绋嬪簭:涓や釜鎸夐敭鎺у埗鍗犵┖姣,杈撳嚭PWM
    绛旓細include "reg52.h"unsigned char count; //0.5ms娆℃暟鏍囪瘑 sbit pwm =P2^7 ; //PWM淇″彿杈撳嚭 sbit jia =P2^4; //瑙掑害澧炲姞鎸夐敭妫娴婭O鍙 sbit jan =P2^5; //瑙掑害鍑忓皯鎸夐敭妫娴婭O鍙 unsigned char jd; //瑙掑害鏍囪瘑 void delay(unsigned char i)//寤舵椂 { unsigned char j,k;...
  • 鐢STC鍗曠墖鏈鐨凱CA鍋氬畾鏃跺櫒,杈撳嚭PWM
    绛旓細鏃㈢劧浣犻夋嫨鐨STC鍗曠墖鏈甯CA锛屼负浠涔堜笉鐩存帴鍒╃敤PCA妯″潡閰嶇疆鎴PWM鍔熻兘锛岃涓涓嬪叿浣撳瀷鍙凤紝缁欎綘娈靛埄鐢≒WM浜х敓鍥哄畾棰戠巼鏂规尝鐨勪唬鐮佸弬鑰冦//***pwm.h define Start_PWM()CR = 1//PCA璁℃椂鍣ㄥ紑濮嬪伐浣 define Stop_PWM()CR = 0//PCA璁℃椂鍣ㄥ仠姝㈠伐浣 extern void InitPWM();extern void ChangePWM(uint16 f...
  • 姹傚熀浜鍗曠墖鏈篠TC125616AD鐨凜璇█PWM鐨缂栫▼ 鍒嗕笉澶氳阿璋
    绛旓細缁欎綘涓弬鑰 void InitPWM(void){ EA = 0;CCON = 0x00; //鍒濆鍖朠CA瀵勫瓨鍣 CMOD = 0x00; //鏃堕挓12鍒嗛锛岀姝㈡孩鍑轰腑鏂 CL = 0; //鍒濆鍖朠CA璁℃暟鍣 CH = 0;CCAP0H = CCAP0L = 0x80; //鍗犵┖姣00 CCAPM0 = 0x63; //8浣峆WM锛岀敱浣庡彉楂樹骇鐢熶腑鏂 CR = 1; //PCA...
  • 璺眰STC12C5A60S2鍗曠墖鏈鍐呴儴PWM 绋嬪簭
    绛旓細void pwm_init(void) //PWM鍒濆鍖栧嚱鏁帮紝鍒濆鍗犵┖姣斾负0 { CMOD=0x02; //0000 0010 绌洪棽鏃朵笉璁℃暟锛屼笉浜х敓涓柇锛屾椂閽熸簮涓篺osc/2,鍥犳杈撳嚭鍗犵敤鐜囦负fosc/512 CL=0x00;CH=0x00;CCAPM0=0x42; //0100 0010, 8浣 PWM CCAP0L=0x00;CCAP0H=0x00; //PWM瀹炵幇鏂规硶锛屽洜涓烘槸8浣嶏紝CL鍩虹璁...
  • 姹備竴涓 STC89C52RC鍗曠墖鏈簆wm璋冨厜鎺у埗C绋嬪簭 姹傚ぇ绁炲府蹇,鍗曠墖鏈鸿冭瘉鐢...
    绛旓細STC鍗曠墖鏈鍏锋湁PWM杈撳嚭鍔熻兘锛屾渶杩戠帺12864LCD涓囧勾鍘嗘椂锛岀敤鐨勬槸鏉滄磱鐨凢T4鏃堕挓鐢佃矾锛岀敤浠栨彁渚涚殑H鏂囦欢鎺у埗鏃讹紝鍏锋湁璋冨厜鍔熻兘锛岀敱浜庡彧鏄帺涓鐜╋紝娌℃湁璐拱婧愮爜锛岃岀綉涓婃祦琛岀殑绋嬪簭閮芥病鏈夋鍔熻兘锛屾棤濂堬紝鍙兘鑷繁寮勶紝濂藉湪鏉滆佸笀鍙婁汉鎵鍙婃棭鍦ㄧ綉绔欎腑澶囦笅浜嗚祫鏂欙紝绠鍗曟敀涓涓嬶紝灞呯劧鎴愬姛浜嗭紝骞舵垚鍔熺殑姹囧叆浜嗕竾骞村巻鐨勭▼搴...
  • stc12 鍗曠墖鏈 15KHZ PWM 鎬庝箞浜х敓?
    绛旓細include<reg52.h> sbit out_pwm=P0^1;char temp;void main(){ TMOD=0X01; // 璁剧疆瀹氭椂鍣0涓哄伐浣滄柟寮忥紙M1M0涓01锛塗H0=(65536-500)/256; //鑷姩璧嬪垵鍊 鏈楂樹綅 瀹氭椂0.5ms TL0=(65536-500)%256; // 鏈浣庝綅 EA=1; //寮鎬讳腑鏂 ET0=1; //寮瀹氭椂鍣0涓柇 TR0=1...
  • 鎴戠殑鍗曠墖鏈鏄stc 89c52銆 鎴戞兂鍒╃敤pwm,鎸夐敭鎺у埗8涓狶ED鎱㈡參鐨勪寒,鎱㈡參...
    绛旓細bit tick_Flag;uchar data Light[8];uchar data si;...void timer0() interrupt 1 using 1 {//涓柇閲岀殑鐗囨柇:80Hz浠ヤ笂灏辫兘绋冲畾鑰屼笉闂儊,鍗虫瘡绉掕嚦灏戣婧㈠嚭80*100娆 瀹氭椂0.1ms鑷杞藉ソ浜 si++ if(si>=100) si=0; //100绾т寒搴 LED0 = (si<Light[0]);LED1 = (si<Light[1]);LED2...
  • stc12c5a60s2鍗曠墖鏈鎬庝箞杈撳嚭50hz棰戠巼鐨刾wm
    绛旓細void PWM_init (void){//PWM鍒濆鍖栧嚱鏁 CMOD=0x02; //璁剧疆PCA瀹氭椂鍣,璁℃暟棰戠巼涓烘櫠鎸鐜/2 褰撲负12Mhz鏃,PWM杈撳嚭棰戠巼绾23.4Khz //CMOD=0x00; //璁剧疆PCA瀹氭椂鍣,璁℃暟棰戠巼涓烘櫠鎸鐜/12 褰撲负12Mhz鏃,PWM杈撳嚭棰戠巼绾3.9Khz //CMOD=0x04; //璁剧疆PCA瀹氭椂鍣,璁℃暟棰戠巼涓哄畾鏃跺櫒0鐨勬孩鍑虹巼锛屽鏋...
  • 扩展阅读:stc官网最新版下载 ... 安卓stc单片机编程软件 ... 宏晶stc单片机官网 ... stc单片机官网下载封装 ... plc基础知识指令27个 ... stc官网 ... 单片机pwm元器件 ... 单片机烧录一直在检测 ... stc8g1k08中文资料pdf ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网