可按照脚本分别控制8路PWM函数波形输出程序

发布者:深沉思考最新更新时间:2015-01-16 来源: 51hei关键字:脚本  PWM函数  波形输出 手机看文章 扫描二维码
随时随地手机看文章

 

 
[page]
下面是源代码:
#include
//#include
 
#define ONE_CYCLE_STEP 255
 
#ifdef AT89C2051_HEADER_FILE
#define PORT P1 //如果使用STC12C2052的话使用P1口作为输出口
#else
#define PORT P0 //否则使用P0口输出
#endif
 
#define LED_CNT 4 //定义输出口的端口数1-8 4代表使用0-3口输出
#define SCRIPT_CNT 6 //定义脚本数
 
//萤火虫结构
struct Firefly{
unsigned int brightness; //最大亮度值0-255
unsigned int timeCell; //时间间隔0-65535
unsigned int count; //运行控制变量:当前计数
unsigned char bn; //运行控制变量:当前亮度
};
 
//定义每个输出端口的执行脚本
//每个端口将执行SCRIPT_CNT次,然后不断循环执行
struct Firefly code fireFlyScript[][SCRIPT_CNT] = {
{{0,300,0,0},{255,400,0,0},{0,500,0,0},{100,600,0,0},{0,900,0,0},{0,500,0,0}},
{{255,300,0,0},{0,400,0,0},{0,500,0,0},{255,800,0,0},{0,700,0,0},{0,500,0,0}},
{{0,300,0,0},{0,400,0,0},{255,500,0,0},{50,1200,0,0},{0,300,0,0},{0,500,0,0}},
{{128,500,0,0},{255,300,0,0},{50,200,0,0},{0,1000,0,0},{255,1500,0,0},{50,100,0,0}},
{{0,900,0,0},{255,300,0,0},{50,200,0,0},{0,1000,0,0},{255,1500,0,0},{50,100,0,0}},
{{255,400,0,0},{255,300,0,0},{50,200,0,0},{0,1000,0,0},{255,1500,0,0},{50,100,0,0}},
{{0,200,0,0},{255,300,0,0},{50,200,0,0},{0,1000,0,0},{255,1500,0,0},{50,100,0,0}},
{{0,750,0,0},{255,300,0,0},{50,200,0,0},{0,1000,0,0},{255,1500,0,0},{50,100,0,0}}
};
 
//定义LED_CNT只萤火虫
struct Firefly fireFlies[LED_CNT];
 
//每只萤火虫的脚本计数器
unsigned char ffScript[LED_CNT];
 
//预先计算好的余弦函数表,PWM输出模拟函数曲线效果更好
unsigned char code cosValue[]={
0,0,0,0,0,0,0,0,1,1,1,2,2,3,3,4,4,5,6,6,7,8,
9,10,11,11,12,13,14,16,17,18,19,20,21,23,24,
25,27,28,29,31,32,34,35,37,39,40,42,44,45,47,
49,50,52,54,56,58,60,62,63,65,67,69,71,73,75,
77,80,82,84,86,88,90,92,94,97,99,101,103,105,
107,110,112,114,116,119,121,123,125,127,130,
132,134,136,139,141,143,145,148,150,152,154,
156,158,161,163,165,167,169,171,173,175,178,
180,182,184,186,188,190,191,193,195,197,199,
201,203,205,206,208,210,211,213,215,216,218,
220,221,223,224,226,227,228,230,231,232,234,
235,236,237,238,239,241,242,243,244,244,245,
246,247,248,249,249,250,251,251,252,252,253,
253,254,254,254,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,254,254,254,
253,253,252,252,251,251,250,249,249,248,247,
246,245,244,244,243,242,241,239,238,237,236,
235,234,232,231,230,228,227,226,224,223,221,
220,218,216,215,213,211,210,208,206,205,203,
201,199,197,195,193,192,190,188,186,184,182,
180,178,175,173,171,169,167,165,163,161,158,
156,154,152,150,148,145,143,141,139,136,134,
132,130,128,125,123,121,119,116,114,112,110,
107,105,103,101,99,97,94,92,90,88,86,84,82,
80,77,75,73,71,69,67,65,64,62,60,58,56,54,52,
50,49,47,45,44,42,40,39,37,35,34,32,31,29,28,
27,25,24,23,21,20,19,18,17,16,14,13,12,11,11,
10,9,8,7,6,6,5,4,4,3,3,2,2,1,1,1,0,0,0,0,0,0,0,
0
};
 
//计时器中断计数变量
unsigned int time0count_0;
 
//---------------------------------------
//名称 :定时器0中断服务程序
// :Timer0
//参数 :
//返回 :
//---------------------------------------
void Timer0(void) interrupt 1 
{                          
unsigned long cell; //计算用临时变量
unsigned char i,p;
TL0=0xE8; //重新给TL0赋初值
TH0=0xFF; //重新给TH0赋初值
 
//一个周期结束,检查脚本以及下一个周期的占空比
if(++time0count_0>ONE_CYCLE_STEP)
{
time0count_0 = 0;
//N路信号分别处理
for(i = 0;i
{
//一个脚本执行完毕,装入下一个脚本
if(++fireFlies[i].count>fireFlies[i].timeCell)
{
ffScript[i]++;
ffScript[i] = ffScript[i] % SCRIPT_CNT;
fireFlies[i] = fireFlyScript[i][ffScript[i]];
}
//计算下一个周期的占空比和亮度
cell = fireFlies[i].count;
cell *=360;
cell /= fireFlies[i].timeCell;
fireFlies[i].bn = (cosValue[cell]*fireFlies[i].brightness)/255;
//准备点亮某个LED
p=1<
//如果亮度值不为0则点亮
if(fireFlies[i].bn != 0)
{
PORT |= p;
}
else
{
PORT &= ~p;
}
}
}
//每个输出口占空比达到后输出低电平关闭LED
for(i = 0; i
{
p=1<
if(time0count_0==fireFlies[i].bn)PORT &= ~p;
}
}
 
void main()
{
unsigned i;
 
//关闭所有LED
PORT=0;
 
//初始化所有萤火虫和执行脚本
for(i = 0; i
{
fireFlies[i] = fireFlyScript[i][0];
ffScript[i] = 0;
}
 
//***定时器Timer0初始化***
TMOD&=0xF0;            //将TMOD的低4位定时器0控制部分清零
TMOD|=0x01;            //设置定时器0为方式1
TL0=0xE8;              //设置定时器0初值低8位
TH0=0xFF;              //设置定时器0初值高8位
TR0=1;                 //启动定时器0
ET0=1;                 //Timer0中断允许
 
//***开全局中断设置****
//定时器Timer0设置了中断允许,此处要开全局中断
EA=1;                  //开全局中断
 
while(1);               //死循环,单片机初始化后,将一直运行这个死循环
}
关键字:脚本  PWM函数  波形输出 引用地址:可按照脚本分别控制8路PWM函数波形输出程序

上一篇:基于51单片机的交通灯及其仿真
下一篇:51单片机串口控制继电器

推荐阅读最新更新时间:2024-03-16 13:51

S3c2440代码重定位详解4---拷贝代码和链接脚本的改进
本节进行拷贝代码的改进和链接脚本的改进。 前面重定位时,需要ldrb命令从的Nor Flash读取1字节数据,再用strb命令将1字节数据写到SDRAM里面 cpy: ldrb r4, /*首先从flash读出一个字节*/ strb r4, /*让后把数据写到SDRAM*/ add r1, r1, #1 add r2, r2, #1 cmp r2, r3 bne cpy JZ2440上的Nor Flash是16位,SDRAM是32位。 假设现在需要复制16byte数据, 采用ldrb命令每次只能加载1byte,因此CPU需要发出16次命令,内存控制器每次收到命令后,访问硬件Nor Flash,
[单片机]
S3c2440代码重定位详解4---拷贝代码和链接<font color='red'>脚本</font>的改进
融合LXI和脚本的优点(上)
Part I:什么是脚本? 多年来,可编程仪器表现为一种形式或另一种形式。虽然具体功能有所不同,但可编程仪器允许用户在仪器中创建和保存一组指令(或程序),并且按需运行指令。通常,早期可编程仪器的能力和容量都非常有限,这使可编程性的使用局限于相对小而简单的应用。较大或较复杂的应用需要使用单独计算机或控制器通过通信接口(常常是GPIB)控制可编程仪器。 计算技术和编程语言的进步以及嵌入式计算容量成本的稳定下降带来了新一代可编程仪器。新型仪器突破了旧的限制,极大提高了性能和灵活性。这些仪器的一个关键进步是采用脚本语言提供可编程性。本文详细介绍了脚本以及如何利用脚本简化测试与测量并且提高速度。 那什么是脚本呢?测试仪器的脚本与我们说
[测试测量]
可按照脚本分别控制8路PWM函数波形输出程序
详细制作过程: http://www.51hei.com/bbs/dpj-25725-1.html 下面是源代码: #include //#include #define ONE_CYCLE_STEP 255 #ifdef AT89C2051_HEADER_FILE #define PORT P1 //如果使用STC12C2052的话使用P1口作为输出口 #else #define PORT P0 //否则使用P0口输出 #endif #define LED_CNT 4 //定义输出口的端口数1-8 4代表使用0-3口输出 #define SCRIPT_
[单片机]
可按照<font color='red'>脚本</font>分别控制8路<font color='red'>PWM</font><font color='red'>函数</font><font color='red'>波形</font><font color='red'>输出</font>程序
STM32_DAC输出三角波形
今天的软件工程下载地址(360云盘): https://yunpan.cn/cPi8GB2DyeKzI 访问密码 1a45 STM32F10x的资料可以在我360云盘下载: https://yunpan.cn/crBUdUGdYKam2 访问密码 ca90 工程概要说明:该工程通过配置,输出固定三角波形,频率和幅度也是固定的,当然也是可以变化,如果有朋友需要可以微信公众号中留言。 关于“STM32F103 DAC输出三角波形” 我把重要的几点在下面分别讲述,若不明白,请关注微信公众号“EmbeddDeveloper”查阅或留言。 一、RCC时钟配置 该函数位于在bsp.c文件下面; 使能RCC时钟:RC
[单片机]
STM32_DAC<font color='red'>输出</font>三角<font color='red'>波形</font>
stm32 TIM定时器 PWM脉冲输出[操作寄存器+库函数]
脉冲调制(PWM)是利用微处理器对数字输出来对模拟电路的一种非常有效的技术。简单点说就是对确定频率的信号,调整其占空比。 stm32的定时器除了TIM6和TIM7外,其他定时器都可以产生PWM输出。其中高级定时器TIM1和TIM8可以产生多达7路的PWM输出。通用定时器可以产生4路的PWM输出。 在 stm32 TIM定时器 中我们是通过在中断中,翻转指定引脚的电平。在stm32中可以通过配置一个捕获/比较模式寄存器(TIMx_CCMR),设置通道引脚输出模式为PWM脉冲模式,在计时器计数到捕获/比较模式寄存器的值,指定引脚会输出一个有效电平,这样就可以通过定时器直接产生 PWM脉冲。这种方式下不需要开启中断。 这
[单片机]
stm32 TIM定时器 <font color='red'>PWM</font>脉冲<font color='red'>输出</font>[操作寄存器+库<font color='red'>函数</font>]
stm32定时器2输出10KHZ波形
紧接上一篇文章 /*! @function ******************************************************************************** PRE :RCC_Configuration ¹ : ---------------------------------------------------------------------------------- ² : : --------------------------------------------------------------------
[单片机]
STM8学习笔记---PWM互补波形输出
脉宽调制(PWM,Pulse Width Modulation)是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。 常见的用法是输出一路PWM波,可以通过调节PWM的频率和占空比来控制电路。还有另一种方法是输出一组互补的PWM波,这两个波形频率相同,相位相反,两组波形之间有死区控制时间。 STM8单片机自带PWM互补波形输出功能,通过资料可以看出 STM8共有3个死区时间可调的互补输出。 本次实验用的STMs8003单片机有2个互补输出。 PC6口和PC3口是定时器1通道1互补输出。PC7口和PC4口是定时器1通道2互补输出。 要配置输出互补P
[单片机]
STM8学习笔记---<font color='red'>PWM</font>互补<font color='red'>波形</font><font color='red'>输出</font>
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多精选电路图
换一换 更多 相关热搜器件
更多每日新闻
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved