|
這是ucosii操作系統(tǒng)設(shè)計(jì),3人搶答器,使用國(guó)信長(zhǎng)天CT117E開(kāi)發(fā)板,單片機(jī)是stm32f103rbt6,使用外設(shè)有LCD屏幕,數(shù)碼管,LED燈,按鍵以及蜂鳴器
單片機(jī)源程序如下:
- #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 //任務(wù)堆棧長(zhǎng)度
- OS_STK TaskStartStk[512]; //定義任務(wù)堆棧區(qū)//--------------------------------------------------------------------------------------------
- RCC_ClocksTypeDef rcc_clocks; //定義一個(gè)全局使用的芯片時(shí)鐘頻率結(jié)構(gòu)變量
- OS_STK Task_LED1_Stk[TASK_STK_SIZE]; //定義任務(wù)堆棧區(qū)
- OS_STK Task_LED2_Stk[TASK_STK_SIZE]; //定義任務(wù)堆棧區(qū)
- OS_STK Task_LED3_Stk[TASK_STK_SIZE]; //定義任務(wù)堆棧區(qū)
- OS_STK Task_LED4_Stk[TASK_STK_SIZE]; //定義任務(wù)堆棧區(qū)
- OS_STK Task_COUNT_Stk[TASK_STK_SIZE]; //定義任務(wù)堆棧區(qū)
- OS_STK Task_DIS_Stk[TASK_STK_SIZE]; //定義任務(wù)堆棧區(qū)
- INT8U err; //錯(cuò)誤類(lèi)型變量
- //--------------------------------------------------------------------------------------------
- OS_EVENT *KEY1_Down; //聲明KEY1鍵按下信號(hào)量
- OS_EVENT *KEY2_Down; //聲明KEY2鍵按下信號(hào)量
- OS_EVENT *KEY3_Down; //聲明KEY3鍵按下信號(hào)量
- OS_EVENT *KEY4_Down; //聲明KEY4鍵按下信號(hào)量
- //--------------------------------------------------------------------------------------------
- void TaskStart (void *pdata);
- void Task_KEY1 (void *pdata); //聲明任務(wù)
- void Task_KEY2 (void *pdata); //聲明任務(wù)
- void Task_KEY3 (void *pdata); //聲明任務(wù)
- void Task_KEY4 (void *pdata); //聲明任務(wù)
- void Task_COUNT (void *pdata); //聲明任務(wù)
- void Task_DIS (void *pdata); //聲明任務(wù)
- 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); //讀取系統(tǒng)時(shí)鐘頻率
-
- //設(shè)置嘀嗒節(jié)拍中斷周期為rcc_clocks.HCLK_Frequency/OS_TICKS_PER_SEC(1mS)
- //設(shè)置嘀嗒節(jié)拍中斷優(yōu)先級(jí)為最低搶占優(yōu)先級(jí)
- SysTick_Config(rcc_clocks.HCLK_Frequency / OS_TICKS_PER_SEC);
- }
- //--------------------------------------------------------------------------------------------
- int main(void)
- {
- OSInit( ); //初始化uCOS_II
-
- //創(chuàng)建起始任務(wù)TaskStart(優(yōu)先級(jí)0)
- OSTaskCreate(TaskStart, (void *) 0, &TaskStartStk[512 - 1], 0);
-
- OSStart( ); //啟動(dòng)多任務(wù)管理
- }
- void TaskStart (void *pdata)
- {
- pdata = pdata;
-
- /*開(kāi)始:CPU工作參數(shù)及外設(shè)工作狀態(tài)初始化*/
- //設(shè)置優(yōu)先級(jí)分組:搶占優(yōu)先級(jí)3位(8級(jí))和響應(yīng)優(yōu)先級(jí)1位(2級(jí))
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);
- //設(shè)置向量表的位置和偏移:在FLASH中偏移為0
- NVIC_SetVectorTable(NVIC_VectTab_FLASH,0);
-
- SysTick_Init(); //設(shè)置uC/OS的時(shí)鐘
- 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);
- /*結(jié)束:CPU工作參數(shù)及外設(shè)工作狀態(tài)初始化*/
-
- /*開(kāi)始:創(chuàng)建工作任務(wù)*/
- 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);
- /*結(jié)束:創(chuàng)建工作任務(wù)*/
-
- /*開(kāi)始:創(chuàng)建信號(hào)量*/
- KEY1_Down = OSSemCreate(0); //創(chuàng)建KEY1按下信號(hào)量
- KEY2_Down = OSSemCreate(0); //創(chuàng)建KEY2按下信號(hào)量
- KEY3_Down = OSSemCreate(0); //創(chuàng)建KEY3按下信號(hào)量
- KEY4_Down = OSSemCreate(0); //創(chuàng)建KEY4按下信號(hào)量
- /*結(jié)束:創(chuàng)建信號(hào)量*/
-
- OSTaskDel(OS_PRIO_SELF);
- }
- //--------------------------------------------------------------------------------------------
- //KEY1處理任務(wù)
- 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輸入仍為低則確認(rèn)鍵按下
- 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)) //等待鍵松開(kāi)
- {
- OSTimeDlyHMSM(0, 0, 0, 20); //等待20mS
- };
- }
- }
- //--------------------------------------------------------------------------------------------
- //KEY2處理任務(wù)
- 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輸入仍為低則確認(rèn)鍵按下
- 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)) //等待鍵松開(kāi)
- {
- OSTimeDlyHMSM(0, 0, 0, 20); //等待20mS
- };
- }
- }
- //--------------------------------------------------------------------------------------------
- //KEY3處理任務(wù)
- 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輸入仍為低則確認(rèn)鍵按下
- 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)) //等待鍵松開(kāi)
- {
- OSTimeDlyHMSM(0, 0, 0, 20); //等待20mS
- };
- }
- }
- //--------------------------------------------------------------------------------------------
- //KEY4處理任務(wù)
- 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輸入仍為低則確認(rèn)鍵按下
- 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)) //等待鍵松開(kāi)
- {
- 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");
- }
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
qiangdaqi.7z
(236.33 KB, 下載次數(shù): 31)
2021-6-20 03:37 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|