求一个基于UCOSII流水灯的程序代码,结合STM32完成,麻烦请在KEIL UVISION4上建立起工程

求一个基于UCOSII流水灯的程序代码,结合STM32完成,麻烦请在KEIL UVISION4上建立起工程,第1张

只有一个任务为什么还要使用 *** 作系统呢!我没有流水灯的程序。我给你提供一个LED闪烁的程序。

程序里面建立三个任务,开始任务,LED0任务和LED1任务。LED0每秒钟亮80毫秒,LED1亮300毫秒,灭300毫秒,以此循环。

#include <stm32f10xh>

#include "sysh"

#include "usarth"

#include "delayh"

#include "ledh"

#include "includesh"

#define START_TASK_PRIO 10

#define START_STK_SIZE 64

OS_STK START_TASK_STK[START_STK_SIZE];

void start_task(void pdata);

//LED0ÈÎÎñ

#define LED0_TASK_PRIO 7

#define LED0_STK_SIZE 64

OS_STK LED0_TASK_STK[LED0_STK_SIZE];

void led0_task(void pdata);

#define LED1_TASK_PRIO 6

#define LED1_STK_SIZE 64

OS_STK LED1_TASK_STK[LED1_STK_SIZE];

void led1_task(void pdata);

int main(void)

{

Stm32_Clock_Init(9);

delay_init(72);

LED_Init();

LED_Init();

OSInit();

OSTaskCreate(start_task,(void )0,(OS_STK )&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO );

OSStart();

}

void start_task(void pdata)

{

OS_CPU_SR cpu_sr=0;

pdata = pdata;

OS_ENTER_CRITICAL();

OSTaskCreate(led0_task,(void )0,(OS_STK)&LED0_TASK_STK[LED0_STK_SIZE-1],LED0_TASK_PRIO);

OSTaskCreate(led1_task,(void )0,(OS_STK)&LED1_TASK_STK[LED1_STK_SIZE-1],LED1_TASK_PRIO);

OSTaskSuspend(START_TASK_PRIO);

OS_EXIT_CRITICAL();

}

void led0_task(void pdata)

{

while(1)

{

LED0=0;

delay_ms(80);

LED0=1;

delay_ms(920);

};

}

void led1_task(void pdata)

{

while(1)

{

LED1=0;

delay_ms(300);

LED1=1;

delay_ms(300);

};

}

具体详解请参考开源电子网。

要实现Proteus和Keil软件联调,需要安装一个插件,然后在proteus和keil中设置。其实,这两个软件联调,真的没有什么用,调试一个小程序时,单步调试还可以,调试大程序就不适用了。keil编译好了,在proteus仿真测试就行,仿真效果不对,就改程序。即使是联调,有问题改程序也并不省事。

你有几个错误:

1 你的定时器没有重装,导致第一次中断和后面的中断时间不一样,第一次时间短,后面的时间一直是以65536个周期中断的

2 你在中断函数里用了 for 循环,for循环是一下子就执行完了的,而不是你想象的每中断一次才执行一次

for(a=0;a<8;a++)

{

P1=(P1<<1)+1; //----这一句,使得你的第二个灯亮,其实第三,四,五个都亮了,但是因为你的

//----For循环太快了,你看不出来

};

if(a==8) //---执行完for之后,a肯定等于8,所以执行下面的,结果就是第一个灯亮

P1=0xfe;

3 我给你改正的,程序:功能是先是第一个灯亮,再是第一个灯灭,亮2,然后2灭,亮3

void time1() interrupt 3

{

tt++;

if(tt==10)

{

tt = 0; //---这句表示中断10次换一个灯,不可少

//----如果没有这句tt = 0,则成了中断256次才换一个灯

P1 =~(1<<aa); //---下面这三句,你好好想想是为什么,如果不明白再问我

//---最好要自己思考,想明白

aa++;

aa &= 0x07;

}

//----别忘记装入初值,你这个应该是10ms中断,然后是100ms换一次灯

//-----如果你不装初值,就成了 65536ms中断一次,再加上你前面不加上 tt = 0;

//------就成了16秒才换一次灯

TH1=0xd8;

TL1=0xf0;

}

#include <reg51h>

#include<intrinsh>

#define uchar unsigned char

uchar j,temp;

void delay(unsigned int ms)

{

uchar t;

while(ms--)

for(t=0;t<123;t++);

}

void main()

{

P1=0xff;

delay(500);

temp=0xfe; //有点怪,led接在P23~P26

for(j=0;j<4;j++)

{

P1=temp;

delay(500);

temp=_crol_(temp,1);

}

P1=0xff;

while(1);

}

1灭)。编译器keil

C代码如下:

#include<reg51h>

#include<intrinsh>

//包含循环左移函数

_cro_l头文件

unsigned

char

tmp;

//中间变量

//////////////////////////////////////////////////////////////////////////////////////////////////

//

延时子程序

////////////////////////////////////////////////////////////////////////////////////////////////

void

delay(unsigned

int

cnt)

{

while(--cnt);

}

//////////////////////////////////////////////////////////////////////////////////////////////////

//

主函数

////////////////////////////////////////////////////////////////////////////////////////////////

main()

{

while(1)

//外层循环

{

tmp

=

0xfe;

P1

=

tmp;

while(1)

//内层循环,执行1、3、5、7亮灯循环

{

delay(30000);

//延时以便能观察到灯亮移动,自己可以调整时间,由晶振和实参决定

tmp

=

_crol_(tmp,2);

P1

=

tmp;

if(tmp

==

0xbf)

//判断是否已经点亮到第7灯。是,则退出进入2、4、6、8循环

{

break;

}

}

tmp

=

0xfd;

P1

=

tmp;

while(1)

//内层循环,执行2、4、6、8亮灯循环

{

delay(30000);

//延时以便能观察到灯亮移动,自己可以调整时间,由晶振和实参决定

tmp

=

_crol_(tmp,2);

P1

=

tmp;

if(tmp

==

0x7f)

//判断是否已经点亮到第8灯。是,则退出进入1、3、5、7循环

{

break;

}

}

}

}

以上就是关于求一个基于UCOSII流水灯的程序代码,结合STM32完成,麻烦请在KEIL UVISION4上建立起工程全部的内容,包括:求一个基于UCOSII流水灯的程序代码,结合STM32完成,麻烦请在KEIL UVISION4上建立起工程、Proteus和Keil软件联调,使用循环右移功能仿真流水灯程序、我用keil c51编了一个流水灯程序,编译无误却只有第一和第二个灯亮了,最后停在第一个灯处不动等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10121214.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存