久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
STM32+ucosii設計3人搶答器源程序
[打印本頁]
作者:
Linming
時間:
2021-6-19 22:07
標題:
STM32+ucosii設計3人搶答器源程序
這是ucosii操作系統設計,3人搶答器,使用國信長天CT117E開發板,單片機是stm32f103rbt6,使用外設有LCD屏幕,數碼管,LED燈,按鍵以及蜂鳴器
單片機源程序如下:
#include "led.h"
#include "lcd.h"
#include "key.h"
#include "exti_a.h"
#include "sys.h"
#include "includes.h"
#include "stm32f10x.h"
#include "seg.h"
#include "buzz.h"
#define TASK_STK_SIZE 512 //任務堆棧長度
OS_STK TaskStartStk[512]; //定義任務堆棧區//--------------------------------------------------------------------------------------------
RCC_ClocksTypeDef rcc_clocks; //定義一個全局使用的芯片時鐘頻率結構變量
OS_STK Task_LED1_Stk[TASK_STK_SIZE]; //定義任務堆棧區
OS_STK Task_LED2_Stk[TASK_STK_SIZE]; //定義任務堆棧區
OS_STK Task_LED3_Stk[TASK_STK_SIZE]; //定義任務堆棧區
OS_STK Task_LED4_Stk[TASK_STK_SIZE]; //定義任務堆棧區
OS_STK Task_COUNT_Stk[TASK_STK_SIZE]; //定義任務堆棧區
OS_STK Task_DIS_Stk[TASK_STK_SIZE]; //定義任務堆棧區
INT8U err; //錯誤類型變量
//--------------------------------------------------------------------------------------------
OS_EVENT *KEY1_Down; //聲明KEY1鍵按下信號量
OS_EVENT *KEY2_Down; //聲明KEY2鍵按下信號量
OS_EVENT *KEY3_Down; //聲明KEY3鍵按下信號量
OS_EVENT *KEY4_Down; //聲明KEY4鍵按下信號量
//--------------------------------------------------------------------------------------------
void TaskStart (void *pdata);
void Task_KEY1 (void *pdata); //聲明任務
void Task_KEY2 (void *pdata); //聲明任務
void Task_KEY3 (void *pdata); //聲明任務
void Task_KEY4 (void *pdata); //聲明任務
void Task_COUNT (void *pdata); //聲明任務
void Task_DIS (void *pdata); //聲明任務
u8 flag=0;
u8 play1=0;
u8 play2=0;
u8 play3=0;
u8 cnt=30;
u8 wflag=0;
void SysTick_Init (void)
{
RCC_GetClocksFreq(&rcc_clocks); //讀取系統時鐘頻率
//設置嘀嗒節拍中斷周期為rcc_clocks.HCLK_Frequency/OS_TICKS_PER_SEC(1mS)
//設置嘀嗒節拍中斷優先級為最低搶占優先級
SysTick_Config(rcc_clocks.HCLK_Frequency / OS_TICKS_PER_SEC);
}
//--------------------------------------------------------------------------------------------
int main(void)
{
OSInit( ); //初始化uCOS_II
//創建起始任務TaskStart(優先級0)
OSTaskCreate(TaskStart, (void *) 0, &TaskStartStk[512 - 1], 0);
OSStart( ); //啟動多任務管理
}
void TaskStart (void *pdata)
{
pdata = pdata;
/*開始:CPU工作參數及外設工作狀態初始化*/
//設置優先級分組:搶占優先級3位(8級)和響應優先級1位(2級)
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);
//設置向量表的位置和偏移:在FLASH中偏移為0
NVIC_SetVectorTable(NVIC_VectTab_FLASH,0);
SysTick_Init(); //設置uC/OS的時鐘
STM3210B_LCD_Init();
LCD_SetTextColor(Black);
LCD_SetBackColor(White);
LCD_Clear(White);
LCD_DisplayStringLine(Line2,"Xuhaipeng");
LCD_DisplayStringLine(Line3,"scorecard");
LCD_DisplayStringLine(Line4,"play1:00");
LCD_DisplayStringLine(Line5,"play2:00");
LCD_DisplayStringLine(Line6,"play3:00");
OSTimeDlyHMSM(0, 0, 0, 200); //等待0.5秒
LED_Init(); //LED輸出初始化
LED_Control(LEDALL,0);
Key_Init(); //按鍵輸入初始化
EXTI_InitInit(); //外部中斷初始化
STM3210B_SEG_Init();
SEG_DisplayValue(0,0,0);
/*結束:CPU工作參數及外設工作狀態初始化*/
/*開始:創建工作任務*/
OSTaskCreate(Task_KEY1, (void *)0, &Task_LED1_Stk[TASK_STK_SIZE - 1], 1);
OSTaskCreate(Task_KEY2, (void *)0, &Task_LED2_Stk[TASK_STK_SIZE - 1], 2);
OSTaskCreate(Task_KEY3, (void *)0, &Task_LED3_Stk[TASK_STK_SIZE - 1], 3);
OSTaskCreate(Task_KEY4, (void *)0, &Task_LED4_Stk[TASK_STK_SIZE - 1], 4);
OSTaskCreate(Task_COUNT, (void *)0, &Task_COUNT_Stk[TASK_STK_SIZE - 1],5);
OSTaskCreate(Task_DIS, (void *)0, &Task_DIS_Stk[TASK_STK_SIZE - 1], 6);
/*結束:創建工作任務*/
/*開始:創建信號量*/
KEY1_Down = OSSemCreate(0); //創建KEY1按下信號量
KEY2_Down = OSSemCreate(0); //創建KEY2按下信號量
KEY3_Down = OSSemCreate(0); //創建KEY3按下信號量
KEY4_Down = OSSemCreate(0); //創建KEY4按下信號量
/*結束:創建信號量*/
OSTaskDel(OS_PRIO_SELF);
}
//--------------------------------------------------------------------------------------------
//KEY1處理任務
void Task_KEY1 (void *pdata)
{
pdata = pdata;
for (;;)
{
OSSemPend(KEY1_Down, 0, &err); //等待鍵按下消息
OSTimeDlyHMSM(0, 0, 0, 20); //等待20mS
if (!GPIO_ReadInputDataBit(KEY1_PORT, KEY1_PIN))
{ //如果KYE輸入仍為低則確認鍵按下
LED_Control(LED1,1);//led亮
BuzzOn();
if(flag==1)
{
flag=0;
if(cnt>20)play1=play1+2;
else play1=play1+1;
}
if(play1>=10) wflag=1;
OSTimeDlyHMSM(0, 0, 0, 500); //等待0.5秒
LED_Control(LEDALL,0);
BuzzOff();
}
while (!GPIO_ReadInputDataBit(KEY1_PORT, KEY1_PIN)) //等待鍵松開
{
OSTimeDlyHMSM(0, 0, 0, 20); //等待20mS
};
}
}
//--------------------------------------------------------------------------------------------
//KEY2處理任務
void Task_KEY2 (void *pdata)
{
pdata = pdata;
for (;;)
{
OSSemPend(KEY2_Down, 0, &err); //等待鍵按下消息
OSTimeDlyHMSM(0, 0, 0, 20); //等待20mS
if (!GPIO_ReadInputDataBit(KEY2_PORT, KEY2_PIN))
{ //如果KYE輸入仍為低則確認鍵按下
LED_Control(LED2,1);//led亮
BuzzOn();
if(flag==1)
{
flag=0;
if(cnt>20)play2=play2+2;
else play2=play2+1;
}
if(play2>=10) wflag=2;
OSTimeDlyHMSM(0, 0, 0, 500); //等待0.5秒
LED_Control(LEDALL,0);
BuzzOff();
}
while (!GPIO_ReadInputDataBit(KEY2_PORT, KEY2_PIN)) //等待鍵松開
{
OSTimeDlyHMSM(0, 0, 0, 20); //等待20mS
};
}
}
//--------------------------------------------------------------------------------------------
//KEY3處理任務
void Task_KEY3 (void *pdata)
{
pdata = pdata;
for (;;)
{
OSSemPend(KEY3_Down, 0, &err); //等待鍵按下消息
OSTimeDlyHMSM(0, 0, 0, 20); //等待20mS
if (!GPIO_ReadInputDataBit(KEY3_PORT, KEY3_PIN))
{ //如果KYE輸入仍為低則確認鍵按下
LED_Control(LED3,1);//led亮
BuzzOn();
if(flag==1)
{
flag=0;
if(cnt>20)play3=play3+2;
else play3=play3+1;
}
if(play3>=10) wflag=3;
OSTimeDlyHMSM(0, 0, 0, 500); //等待0.5秒
LED_Control(LEDALL,0);
BuzzOff();
}
while (!GPIO_ReadInputDataBit(KEY3_PORT ,KEY3_PIN)) //等待鍵松開
{
OSTimeDlyHMSM(0, 0, 0, 20); //等待20mS
};
}
}
//--------------------------------------------------------------------------------------------
//KEY4處理任務
void Task_KEY4(void *pdata)
{
pdata = pdata;
for (;;)
{
OSSemPend(KEY4_Down, 0, &err); //等待鍵按下消息
OSTimeDlyHMSM(0, 0, 0, 20); //等待20mS
if (!GPIO_ReadInputDataBit(KEY4_PORT, KEY4_PIN))
{ //如果KYE輸入仍為低則確認鍵按下
LED_Control(LED4,1);//led亮
flag=1;cnt=30;
OSTimeDlyHMSM(0, 0, 0, 500); //等待0.5秒
LED_Control(LEDALL,0);
}
while (!GPIO_ReadInputDataBit(KEY4_PORT ,KEY4_PIN)) //等待鍵松開
{
OSTimeDlyHMSM(0, 0, 0, 20); //等待20mS
};
}
}
void Task_COUNT(void *pdata)
{
for(;;)
{
if(flag==1) cnt-- ;
OSTimeDlyHMSM(0, 0,1,0);
if(cnt==0) flag=0;
SEG_DisplayValue(0,cnt/10,cnt%10);
}
}
void Task_DIS(void *pdata)
{
u8 str1[20];
u8 str2[20];
for(;;)
{
snprintf((char*)str1, sizeof(str1), "play1:%02d", play1);
snprintf((char*)str2, sizeof(str2), "play2:%02d", play2);
LCD_DisplayStringLine(Line4,str1);
LCD_DisplayStringLine(Line5,str2);
if(wflag==1){
flag=0;
cnt=0;
LCD_DisplayStringLine(Line7,"play1 win");
}else if(wflag==2){
flag=0;
cnt=0;
LCD_DisplayStringLine(Line7,"play2 win");
}else if(wflag==3){
flag=0;
cnt=0;
LCD_DisplayStringLine(Line7,"play3 win");
}
}
}
復制代碼
所有資料51hei提供下載:
qiangdaqi.7z
(236.33 KB, 下載次數: 31)
2021-6-20 03:37 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
liesnake
時間:
2021-6-20 07:50
樓主這個例子不錯,如果能有pcb等硬件就完美了。
歡迎光臨 (http://m.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
国产超碰人人模人人爽人人添
|
青青草在线观看视频
|
欧美日韩视频一区二区
|
日韩久久网
|
伦理一区二区
|
精品少妇一区二区三区免费观
|
av色在线
|
亚洲精品一二三四区
|
天天射天天干天天操
|
国产精品嫩草影院桃色
|
亚洲成人免费网站
|
亚洲色欲色欲www在线观看
|
久久精品日韩
|
激情综合网站
|
在线色
|
黄色大片av
|
黄色福利
|
久久久久久艹
|
黄免费视频
|
谁有毛片网址
|
福利小视频在线观看
|
亚洲成a人
|
国产一级视频在线观看
|
婷婷视频在线
|
欧美日韩在线播放
|
五月婷婷综合网
|
xxxx色
|
av资源在线
|
国产不卡在线视频
|
天天射天天射
|
国产特黄
|
日韩免费一级片
|
色综合激情
|
综合激情网
|
免费观看av
|
国产精品网站在线观看
|
国产成人免费在线
|
伊人91
|
国产极品在线观看
|
一级片av
|
亚洲aaaaaa
|