普通51的话需要模拟PWM,如果是加强版51有内置PWM模块,
成都网站设计、成都做网站的关注点不是能为您做些什么网站,而是怎么做网站,有没有做好网站,给创新互联公司一个展示的机会来证明自己,这并不会花费您太多时间,或许会给您带来新的灵感和惊喜。面向用户友好,注重用户体验,一切以用户为中心。
PIC和AVR以及430还有STM也有集成PWM的型号!
如果是单纯输出方波的话就简单了。
程序如下:
//功能,按下P1_0的开关降低频率,按P1_1为升高频率
#includeAT89X52.H //引用AT89X52的库文件
#define uchar unsigned char //替换简称
#define uint unsigned int //替换简称
uchar sm; //定义临时变量
void delay_ms(uint ms) //延时子函数,一个循环12uS
{
while(--ms);
}
void T0_IRQ(void) interrupt TF0_VECTOR //定时器0中断函数
{
TH0=sm; //将变量赋予定时器0的高位
P2_0=!P2_0; //翻转IO
}
//寄存器初始化子函数
void mcu_init()
{
ET0=1; //开定时器0中断
EA=1; //开总中断
TMOD=0x01; //设置为16位定时器0
TH0=0xFF; //填充定时器高位
TR0=1; //开定时器0
sm=0xFF; //变量初始化
}
void main() //主函数
{
mcu_init(); //调用初始化函数
while(1) //主循环
{
if((!P1_0)||(!P1_1)) //检测是否有按键按下
{
delay_ms(8333); //延时去抖
if(!P1_0) //如果是P1_0按键按下
{
while(!P1_0); //等待按键放手
if(sm) //检测变量不为0
{
--sm; //自减1
P2_1=1; //取消边界LED
}
else P2_1=0; //到达边界点亮LED
}
else if(!P1_1) //否则如果P1_1按键按下
{
while(!P1_1); //等待按键放手
if(sm0xFF) //检测变量小于0xFF
{
++sm; //自加1
P2_1=1;
}
else P2_1=0;
}
}
}
}
以12M晶振,50ms为例
用定时器写
以下是中断程序
void pwm_1() interrupt 1
{
th0=(65536-50000)/256;
tl0=(65536-50000)%256;
P1^0=~P1^0;
}
如果是模拟出来的话,频率是1Mhz,首先你要有一个1Mx2的定时,这个2Mhz的定时每次计数到达的时候将对应的io口翻转,频率为1M周期为1us的方波就出来了。
大部分单片机都有pwm功能直接配置寄存器使能就可以输出对应的频率方波。
最好还是不要用延时函数
比较准确的方法是利用定时器
以c51为例:
/*********定时器方波************/
/*********16位定时器************/
/************机器周期1us********/
/*********占空比50%*************/
/*********方波周期1s*************/
int a; // 定义全局整形变量
void int() interrupt 1
{
设置定时器初值为500;
a++;
if(a == 1000)
{
"输出取反"
}
}
附上代码,讲解在后面:
public class Program
{
static void Main(string[] args)
{
ListPoint range = new ListPoint(5 * 5);
for (int i = 0; i 5; i++)
{
for (int j = 0; j 5; j++)
{
range.Add(new Point { X = j, Y = i });
}
}
//移动方向的顺序
MoveDirection[] md = new[]
假设你用的晶振为12M,用P1.0口输出周期为2ms的方波。使用定时器工作方式1.
至于计数初值的计算,授之以鱼不如授之以渔!
在定时器模式下,计数器的计数脉冲来自于晶振脉冲的12分频信号,即对机器周期进行计数。若选择12M晶振,则定时器的计数频率为1MHZ。假设定时时间为T,机器周期为T1,即12/晶振频率。X为定时器初值。则 X=2^n-T/T1。方式0,n=13,方式1时,n=16,方式2和方式3,n=8
自己算去吧!
#include reg51.h
void InitTimer0(void)//
{
TMOD = 0x01;
TH0 = 0x0FC; //计数器初值
TL0 = 0x18;
EA = 1;
ET0 = 1;
TR0 = 1;//开启定时器T0
}
void main(void)
{
InitTimer0();
}
void Timer0Interrupt(void) interrupt 1
{
TH0 = 0x0FC;//重新赋初值
TL0 = 0x18;
P1.0=~P1.0; //输出方波
}