找回密码
 立即注册
楼主: CosyOS

全局不关总中断的 RTOS,CosyOS-III-V1.2.0, 送 擎天柱-AI8051U转89C52核心板

 火... [复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:395
  • 最近打卡:2025-06-17 09:18:13

0

主题

93

回帖

981

积分

高级会员

积分
981
发表于 2024-12-2 09:12:40 | 显示全部楼层
支持大神原创,助力STC32位8051腾飞
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:511
  • 最近打卡:2025-06-17 10:39:32

46

主题

232

回帖

3093

积分

论坛元老

积分
3093
发表于 2024-12-2 16:37:48 | 显示全部楼层
STC8H试验箱例程29红外遥控接收解码,使用CosyOS实现


实验功能:
解析红外信号,并且通过数码管显示用户码和键码;

迁移思路:
数码管显示发送数据还是放在滴答钩子中;
使用定时器1产生100us的定时时间,定时中断中采样红外信号接收引脚,当采样结束后发送二值信号量同步led任务来更新显示;

代码实现:
init_hook.c
  1. /**************************************************************************//**
  2. * @item     CosyOS-II Hook
  3. * @file     init_hook.c
  4. * @brief    初始化钩子
  5. * @detail   在主函数中首先被调用,适用于初始化时钟、GPIO、寄存器等工作。
  6. * @author   迟凯峰
  7. * @version  V3.0.0
  8. * @date     2024.06.25
  9. ******************************************************************************/
  10. #include "..\System\os_link.h"
  11. #include "..\User\nec.h"
  12. #define BAUD 115200                // 声明串口波特率
  13. #define TM2        (65536 - SYSCFG_SYSCLK / 4 / BAUD)        // 串口波特率发生器的定时器值
  14. void initGPIO(void) {
  15.     P0M1 = 0x30;   P0M0 = 0x30;   //设置P0.4、P0.5为漏极开路(实验箱加了上拉电阻到3.3V)
  16.     P1M0 = 0; P1M1 = 0;
  17.     P2M0 = 0; P2M1 = 0;
  18.     P3M0 = 0; P3M1 = 0;
  19.     P4M0 = 0; P4M1 = 0;
  20.     P5M0 = 0; P5M1 = 0;
  21.     P6M1 = 0xff;   P6M0 = 0xff;   //设置为漏极开路(实验箱加了上拉电阻到3.3V)
  22.     P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口
  23. }
  24. void init_hook(void)
  25. {
  26.         initGPIO();
  27.    
  28.     AUXR  =        0x00;  // 允许访问内部xdata
  29.         /*
  30.         1000 0001
  31.         B7:1:使能访问XFR
  32.         B0:1:P46,P47 位串口二的 RX和TX
  33.         */
  34.     P_SW2 =        EAXFR | 0x01; // 1000 0001  允许访问扩展RAM区特殊功能寄存器, 我是用的是STCH试验箱,因此这里需要切换串口二的引脚;
  35.    
  36.     TMOD = 0x00;   // 定时器0、1 为16位自动重装载模式
  37.        
  38.         /*
  39.         0100 0101:
  40.         B7:0:设置定时器0为系统时钟12分频;
  41.         B6:1:设置定时器1为系统时钟,不分频;
  42.         B2:1:设置定时器2为1T模式;
  43.         B0:1:串口1使用定时器2作为波特率发生器;
  44.         */
  45.     AUXR = 0x45;   // 0100 0101 定时器1、2为1T模式,  串口1用定时器2做波特率发生器
  46.         /*
  47.         0100 0000
  48.         B7-B6: 设置串口1为可变波特率8位数据模式
  49.         B4:设置串口1禁止串口1接收;
  50.         B1-B0:串口1的中断标志位
  51.         */
  52.     SCON = 0x40;   // 串口1工作模式为模式1
  53.         TI = 1;        // 用于printf
  54.        
  55.         /*
  56.         1100 0000
  57.         B7-B6: 串口1切换至P4.3/P4.4
  58.         */
  59.         P_SW1 = 0xC0;
  60.        
  61.         /*
  62.         串口2的设置:
  63.         0100 0000
  64.         B7:0:设置串口2为可变波特率8位数据模式;
  65.         B1-B0:设置串口2中断标志位
  66.         */
  67.     S2CON = 0x40;  // 串口2工作模式为模式0,串口2用定时器2做波特率发生器
  68.    
  69.     /* 定时器2 */
  70.     T2L = (unsigned char)TM2;
  71.     T2H = (unsigned char)(TM2 >> 8);
  72.        
  73.         /*
  74.         0100 0101 | 0001 0000 = 0101 0101
  75.         B4:1:定时器2的运行控制位,这里开启定时器2
  76.         */
  77.     AUXR |= T2R;
  78.     /* UART2中断优先级为1级 */
  79.     IP2H &=~PS2H;
  80.     IP2 |= PS2;
  81.     /* INT0中断优先级为0级 */
  82.     IPH &=~PX0H;
  83.     PX0 = 0;
  84.     /* 任务管理器 */
  85.     #if SYSCFG_DEBUGGING == 1
  86.     S2CON |= S2REN;
  87.     IE2 |= ES2;
  88.     #endif
  89.        
  90.         sampleInit();
  91. }
复制代码
滴答钩子:tick_hook.c
  1. /**************************************************************************//**
  2. * @item     CosyOS-II Hook
  3. * @file     tick_hook.c
  4. * @brief    滴答钩子
  5. * @detail   每个系统滴答周期,在系统滴答中断中都会被调用一次,
  6.              适用于每滴答周期/秒/分/时/日/月/年/...做一次的工作。
  7. * @note  1. 如果您在滴答钩子中调用服务,应调用滴答API。
  8.           2. 如果您在滴答钩子中调用自定义函数并且您的MCU内核为8051,自定义函数
  9.              可能需要添加using属性、或声明为相对寄存器访问。
  10.              demo1:
  11.              void your_function(void) MCUCFG_C51USING {... ...}
  12.             
  13.              demo2:
  14.              #pragma NOAREGS
  15.              void your_function(void) {... ...}
  16.              #pragma AREGS
  17. * @author   迟凯峰
  18. * @version  V3.1.0
  19. * @date     2024.11.26
  20. ******************************************************************************/
  21. #include "..\System\os_link.h"
  22. #include "..\User\led.h"
  23. #if SYSCFG_TICKHOOK == __ENABLED__
  24. void tick_hook(void) MCUCFG_C51USING
  25. {
  26.         if(true){ /* 每滴答周期执行一次 */
  27.                 sendData();
  28.         }
  29.         #if SYSCFG_SOFTRTC == __ENABLED__
  30.         if(s_sign_every.halfsec){
  31.                 s_sign_every.halfsec = false;
  32.                 if(true){ /* 每半秒执行一次(每半秒,first tick)*/
  33.                 }
  34.                 if(s_sign_every.second){
  35.                         s_sign_every.second = false;
  36.                         if(true){ /* 每秒钟执行一次(每秒,first tick)*/
  37.                         }
  38.                         if(s_sign_every.minute){
  39.                                 s_sign_every.minute = false;
  40.                                 if(true){ /* 每分钟执行一次(每分0秒,first tick)*/
  41.                                        
  42.                                 }
  43.                                 if(s_sign_every.hour){
  44.                                         s_sign_every.hour = false;
  45.                                         if(true){ /* 每小时执行一次(每时0分0秒,first tick)*/
  46.                                                
  47.                                         }
  48.                                         if(s_sign_every.day){
  49.                                                 s_sign_every.day = false;
  50.                                                 if(true){ /* 每天执行一次(每天0时0分0秒,first tick)*/
  51.                                                        
  52.                                                 }
  53.                                                 if(s_sign_every.month){
  54.                                                         s_sign_every.month = false;
  55.                                                         if(true){ /* 每月执行一次(每月1日0时0分0秒,first tick)*/
  56.                                                                
  57.                                                         }
  58.                                                         if(s_sign_every.year){
  59.                                                                 s_sign_every.year = false;
  60.                                                                 if(true){ /* 每年执行一次(每年1月1日0时0分0秒,first tick)*/
  61.                                                                        
  62.                                                                 }
  63.                                                         }
  64.                                                 }
  65.                                         }
  66.                                 }
  67.                         }
  68.                 }
  69.         }
  70.         #endif
  71. }
  72. #endif
复制代码
LED 显示模块 led.c
  1. #include "..\System\os_link.h"
  2. #include "..\User\led.h"
  3. #include "..\User\nec.h"
  4. #define DIS_DOT     0x20        // 0010 0000,
  5. #define DIS_BLACK   0x10        
  6. #define DIS_        0x11
  7. s_u8_t code t_display[]={                       //????
  8. //   0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F
  9.     0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
  10. //black  -     H    J    K    L    N    o   P    U     t    G    Q    r   M    y
  11.     0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
  12.     0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46};    //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1
  13. s_u8_t code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};      //??
  14. s_u8_t LED8[8] = {DIS_,DIS_,DIS_,DIS_,DIS_BLACK,DIS_BLACK,DIS_,DIS_};
  15. void sendData(void) MCUCFG_C51USING {
  16.     static s_u8_t display_index = 0;
  17.     P7 = ~T_COM[7-display_index];
  18.     P6 = ~t_display[LED8[display_index]];
  19.     if(++display_index >= 8)
  20.         {
  21.                 display_index = 0;  // 循环显示
  22.     }
  23. }
  24. uCreateTask(led_task, 4, 128, 0, 0)
  25. {
  26.         s_u16_t UserCode;
  27.         s_u8_t IR_code;
  28.        
  29.         if(uTakeBin(bin_1, ~0))
  30.         {
  31.                 UserCode = getUserCode();
  32.                 LED8[0] = (s_u8_t)((UserCode >> 12) & 0x0f);    //用户码高字节的高半字节
  33.                 LED8[1] = (s_u8_t)((UserCode >> 8)  & 0x0f);    //用户码高字节的低半字节
  34.                 LED8[2] = (s_u8_t)((UserCode >> 4)  & 0x0f);    //用户码低字节的高半字节
  35.                 LED8[3] = (s_u8_t)(UserCode & 0x0f);            //用户码低字节的低半字节
  36.                
  37.                 IR_code = getIRCode();
  38.                 LED8[6] = IR_code >> 4;
  39.                 LED8[7] = IR_code & 0x0f;
  40.         }
  41.        
  42.        
  43.        
  44.         uEndTasking;
  45. }
复制代码
NEC 红外信号解析模块 nec.c
  1. #include "..\System\os_link.h"
  2. #include "..\User\nec.h"
  3. #define Sap_Tick     10000  // 采样频率,一秒钟进行这些次采样, 一次100us  
  4. #define TM1        (65536 - ((SYSCFG_SYSCLK + Sap_Tick/2) / Sap_Tick))       
  5. /*************  红外接收程序变量声明    **************/
  6. sbit    P_IR_RX = P3^5;        //定义红外接收输入IO口
  7. s_u8_t  IR_SampleCnt;       //采样计数
  8. s_u8_t  IR_BitCnt;          //编码位数
  9. s_u8_t  IR_UserH;           //用户码(地址)高字节
  10. s_u8_t  IR_UserL;           //用户码(地址)低字节
  11. s_u8_t  IR_data;            //数据原码
  12. s_u8_t  IR_DataShit;        //数据移位
  13. bit P_IR_RX_temp;       //Last sample
  14. bit B_IR_Sync;          //已收到同步标志
  15. bit B_IR_Press;         //红外接收标志
  16. s_u8_t  IR_code;        //红外键码
  17. s_u16_t UserCode;       //用户码
  18. uCreateBin(bin_1, 0);
  19. s_u16_t getUserCode(void) {
  20.         return UserCode;
  21. }
  22. s_u8_t getIRCode(void) {
  23.         return IR_code;
  24. }
  25. void sampleInit(void) {
  26.         TH1 = (s_u8_t)(TM1 / 256);
  27.     TL1 = (s_u8_t)(TM1 % 256);
  28.     ET1 = 1;    //Timer1 interrupt enable
  29.     TR1 = 1;    //Tiner1 run
  30. }
  31. //*********************** IR Remote Module **************************
  32. //this programme is used for Receive IR Remote (NEC Code).
  33. //data format: Synchro, AddressH, AddressL, data, /data, (total 32 bit).
  34. //send a frame(85ms), pause 23ms, send synchro of continue frame, pause 94ms
  35. //data rate: 108ms/Frame
  36. //Synchro: low=9ms, high=4.5 / 2.25ms, low=0.5626ms
  37. //Bit0: high=0.5626ms, low=0.5626ms
  38. //Bit1: high=1.6879ms, low=0.5626ms
  39. //frame rate = 108ms ( pause 23 ms or 96 ms)
  40. /******************** 红外采样时间宏定义, 用户不要随意修改  *******************/
  41. #define D_IR_sample         100      //定义采样时间,在60us~250us之间
  42. #define D_IR_SYNC_MAX       (15000/D_IR_sample) //SYNC max time
  43. #define D_IR_SYNC_MIN       (9700 /D_IR_sample) //SYNC min time
  44. #define D_IR_SYNC_DIVIDE    (12375/D_IR_sample) //decide data 0 or 1
  45. #define D_IR_DATA_MAX       (3000 /D_IR_sample) //data max time
  46. #define D_IR_DATA_MIN       (600  /D_IR_sample) //data min time
  47. #define D_IR_DATA_DIVIDE    (1687 /D_IR_sample) //decide data 0 or 1
  48. #define D_IR_BIT_NUMBER     32                  //bit number
  49. void IR_RX_NEC(void)
  50. {
  51.     s_u8_t  SampleTime;
  52.     IR_SampleCnt++;                         //Sample + 1
  53.     F0 = P_IR_RX_temp;                      //Save Last sample status
  54.     P_IR_RX_temp = P_IR_RX;                 //Read current status
  55.     if(F0 && !P_IR_RX_temp)                 //Pre-sample is high,and current sample is low, so is fall edge
  56.     {
  57.         SampleTime = IR_SampleCnt;          //get the sample time
  58.         IR_SampleCnt = 0;                   //Clear the sample counter
  59.         if(SampleTime > D_IR_SYNC_MAX)
  60.                 {
  61.                         B_IR_Sync = 0;  // large the Maxim SYNC time, then error
  62.                 }
  63.         else if(SampleTime >= D_IR_SYNC_MIN)                    //SYNC
  64.         {
  65.             if(SampleTime >= D_IR_SYNC_DIVIDE)
  66.             {
  67.                 B_IR_Sync = 1;                  //has received SYNC
  68.                 IR_BitCnt = D_IR_BIT_NUMBER;    //Load bit number
  69.             }
  70.         }
  71.         else if(B_IR_Sync)                      //has received SYNC
  72.         {
  73.             if(SampleTime > D_IR_DATA_MAX)
  74.                         {
  75.                                 B_IR_Sync=0;    //data samlpe time too large
  76.                         }      
  77.             else
  78.             {
  79.                 IR_DataShit >>= 1;                  //data shift right 1 bit
  80.                 if(SampleTime >= D_IR_DATA_DIVIDE)  
  81.                                 {
  82.                                         IR_DataShit |= 0x80;    //devide data 0 or 1
  83.                                 }
  84.                 if(--IR_BitCnt == 0)                //bit number is over?
  85.                 {
  86.                     B_IR_Sync = 0;                  //Clear SYNC
  87.                     if(~IR_DataShit == IR_data)     //判断数据正反码
  88.                     {
  89.                         UserCode = ((s_u16_t)IR_UserH << 8) + IR_UserL;
  90.                         IR_code      = IR_data;
  91.                                                 iGiveBin(bin_1);
  92.                         // B_IR_Press   = 1;           //数据有效
  93.                     }
  94.                 }
  95.                 else if((IR_BitCnt & 7)== 0)        //one byte receive
  96.                 {
  97.                     IR_UserL = IR_UserH;            //Save the User code high byte
  98.                     IR_UserH = IR_data;             //Save the User code low byte
  99.                     IR_data  = IR_DataShit;         //Save the IR data byte
  100.                 }
  101.             }
  102.         }
  103.     }
  104. }
  105. /********************** Timer0中断函数 ************************/
  106. void sample (void) interrupt 3
  107. {
  108.     IR_RX_NEC();
  109. }
复制代码
效果展示:

不争是争
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:467
  • 最近打卡:2025-06-17 22:51:19

5

主题

1153

回帖

4481

积分

荣誉版主

积分
4481
发表于 2024-12-2 17:19:33 | 显示全部楼层
大*** 发表于 2024-12-2 16:37
STC8H试验箱例程29红外遥控接收解码,使用CosyOS实现

回复 支持 反对

使用道具 举报 送花

已绑定手机

0

主题

3

回帖

20

积分

新手上路

积分
20
发表于 2024-12-2 20:39:59 | 显示全部楼层
你好,之前8位的stc11芯片的时候用过rtos系统,开发过不少逻辑指令的IO开发板(c)+用AC开发的电阻屏做嵌入式程序(汇编),模拟plc的部分功能,虽然效率够但寄存器不够用了,不是很复杂的功能也不想做扩展,现在准备用液晶+触控8位不够用了,用于机械设备显示,正在学32位的,不知道这个实验板要如何申请获取?就是想捡个现成的,实在申请不到到时候可能也会买一个。

点评

你去咨询一下客服吧,我只负责 CosyOS 相关技术问题的解答  发表于 2024-12-2 22:31
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:511
  • 最近打卡:2025-06-17 10:39:32

46

主题

232

回帖

3093

积分

论坛元老

积分
3093
发表于 2024-12-2 23:01:07 | 显示全部楼层
jewh*** 发表于 2024-12-2 20:39
你好,之前8位的stc11芯片的时候用过rtos系统,开发过不少逻辑指令的IO开发板(c)+用AC开发的电阻屏做嵌入 ...

发帖子,做贡献,攒积分,兑换。 我的积分已经够兑换试验箱了, 可是用不上。
姚总助力我们学习,直接送了。
不争是争
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:167
  • 最近打卡:2025-06-17 07:58:32
已绑定手机

2

主题

112

回帖

234

积分

中级会员

积分
234
发表于 2024-12-6 14:01:32 | 显示全部楼层

学习:jie:

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:511
  • 最近打卡:2025-06-17 10:39:32

46

主题

232

回帖

3093

积分

论坛元老

积分
3093
发表于 2024-12-7 22:18:30 | 显示全部楼层

试验箱例程21比较器做低压检测

实验功能

如图所示,试验箱中P3.7 接可变电阻,通过改变电阻来改变P3.7的电压值,然后使用比较器跟内部1.19V电压做比较。
如果通过P3.7输入的电压低于参考电压1.19V时将秒计数写入EEPROM,
如果通过P3.7输入的电压高于参考电压1.19V时从EEPROM中读出原来记录的秒数继续显示
数码管显示秒计数

迁移思路

1、通过滴答钩子每1ms向595写数码管显示数据;
2、通过滴答钩子中的1秒改变秒计数值。 因为这里仅仅是记录秒数,不是RTC因此不需要使用软件RTC的功能;
3、二值信号量通过比较器中断通知cmp任务用于将本地的秒数写入、读取EEPROM;

效果展示

代码

upload 附件:cmp_eeprom.zip

不争是争
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:100
  • 最近打卡:2025-06-17 08:13:13

734

主题

1万

回帖

1万

积分

管理员

积分
16690
发表于 2024-12-8 00:40:55 | 显示全部楼层

大家多感受下官方强大的 【串口助手】 工具
截图202412080038057156.jpg

截图202412080038283571.jpg

截图202412080039156858.jpg

截图202412080039531234.jpg

截图202412080040229607.jpg

截图202412080040507611.jpg

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:467
  • 最近打卡:2025-06-17 22:51:19

5

主题

1153

回帖

4481

积分

荣誉版主

积分
4481
发表于 2024-12-8 10:54:15 | 显示全部楼层

推荐大家多多使用 STC-ISP 自带的 串口助手,定会感觉到它的强大!

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:50
  • 最近打卡:2025-02-15 19:19:04

13

主题

89

回帖

470

积分

中级会员

积分
470
发表于 2024-12-11 16:47:03 | 显示全部楼层
Cos*** 发表于 2023-10-20 22:30
参会学习,【免费+包邮 送】:
【一箭双雕之USB转双串口,2个USB-CDC转串口+HID烧录】
【STC-USB Link1D,2 ...

祝愿STC越来越好
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-6-18 00:09 , Processed in 0.168869 second(s), 111 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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