找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1728|回复: 1
打印 上一主题 下一主题
收起左侧

STM32+ucosii设计3人抢答器源程序

[复制链接]
跳转到指定楼层
楼主
ID:438632 发表于 2021-6-19 22:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这是ucosii操作系统设计,3人抢答器,使用国信长天CT117E开发板,单片机是stm32f103rbt6,使用外设有LCD屏幕,数码管,LED灯,按键以及蜂鸣器

单片机源程序如下:
  1. #include "led.h"
  2. #include "lcd.h"
  3. #include "key.h"
  4. #include "exti_a.h"
  5. #include "sys.h"       
  6. #include "includes.h"
  7. #include "stm32f10x.h"
  8. #include "seg.h"
  9. #include "buzz.h"

  10. #define  TASK_STK_SIZE   512  //任务堆栈长度
  11. OS_STK   TaskStartStk[512];  //定义任务堆栈区//--------------------------------------------------------------------------------------------
  12. RCC_ClocksTypeDef  rcc_clocks;  //定义一个全局使用的芯片时钟频率结构变量

  13. OS_STK Task_LED1_Stk[TASK_STK_SIZE]; //定义任务堆栈区
  14. OS_STK Task_LED2_Stk[TASK_STK_SIZE]; //定义任务堆栈区
  15. OS_STK Task_LED3_Stk[TASK_STK_SIZE]; //定义任务堆栈区
  16. OS_STK Task_LED4_Stk[TASK_STK_SIZE]; //定义任务堆栈区
  17. OS_STK Task_COUNT_Stk[TASK_STK_SIZE]; //定义任务堆栈区
  18. OS_STK Task_DIS_Stk[TASK_STK_SIZE]; //定义任务堆栈区

  19. INT8U err;    //错误类型变量
  20. //--------------------------------------------------------------------------------------------
  21. OS_EVENT *KEY1_Down; //声明KEY1键按下信号量
  22. OS_EVENT *KEY2_Down; //声明KEY2键按下信号量
  23. OS_EVENT *KEY3_Down; //声明KEY3键按下信号量
  24. OS_EVENT *KEY4_Down; //声明KEY4键按下信号量
  25. //--------------------------------------------------------------------------------------------
  26. void TaskStart (void *pdata);
  27. void Task_KEY1 (void *pdata);           //声明任务
  28. void Task_KEY2 (void *pdata);           //声明任务
  29. void Task_KEY3 (void *pdata);           //声明任务
  30. void Task_KEY4 (void *pdata);           //声明任务
  31. void Task_COUNT (void *pdata);                           //声明任务
  32. void Task_DIS (void *pdata);                           //声明任务

  33. u8 flag=0;
  34. u8 play1=0;
  35. u8 play2=0;
  36. u8 play3=0;
  37. u8 cnt=30;
  38. u8 wflag=0;

  39. void SysTick_Init (void)
  40. {
  41.         RCC_GetClocksFreq(&rcc_clocks); //读取系统时钟频率
  42.        
  43.         //设置嘀嗒节拍中断周期为rcc_clocks.HCLK_Frequency/OS_TICKS_PER_SEC(1mS)
  44.         //设置嘀嗒节拍中断优先级为最低抢占优先级
  45.         SysTick_Config(rcc_clocks.HCLK_Frequency / OS_TICKS_PER_SEC);
  46. }
  47. //--------------------------------------------------------------------------------------------
  48. int main(void)
  49. {
  50.         OSInit( );  //初始化uCOS_II
  51.        
  52.         //创建起始任务TaskStart(优先级0)
  53.         OSTaskCreate(TaskStart, (void *) 0, &TaskStartStk[512 - 1], 0);
  54.        
  55.         OSStart( );  //启动多任务管理
  56. }

  57. void  TaskStart (void *pdata)
  58. {
  59.         pdata = pdata;
  60.        
  61.         /*开始:CPU工作参数及外设工作状态初始化*/
  62.         //设置优先级分组:抢占优先级3位(8级)和响应优先级1位(2级)
  63.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);
  64.         //设置向量表的位置和偏移:在FLASH中偏移为0
  65.         NVIC_SetVectorTable(NVIC_VectTab_FLASH,0);
  66.        
  67.         SysTick_Init(); //设置uC/OS的时钟
  68.         STM3210B_LCD_Init();
  69.         LCD_SetTextColor(Black);
  70.         LCD_SetBackColor(White);
  71.         LCD_Clear(White);
  72.         LCD_DisplayStringLine(Line2,"Xuhaipeng");
  73.         LCD_DisplayStringLine(Line3,"scorecard");
  74.         LCD_DisplayStringLine(Line4,"play1:00");
  75.         LCD_DisplayStringLine(Line5,"play2:00");
  76.         LCD_DisplayStringLine(Line6,"play3:00");
  77.         OSTimeDlyHMSM(0, 0, 0, 200);  //等待0.5秒

  78.         LED_Init();    //LED输出初始化
  79.         LED_Control(LEDALL,0);
  80.         Key_Init();    //按键输入初始化
  81.         EXTI_InitInit(); //外部中断初始化
  82.         STM3210B_SEG_Init();
  83.         SEG_DisplayValue(0,0,0);
  84.         /*结束:CPU工作参数及外设工作状态初始化*/
  85.        
  86.         /*开始:创建工作任务*/
  87.         OSTaskCreate(Task_KEY1, (void *)0, &Task_LED1_Stk[TASK_STK_SIZE - 1], 1);       
  88.         OSTaskCreate(Task_KEY2, (void *)0, &Task_LED2_Stk[TASK_STK_SIZE - 1], 2);                               
  89.         OSTaskCreate(Task_KEY3, (void *)0, &Task_LED3_Stk[TASK_STK_SIZE - 1], 3);
  90.         OSTaskCreate(Task_KEY4, (void *)0, &Task_LED4_Stk[TASK_STK_SIZE - 1], 4);        
  91.         OSTaskCreate(Task_COUNT, (void *)0, &Task_COUNT_Stk[TASK_STK_SIZE - 1],5);
  92.         OSTaskCreate(Task_DIS, (void *)0, &Task_DIS_Stk[TASK_STK_SIZE - 1], 6);                                  
  93.         /*结束:创建工作任务*/
  94.        
  95.         /*开始:创建信号量*/
  96.         KEY1_Down = OSSemCreate(0);   //创建KEY1按下信号量
  97.         KEY2_Down = OSSemCreate(0);   //创建KEY2按下信号量
  98.         KEY3_Down = OSSemCreate(0);   //创建KEY3按下信号量
  99.         KEY4_Down = OSSemCreate(0);   //创建KEY4按下信号量
  100.         /*结束:创建信号量*/
  101.        
  102.         OSTaskDel(OS_PRIO_SELF);
  103. }
  104. //--------------------------------------------------------------------------------------------
  105. //KEY1处理任务
  106. void  Task_KEY1 (void *pdata)
  107. {
  108.         pdata = pdata;
  109.        
  110.         for (;;)
  111.         {
  112.                 OSSemPend(KEY1_Down, 0, &err); //等待键按下消息
  113.        
  114.                 OSTimeDlyHMSM(0, 0, 0, 20);  //等待20mS
  115.                 if (!GPIO_ReadInputDataBit(KEY1_PORT, KEY1_PIN))
  116.                 { //如果KYE输入仍为低则确认键按下
  117.                         LED_Control(LED1,1);//led亮
  118.                         BuzzOn();
  119.                         if(flag==1)
  120.                         {
  121.                                 flag=0;
  122.                                 if(cnt>20)play1=play1+2;
  123.                                 else        play1=play1+1;
  124.                         }
  125.                         if(play1>=10)        wflag=1;
  126.                         OSTimeDlyHMSM(0, 0, 0, 500);  //等待0.5秒
  127.                         LED_Control(LEDALL,0);
  128.                         BuzzOff();
  129.                 }
  130.                 while (!GPIO_ReadInputDataBit(KEY1_PORT, KEY1_PIN)) //等待键松开
  131.                 {
  132.                         OSTimeDlyHMSM(0, 0, 0, 20);  //等待20mS
  133.                 };
  134.         }
  135. }
  136. //--------------------------------------------------------------------------------------------
  137. //KEY2处理任务
  138. void  Task_KEY2 (void *pdata)
  139. {
  140.         pdata = pdata;
  141.        
  142.         for (;;)
  143.         {
  144.                 OSSemPend(KEY2_Down, 0, &err); //等待键按下消息
  145.                
  146.                 OSTimeDlyHMSM(0, 0, 0, 20);  //等待20mS
  147.                 if (!GPIO_ReadInputDataBit(KEY2_PORT, KEY2_PIN))
  148.                 { //如果KYE输入仍为低则确认键按下
  149.                         LED_Control(LED2,1);//led亮
  150.                         BuzzOn();
  151.                         if(flag==1)
  152.                         {
  153.                                 flag=0;
  154.                                 if(cnt>20)play2=play2+2;
  155.                                 else        play2=play2+1;
  156.                         }
  157.                         if(play2>=10)        wflag=2;
  158.                         OSTimeDlyHMSM(0, 0, 0, 500);  //等待0.5秒
  159.                         LED_Control(LEDALL,0);
  160.                         BuzzOff();
  161.                 }
  162.                 while (!GPIO_ReadInputDataBit(KEY2_PORT, KEY2_PIN)) //等待键松开
  163.                 {
  164.                         OSTimeDlyHMSM(0, 0, 0, 20);  //等待20mS
  165.                 };
  166.         }
  167. }
  168. //--------------------------------------------------------------------------------------------
  169. //KEY3处理任务
  170. void  Task_KEY3 (void *pdata)
  171. {
  172.         pdata = pdata;
  173.        
  174.         for (;;)
  175.         {
  176.                 OSSemPend(KEY3_Down, 0, &err); //等待键按下消息
  177.                
  178.                 OSTimeDlyHMSM(0, 0, 0, 20);  //等待20mS
  179.                 if (!GPIO_ReadInputDataBit(KEY3_PORT, KEY3_PIN))
  180.                 { //如果KYE输入仍为低则确认键按下
  181.                         LED_Control(LED3,1);//led亮
  182.                         BuzzOn();
  183.                         if(flag==1)
  184.                         {
  185.                                 flag=0;
  186.                                 if(cnt>20)play3=play3+2;
  187.                                 else        play3=play3+1;
  188.                         }
  189.                         if(play3>=10)        wflag=3;
  190.                         OSTimeDlyHMSM(0, 0, 0, 500);  //等待0.5秒
  191.                         LED_Control(LEDALL,0);
  192.                         BuzzOff();
  193.                 }
  194.                 while (!GPIO_ReadInputDataBit(KEY3_PORT ,KEY3_PIN)) //等待键松开
  195.                 {
  196.                         OSTimeDlyHMSM(0, 0, 0, 20);  //等待20mS
  197.                 };
  198.         }
  199. }

  200. //--------------------------------------------------------------------------------------------
  201. //KEY4处理任务
  202. void  Task_KEY4(void *pdata)
  203. {
  204.         pdata = pdata;
  205.        
  206.         for (;;)
  207.         {
  208.                 OSSemPend(KEY4_Down, 0, &err); //等待键按下消息
  209.                
  210.                 OSTimeDlyHMSM(0, 0, 0, 20);  //等待20mS
  211.                 if (!GPIO_ReadInputDataBit(KEY4_PORT, KEY4_PIN))
  212.                 { //如果KYE输入仍为低则确认键按下
  213.                         LED_Control(LED4,1);//led亮
  214.                         flag=1;cnt=30;
  215.                         OSTimeDlyHMSM(0, 0, 0, 500);  //等待0.5秒
  216.                         LED_Control(LEDALL,0);
  217.                 }
  218.                 while (!GPIO_ReadInputDataBit(KEY4_PORT ,KEY4_PIN)) //等待键松开
  219.                 {
  220.                         OSTimeDlyHMSM(0, 0, 0, 20);  //等待20mS
  221.                 };
  222.         }
  223. }

  224. void Task_COUNT(void *pdata)
  225. {
  226.         for(;;)
  227.         {
  228.                 if(flag==1) cnt-- ;
  229.                 OSTimeDlyHMSM(0, 0,1,0);
  230.                 if(cnt==0) flag=0;
  231.                 SEG_DisplayValue(0,cnt/10,cnt%10);
  232.         }
  233. }

  234. void Task_DIS(void *pdata)
  235. {
  236.         u8 str1[20];
  237.         u8 str2[20];
  238.         for(;;)
  239.         {
  240.                 snprintf((char*)str1, sizeof(str1), "play1:%02d", play1);
  241.                 snprintf((char*)str2, sizeof(str2), "play2:%02d", play2);
  242.                 LCD_DisplayStringLine(Line4,str1);       
  243.                 LCD_DisplayStringLine(Line5,str2);
  244.                 if(wflag==1){
  245.                         flag=0;
  246.                         cnt=0;
  247.                         LCD_DisplayStringLine(Line7,"play1 win");
  248.                 }else if(wflag==2){
  249.                         flag=0;
  250.                         cnt=0;
  251.                         LCD_DisplayStringLine(Line7,"play2 win");
  252.                 }else if(wflag==3){
  253.                         flag=0;
  254.                         cnt=0;
  255.                         LCD_DisplayStringLine(Line7,"play3 win");
  256.                 }
  257.         }
  258. }
复制代码

所有资料51hei提供下载:
qiangdaqi.7z (236.33 KB, 下载次数: 31)

评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:319585 发表于 2021-6-20 07:50 来自手机 | 只看该作者
楼主这个例子不错,如果能有pcb等硬件就完美了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表