导航:首页 > 编程语言 > stc单片机pwm汇编程序

stc单片机pwm汇编程序

发布时间:2023-12-20 13:43:35

① 基于STC51系列单片机的SPWM波形实现,程序如何编写急急急急

/*********************************************************
// 载波比选为N=24,调制比M=Uc/Ur=1,晶振频率12M
// 正弦波频率50Hz
// 高电平的宽度Tpw = Tt/2*(1+Msimwt)
// 低电平的宽度Tpw = Tt/2*(1-Msimwt)
// Tt周期
// T2是产生SPWM波形,并从P1^1输出,用导线连接到P3.4作为测试频率使用。

// T1工作在定时方式1,定时1s
// T0工作在计数方式,对输入的脉冲进行计数,溢出产生中断。
// 16位计数器最大值是65536,1s内可能会产生多次溢出,所以在中断处理程序对中断的次数进行
// 计数。1s到后,将中断的计数器里的计数值取出进行综合处理,处理后的数据送显示。

//信号频率的计算方法:
// T0工作在计数方式,假设1s内溢出C1次,最后未溢出的计数值是C2,则频率公式为:
// F=C1*2^16+C2 = C1*65536+TH0*256+TL0)

//使用12MHz时钟,测量的最大范围是不大于500KHz。
*********************************************************/

#include "reg52.h"
#define uchar unsigned char
#define uint unsigned int
uchar disp[8]={0,0,0,0,0,0,0,0};

uchar FreStr[]="Friquency is:";

uchar T0count,T1count;

uchar code x[]={66,38,26,89,15,97,7,102,2,103,1,102,2,
97,7,89,15,78,26,66,38,38,66,26,78,15,
89,7,97,2,102,1,103,1,103,2,102,7,97,15,
89,26,78,38,66};
uchar ky,kc,count=255;
sbit L1=P1^1;

void delayms(uchar ms)

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

//LCD定义开始
//以下三个是定义LCD的引脚
sbit lcden=P0^5;
sbit lcdwrite=P0^6;
sbit lcdrs=P0^7;

//延时程序
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
//lcd的写指令
void write_com(uchar com)
{
lcdrs=0;
lcden=0;
P2=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
//lcd的写数据
void write_data(uchar da)
{
lcdrs=1;
lcden=0;
P2=da;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
//初始化
void Lcd_init()
{
lcdwrite=0;
lcden=0;
write_com(0x38); //16*2显示,5*7点阵,8位数据
write_com(0x0c);//显示开,关光标
write_com(0x06); //移动光标
write_com(0x01);//清除LCD的显示内容
}
//LCD定义结束

//计算频率值
void calc()
{
uchar i;
long frequency;
frequency=(T0count*256+TH0)*256+TL0;
for(i=7;i>0;i--)
{
disp[i]=frequency%10;
frequency=frequency/10;
}
disp[0]=frequency;
}

void init()
{
T0count=0;
T1count=0;
TH0=0;
TL0=0;
}

void main()
{
uchar dis;
init();
Lcd_init();
TMOD=0x15;
TH1=(65536-5*110592/12)/256;
TL1=(65536-5*110592/12)/256%10;
ET1=1;
ET0=1;
EA=1;
TR1=1;
TR0=1;

//以下四句的作用是在P1.1引脚上形成1000Hz的脉冲,用导线连接到P3.4作为测试用。将其中
//高8位和低8位的初始值更改后可输出不同频率的脉冲。
T2MOD = 0x02;
TH2=255-x[ky];
TL2=255-x[ky];
ET2=1;
EX0=1;
TR2=1;
L1=1;

write_com(0x80);
for(dis=0;dis<12;dis++)
write_data(FreStr[dis]);

while(1)
{
write_com(0xC0);
for(dis=0;dis<8;dis++)
write_data(disp[dis]+0x30); //显示频率
}
}

//计算输入脉冲的次数
void time0() interrupt 1
{
T0count++;
}

//计算1s时间
void time1() interrupt 3
{
TH1=(65536-5*110592/12)/256;
TL1=(65536-5*110592/12)/256%10;

if(T1count==20)
{
calc();
init();
}
else T1count++;
}

//这是产生SPWM波形、
void M() interrupt 5
{
TH2=255-x[ky];
TL2=255-x[ky];
kc++;
if(kc==count)
{
kc=0;

L1=~L1;

ky++;

if(ky==49) ky=0;
}
}

//这是使用外部中断0可以调整输出波形的频率
void MM() interrupt 0
{
delayms(300);
if(INT0==0)
{
count=count-5;
if(count==0) count=255;
}
}

② STC15W4K32S4单片机怎么使用自带的PWM功能同时输出控制3个电机

/*任意周期和任意占空比DUTY%的PWM*/
#define CYCLE 6000L //定义PWM周期(最大值为32767)
sbit PWM2=P3^7;
sbit PWM3=P2^1;
sbit PWM4=P2^2;

void pwminit()
{ P_SW2 |= 0x80;
PWMCFG = 0x00; //配置PWM的输出初始电平为低电平
PWMCKS = 0x0f; //选择PWM的时钟为Fosc/(0+1)
PWMC = CYCLE; //设置PWM周期,定义PWM周期(最大值为32767)
PWM2CR = 0x00; //选择PWM2输出到P3.7,不使能PWM2中断
PWM3CR = 0x00;
PWM4CR = 0x00;
PWM2T1 = 0x0001;
PWM2T2 = 0;
PWM3T1 = 0x0001;
PWM3T2 = 0;
PWM4T1 = 0x0001;
PWM4T2 = 0;
PWMCR |= 0x80; //使能PWM模块
P_SW2 &=~0x80;
}
void pwm2( unsigned int DUTY) //PWM2
{
if(DUTY==0)
{
PWMCR &=~0x01;
PWM2=0;
}
else if (DUTY==100)
{
PWMCR &=~0x01;
PWM2=1;
}
else
{
P_SW2 |= 0x80; //使能访问PWM在扩展RAM区的特殊功能寄存器XSFR
PWM2T1 = 0x0001; //设置PWM2第1次反转的PWM计数
PWM2T2 = CYCLE * DUTY / 100; //设置PWM2第2次反转的PWM计数
P_SW2 &=~0x80; //占空比为(PWM2T2-PWM2T1)/PWMC
PWMCR |= 0x01; //使能PWM信号输出

}

}
void pwm3(unsigned int DUTY) //PWM3
{
if(DUTY==0)
{
PWMCR &=~0x02;
PWM3=0;
}
else if(DUTY==100)
{
PWMCR &=~0x02;
PWM3=1;
}
else
{
P_SW2 |= 0x80;
PWM3T1 = 0x0001;
PWM3T2 = CYCLE * DUTY / 100;
P_SW2 &=~0x80;
PWMCR |= 0x02;

}
}
void pwm4(unsigned int DUTY) //PWM4
{
if(DUTY==0)
{
PWMCR &=~0x04;
PWM4=0;
}
else if (DUTY==100)
{
PWMCR &=~0x04;
PWM4=1;
}
else
{
P_SW2 |= 0x80;
PWM4T1 = 0x0001;
PWM4T2 = CYCLE * DUTY / 100;
P_SW2 &=~0x80;
PWMCR |= 0x04;

}
}

③ STC单片机输出PWM信号,频率要25KHz,请大神指教,怎么实现,或者直接给我一个程序,谢谢!

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的溢出率,如果让定时器0设为16位计数模式,其溢出频率可以在很大范围内调节,从而以产生很高或很低的PWM频率
CL=0x00;
CH=0x00;
CCAPM1=0x42; //PWM1设置PCA工作方式为PWM方式(0100 0010)
CCAP1L=0x00; //设置PWM1初始值与CCAP0H相同
CCAP1H=0x00; // PWM1初始时为0
CR=1; //启动PCA定时器
}
实际上要产生低频率的PWM波,不用其硬件PWM功能完全可以
用定时器中断方式即可实现
让定时器 200us中断一次(中断不算频繁呀) ,设一变量a,每次中断a加1,100次就是20ms,,另设一变量b,数值在1-100之间,每次中断比较a和 b的大小,如果a<b,则引脚 输出高电平,否则为低电平,这样通过改变b的值,就可实现频率为50HZ,占空比1-100%可调的PWM方波

④ 单片机PWM程序是怎么编写的啊,能给一个简单的例子吗

有PWM功能的单片机入STC12系列单片机,直接给专用寄存器赋值开启相应定时器就可以了。普通单单片机,PWM需要用自己来调配。比如:
#include<reg51.h>
unsigned char pwhh,pwhl,pwlh,pwll;
bit flag;
sbit pwm=P1^0;
void t0isr() interrupt 1
{
if(flag)
{
TH0=pwhh;
TL0=pwhl;
}
else
{
TH0=pwlh;
TL0=pwll;
}
pwm=~pwm;
}
main()
{
TMOD=0x01;
pwhh=(65536-1000)/256;
pwhl=(65536-1000)%256;
pwlh=(65536-500)/256;
pwll=(65536-500)%256;
TH0=pwhh;
L0=pwhl;
TR0=1;
ET0=1;
EA=1;
while(1);
}

阅读全文

与stc单片机pwm汇编程序相关的资料

热点内容
电脑电销加密电话号码破解 浏览:503
世界史纲pdf 浏览:133
湖北社保年审app叫什么名字 浏览:852
迈达克云服务器 浏览:597
mfc深入浅出从mfc设计到mfc编程 浏览:81
萤石云服务器连接设置 浏览:325
中国名着pdf 浏览:592
华为服务器设备序列号怎么看 浏览:319
跑永辉生活配送用什么app 浏览:149
ug识别符号命令在哪里 浏览:719
pdf文件改文字 浏览:732
查询qq号剑灵服务器地址 浏览:552
国家反诈中心app为什么要刷脸 浏览:303
iphone怎么修改dns服务器地址 浏览:85
bandizip解压位置 浏览:168
服务器的防火墙如何访问 浏览:306
javagoto关键字 浏览:847
广州少儿编程加盟排名榜 浏览:122
51单片机th0 浏览:294
冠军交易pdf 浏览:208