求一个基于UCOSII流水灯的程序代码,结合STM32完成,麻烦请在KEIL UVISION4上建立起工程
只有一个任务为什么还要使用操作系统呢!我没有流水灯的程序。我给你提供一个LED闪烁的程序。
程序里面建立三个任务,开始任务,LED0任务和LED1任务。LED0每秒钟亮80毫秒,LED1亮300毫秒,灭300毫秒,以此循环。
#include stm32f10x.h
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "includes.h"
#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);
};
}
具体详解请参考开源电子网。
按键点灯程序,按一下按键灯亮(一直亮),再按一下灭,51单片机。
1、首先打开编程软件Keil uVision4,新建一个工程文件,在菜单栏中Project—— New uVision Project..。
2、然后选择单片机型号是 Atmel 公司的 AT89c52,单击OK。
3、再单击工具栏上新建按钮,新建一个文档,然后再点击保存,输入保存的路径,输入名字。
4、右键单击将这个文件添加到到工程文件夹中。
5、打开新建的文档,在文档中进行写程序。
6、点击下面方框中的图标,在Target项晶振的上写上:12.0代表晶振是12M,然后跳到Output项在生成HEX文件上打勾,点击OK。
7、然后点击三个编译按钮意思分别为:单个文件编译、编译已修改的文件、产生HEX文件,HEX文件用来下载到单片机上的,也可用来做仿真。
8、我们打开ISIS 7 Professional 软件,将程序添加到该电路中,然后按下启动按钮。
在keil中,怎么用汇编编写流水灯,先左移再右移,用汇编?
给你参考下,
;左移
star: mov r3,#8 ;设置流水位数
mov p0,#11111110b ;从p0.0开始
loop: acall d01s
mov a,p0 ;读取p0当前数据到acc
rl a ;左移一位
mov p0,a ;将左移的数据再送到p1
djnz r3,loop ;没有完成8位继续
;******************
mov p0,#0ffh ;熄灭所有灯
;******************
;右移
mov r3,#8 ;设置流水位数
mov p0,#01111111b ;从p0.7开始
loop1: acall d01s
mov a,p0 ;读取p0当前数据到acc
rr a ;右移一位
mov p0,a ;将左移的数据再送到p1
djnz r3,loop1 ;没有完成8位继续
ljmp star ;完成后返回到开始再来
;延时子程序
d01s: mov r0,#255
d01l1: mov r1,#198
djnz r1,$
djnz r0,d01l1
ret
end
用keil uvision4编一个51系列单片机流水灯,任务:流水灯要全亮,向左流水
#include "reg51.h"
#define uchar unsigned char
ucahr T[]={0xFF,0xFE,0xFC,0xF7,0xF0,0xE0,0xC0,0x80,0x00,0xFF};
void delay05s(void)
{
unsigned char i,j,k;
for(i=5;i0;i--)
for(j=200;j0;j--)
for(k=248;k0;k--);
}
void liudong()
{
ucahr i;
for(i=0;i8;i++)
{
P1=T[i];
delay05s();
}
}
void shanshuo()
{
ucahr i;
for(i=0;i5;i++)
{
P1=0x00;
delay05s();
P1=0xFF;
delay05s();
}
}
void main(void)
{
uchar i;
while(1)
{
P1=0x00;
delay05s();
liudong();
shanshuo();
}
}