
sbit LED0=P1^0// 用sbit 关键字 定义 LED到P1.0端口,LED是自己任意定义且容易记忆的符号
void Delay(unsigned int t)//函数声明
/*------------------------------------------------
主函数
------------------------------------------------*/
void main (void)
{
unsigned int CYCLE=600,PWM_LOW=0//定义周期并赋值
while (1) //主循环
{
P1=0xff
Delay(60000) //特意加延时,可以看到熄灭的过程
for(PWM_LOW=1PWM_LOW<CYCLEPWM_LOW++){ //PWM_LOW表示低
//电平时间,这个循环中低电平时长从1累加到CYCLE(周期)的值,即600次
P1=0x00 //点亮LED
Delay(PWM_LOW)//延时长携尘度,600次循环中从1加至599
P1=0xff //熄灭LED
Delay(CYCLE-PWM_LOW)//延时长度,600次循环中从599减至1
}
P1=0x00
for(PWM_LOW=CYCLE-1PWM_LOW>0PWM_LOW--){ //与逐渐变亮相反的过程辩液禅
P1=0x00
Delay(PWM_LOW)//变小
P1=0xff
Delay(CYCLE-PWM_LOW)//变大
}
//主循环中添加其他需要一直工作的程序
}
}
/*------------------------------------------------
延时函数,含有输入参数 unsigned int t,无返回值
unsigned int 是定义无符号整形变量,其值的范围是
0~65535
------------------------------------------------*/
void Delay(unsigned int t)
{
while(--t)
}
#include <iom16.h>#include <avr_macros.h>
void Init_IO(void)
{
DDRA = 0xFF
PORTA = 0x00
}
/*以上代码51忽略*/
void LED1 (unsigned char x,unsigned char LEDx)
{
unsigned char Count = 0
Count = LEDx * 36 //最小0,最大 7 * 36 = 252,char型最大不能超耐察洞过255;
Count = Count + 1 // 加1的目的是针对LED0不亮
if(x <= Count) // <= 昌枯是针对LED0不亮
PORTA |= (1 << LEDx) //51怎么改?。 P0 |= (1 << LEDx) PWM正占空
else
if(x > Count)
PORTA &= ~(1 << LEDx) //51怎么改?。 P0 &= ~(1 << LEDx) PWM负占空
}
void main( void )
{
unsigned char delay = 0
unsigned char LEDx = 0
Init_IO()
while (1)
{
delay ++
if(delay == 250)
{
delay = 0
LEDx ++
if(LEDx > 7)
没空 LEDx = 0
}
LED1(delay,LEDx)
}
}
这个要用到软件的pwm,因为51的没有硬件的pwm所以只好自己写软件的了。首先,要做一个软件三角波发生器子程序,频率自己定辩罩,就是变亮变暗的周期。此函数的携卖闹返回值作为pwm的输入值。再做一个pwm的模拟程序,占空比(0-100)是三角波发生器的输出,pwm模拟程序控制某个端口输出1和0的占空比来控制灯 的明暗。pwm的思路是:检查设置值是否不等于0,是则端口置1,程序开始加1计数,计数后检查计数值是否等于设置值,如果等于则跳转,不等则继续加一,如果到100或者计数值等于设置值则使端口置0,一个pwm周期结束,如此重复就可以了。pwm周期自己看实际情况定义。如果要控制电灯泡的话,频率不用太高,50hz可配橡以了。关键是要做隔离,用光电隔离加双向可控硅来控制。呵呵,声明两点:1 源程序网上应该有的,或者自己买本书就什么也有了。2 不鼓励直接给别人源程序,给你思路再动手就应该很好弄了,总看别人的,不自己思考永远都是别人的。
http://www.programsalon.com/downloads88/sourcecode/embed/detail337156.html
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)