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

跟着冲哥学习单片机

[复制链接]
  • 打卡等级:常住居民II
  • 打卡总天数:98
  • 最近打卡:2025-02-18 09:33:29

1

主题

32

回帖

486

积分

中级会员

积分
486
发表于 2024-8-2 16:20:15 | 显示全部楼层
本帖最后由 CListery 于 2024-8-2 16:22 编辑

记一个在 STC32G12K128 大学计划实验箱 V9.62 上遇到的问题:
在同时对 P32、P33、P34、P35 和 矩阵按键扫描时,P34会出现意外拉低的情况,设置了上拉电阻也无效,导致按键扫描程序一直扫描到 P34 为低电平
引发该问题的具体原因暂时未知,有可能是在拉低P0口时其他的电路影响到了P3口


解决方案,在扫描 P3 口的按键时将 P0 口拉高,扫描 P0 口矩阵按键时将 P3 拉高(最好排除 P30、P31 口)
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:98
  • 最近打卡:2025-02-18 09:33:29

1

主题

32

回帖

486

积分

中级会员

积分
486
发表于 2024-8-2 23:23:13 | 显示全部楼层
第二十九集:
做一个带闹钟、时间设置、30秒提醒功能的时钟
  1. #include <stc32g.h>
  2. #define PRINTF_HID
  3. #include <stc32_stc8_usb.h>
  4. #include "adc.h"
  5. #include "extint.h"
  6. #include "key.h"
  7. #include "led.h"
  8. #include "timer.h"
  9. #define FOSC 24000000UL // ISP 下载时需将工作频率设置为 24MHz
  10. char *USER_DEVICEDESC = NULL;
  11. char *USER_PRODUCTDESC = NULL;
  12. char *USER_STCISPCMD = "@STCISP#"; // 设置自动复位到ISP区的用户接口命令
  13. bit FLAG_100ms = 1, FLAG_500ms = 0;
  14. // 秒,分,时
  15. u8 time[3] = {0, 0, 0};
  16. #define T_HOUR time[2]
  17. #define T_MINUTE time[1]
  18. #define T_SECOUND time[0]
  19. u8 preSetTime[3] = {255, 255, 255};
  20. #define PRE_T_HOUR preSetTime[2]
  21. #define PRE_T_MINUTE preSetTime[1]
  22. #define PRE_T_SECOUND preSetTime[0]
  23. bit pauseRefreshLight = 0;
  24. u8 twinkle = 0;
  25. bit TIME_SETTING = 0;
  26. bit PRE_TIME_SETTING = 0;
  27. u8 twinklePos = 0;
  28. bit PRE_TIMEUP = 0;
  29. void sys_init();
  30. void refreshTIME();
  31. void setTime(u8 tVal);
  32. void preTimeup();
  33. void Delay1ms(void) //@24.000MHz
  34. {
  35.   unsigned char data i, j;
  36.   i = 24;
  37.   j = 85;
  38.   do
  39.   {
  40.     while (--j)
  41.       ;
  42.   } while (--i);
  43. }
  44. void Delay100ms()
  45. {
  46.   u8 i = 100;
  47.   while (--i)
  48.   {
  49.     Delay1ms();
  50.   }
  51. }
  52. void main()
  53. {
  54.   char key;
  55.   // u8 keyStatus;
  56.   u8 tVal;
  57.   sys_init();
  58.   // initTimer0(0x30, 0xF8);
  59.   initTimer1(0x40, 0xA2);
  60.   initADC(0);
  61.   EA = 1;
  62.   P0M0 = 0;
  63.   P0M1 = 0;
  64.   // P3M0 = 0;
  65.   // P3M1 = 0;
  66.   P4M0 = 0;
  67.   P4M1 = 0;
  68.   P6M0 = 0;
  69.   P6M1 = 0;
  70.   P7M0 = 0;
  71.   P7M1 = 0;
  72.   // SSD0 = 0;
  73.   // SSD1 = 1;
  74.   // SSD2 = 2;
  75.   // SSD3 = 3;
  76.   // SSD4 = 4;
  77.   // SSD5 = 5;
  78.   // SSD6 = 6;
  79.   // SSD7 = 7;
  80.   // 等待 USB 完成配置
  81.   while (DeviceState != DEVSTATE_CONFIGURED)
  82.     ;
  83.   while (1)
  84.   {
  85.     if (bUsbOutReady) // 当硬件接收完成上位机通过串口助手发送数据后
  86.                       // 会自动将 bUsbOutReady 置 1
  87.                       // 接收的数据字节保存在 OutNumber 变量总
  88.                       // 接收的数据保存在 UsbOutBuffer 缓冲区
  89.     {
  90.       USB_SendData(UsbOutBuffer, OutNumber); // 使用 Usb_SendData 库函数可向上位机发送数据
  91.                                              // 这里的测试代码为将接收数据原样返回
  92.       usb_OUT_done();                        // 处理完成接收的数据后
  93.                                              // 调用 usb_OUT_done 准备接收下一笔数据
  94.     }
  95.     if (FLAG_100ms)
  96.     {
  97.       FLAG_100ms = 0;
  98.       key = adcKeyRead(0);
  99.       if (key != -1)
  100.       {
  101.         tVal = -1;
  102.         printf("%d\r\n", key);
  103.         switch (key)
  104.         {
  105.         case ADC_K_0_CLICK:
  106.         case ADC_K_1_CLICK:
  107.         case ADC_K_2_CLICK:
  108.         case ADC_K_3_CLICK:
  109.         case ADC_K_4_CLICK:
  110.         case ADC_K_5_CLICK:
  111.         case ADC_K_6_CLICK:
  112.         case ADC_K_7_CLICK:
  113.         case ADC_K_8_CLICK:
  114.         case ADC_K_9_CLICK:
  115.           if (TIME_SETTING || PRE_TIME_SETTING)
  116.           {
  117.             while (queryADC(0))
  118.             {
  119.               Delay100ms();
  120.             }
  121.             tVal = key - 1;
  122.           }
  123.           break;
  124.         case ADC_K_B_CLICK:
  125.         case ADC_K_B_LONG_CLICK:
  126.           if (TIME_SETTING)
  127.           {
  128.             T_SECOUND++;
  129.             pauseRefreshLight = 0;
  130.           }
  131.           break;
  132.         case ADC_K_D_CLICK:
  133.           if (TIME_SETTING)
  134.           {
  135.             // 退出设置时间
  136.             TIME_SETTING = 0;
  137.             pauseRefreshLight = 0;
  138.           }
  139.           else if (PRE_TIME_SETTING)
  140.           {
  141.             // 退出设置闹钟
  142.             PRE_TIME_SETTING = 0;
  143.             pauseRefreshLight = 0;
  144.           }
  145.           break;
  146.         case ADC_K_A_LONG_CLICK:
  147.           // 设置时间
  148.           if (!TIME_SETTING)
  149.           {
  150.             twinklePos = 0;
  151.             TIME_SETTING = 1;
  152.           }
  153.           break;
  154.         case ADC_K_F_LONG_CLICK:
  155.           // 设置闹钟
  156.           if (!PRE_TIME_SETTING)
  157.           {
  158.             twinklePos = 0;
  159.             PRE_TIME_SETTING = 1;
  160.           }
  161.           break;
  162.         }
  163.         if (tVal != -1)
  164.         {
  165.           setTime(tVal);
  166.         }
  167.       }
  168.       // key = queryUnNormalKey();
  169.       // if (key != -1)
  170.       // {
  171.       //   keyStatus = readKeyStatus(key);
  172.       //   printf("%d -> %d\r\n", key, keyStatus);
  173.       //   switch (key)
  174.       //   {
  175.       //   case KEY1:
  176.       //     // A 键
  177.       //     if (keyStatus == KEY_LONG_CLICK)
  178.       //     {
  179.       //       if (!TIME_SETTING)
  180.       //       {
  181.       //         twinklePos = 0;
  182.       //         TIME_SETTING = 1;
  183.       //       }
  184.       //     }
  185.       //     break;
  186.       //   case KEY4:
  187.       //     // D键
  188.       //     if (keyStatus == KEY_CLICK)
  189.       //     {
  190.       //       TIME_SETTING = 0;
  191.       //       pauseRefreshLight = 0;
  192.       //     }
  193.       //     break;
  194.       //   }
  195.       // }
  196.       refreshTIME();
  197.     }
  198.   }
  199. }
  200. void setTime(u8 tVal)
  201. {
  202.   if (TIME_SETTING)
  203.   {
  204.     switch (twinklePos)
  205.     {
  206.     case 0:
  207.       T_SECOUND = (T_SECOUND / 10 * 10) + tVal;
  208.       break;
  209.     case 1:
  210.       T_SECOUND = tVal * 10 + T_SECOUND % 10;
  211.       break;
  212.     case 3:
  213.       T_MINUTE = (T_MINUTE / 10 * 10) + tVal;
  214.       break;
  215.     case 4:
  216.       T_MINUTE = tVal * 10 + T_MINUTE % 10;
  217.       break;
  218.     case 6:
  219.       T_HOUR = (T_HOUR / 10 * 10) + tVal;
  220.       break;
  221.     case 7:
  222.       T_HOUR = tVal * 10 + T_HOUR % 10;
  223.       break;
  224.     }
  225.     twinklePos++;
  226.     if (twinklePos == 2 || twinklePos == 5)
  227.     {
  228.       twinklePos++;
  229.     }
  230.     else if (twinklePos == 8)
  231.     {
  232.       twinklePos = 0;
  233.     }
  234.   }
  235.   else if (PRE_TIME_SETTING)
  236.   {
  237.     switch (twinklePos)
  238.     {
  239.     case 0:
  240.       PRE_T_SECOUND = (PRE_T_SECOUND / 10 * 10) + tVal;
  241.       break;
  242.     case 1:
  243.       PRE_T_SECOUND = tVal * 10 + PRE_T_SECOUND % 10;
  244.       break;
  245.     case 3:
  246.       PRE_T_MINUTE = (PRE_T_MINUTE / 10 * 10) + tVal;
  247.       break;
  248.     case 4:
  249.       PRE_T_MINUTE = tVal * 10 + PRE_T_MINUTE % 10;
  250.       break;
  251.     case 6:
  252.       PRE_T_HOUR = (PRE_T_HOUR / 10 * 10) + tVal;
  253.       break;
  254.     case 7:
  255.       PRE_T_HOUR = tVal * 10 + PRE_T_HOUR % 10;
  256.       break;
  257.     }
  258.     twinklePos++;
  259.     if (twinklePos == 2 || twinklePos == 5)
  260.     {
  261.       twinklePos++;
  262.     }
  263.     else if (twinklePos == 8)
  264.     {
  265.       twinklePos = 0;
  266.     }
  267.   }
  268. }
  269. void refreshTIME()
  270. {
  271.   if (PRE_TIME_SETTING)
  272.   {
  273.     if (PRE_T_SECOUND >= 60)
  274.     {
  275.       PRE_T_SECOUND = 0;
  276.       PRE_T_MINUTE++;
  277.     }
  278.     if (PRE_T_MINUTE >= 60)
  279.     {
  280.       PRE_T_MINUTE = 0;
  281.       PRE_T_HOUR++;
  282.     }
  283.     if (PRE_T_HOUR >= 24)
  284.     {
  285.       PRE_T_HOUR = 0;
  286.     }
  287.     // if (!pauseRefreshLight)
  288.     // {
  289.     //   printf("%d - %d - %d \r\n", T_HOUR, T_MINUTE, T_SECOUND);
  290.     // }
  291.     // else
  292.     // {
  293.     //   printf("   -    -  \r\n");
  294.     // }
  295.     SSD0 = PRE_T_SECOUND > 0 ? PRE_T_SECOUND % 10 : 0;
  296.     SSD1 = PRE_T_SECOUND > 0 ? PRE_T_SECOUND / 10 : 0;
  297.     SSD2 = SEG_DISPLAY_STAFF;
  298.     SSD3 = PRE_T_MINUTE > 0 ? PRE_T_MINUTE % 10 : 0;
  299.     SSD4 = PRE_T_MINUTE > 0 ? PRE_T_MINUTE / 10 : 0;
  300.     SSD5 = SEG_DISPLAY_STAFF;
  301.     SSD6 = PRE_T_HOUR > 0 ? PRE_T_HOUR % 10 : 0;
  302.     SSD7 = PRE_T_HOUR > 0 ? PRE_T_HOUR / 10 : 0;
  303.   }
  304.   else
  305.   {
  306.     if (T_SECOUND >= 60)
  307.     {
  308.       T_SECOUND = 0;
  309.       T_MINUTE++;
  310.     }
  311.     if (T_MINUTE >= 60)
  312.     {
  313.       T_MINUTE = 0;
  314.       T_HOUR++;
  315.     }
  316.     if (T_HOUR >= 24)
  317.     {
  318.       T_HOUR = 0;
  319.     }
  320.     // if (!pauseRefreshLight)
  321.     // {
  322.     //   printf("%d - %d - %d \r\n", T_HOUR, T_MINUTE, T_SECOUND);
  323.     // }
  324.     // else
  325.     // {
  326.     //   printf("   -    -  \r\n");
  327.     // }
  328.     SSD0 = T_SECOUND > 0 ? T_SECOUND % 10 : 0;
  329.     SSD1 = T_SECOUND > 0 ? T_SECOUND / 10 : 0;
  330.     SSD2 = SEG_DISPLAY_STAFF;
  331.     SSD3 = T_MINUTE > 0 ? T_MINUTE % 10 : 0;
  332.     SSD4 = T_MINUTE > 0 ? T_MINUTE / 10 : 0;
  333.     SSD5 = SEG_DISPLAY_STAFF;
  334.     SSD6 = T_HOUR > 0 ? T_HOUR % 10 : 0;
  335.     SSD7 = T_HOUR > 0 ? T_HOUR / 10 : 0;
  336.     if (T_SECOUND == PRE_T_SECOUND && T_MINUTE == PRE_T_MINUTE && T_HOUR == PRE_T_HOUR)
  337.     {
  338.       preTimeup();
  339.     }
  340.   }
  341. }
  342. void preTimeup()
  343. {
  344.   u8 key;
  345.   PRE_TIMEUP = 1;
  346.   twinklePos = 0;
  347.   while (1)
  348.   {
  349.     if (FLAG_100ms)
  350.     {
  351.       FLAG_100ms = 0;
  352.       key = adcKeyRead(0);
  353.       if (key != -1)
  354.       {
  355.         printf("%d\r\n", key);
  356.         if (key == ADC_K_0_CLICK)
  357.         {
  358.           PRE_TIMEUP = 0;
  359.           break;
  360.         }
  361.       }
  362.     }
  363.   }
  364. }
  365. void t1_run(void) interrupt 3
  366. // void t0_run() interrupt 1
  367. {
  368.   static u8 n = 0, n100 = 0, n500 = 0;
  369.   if (TIME_SETTING || PRE_TIME_SETTING || PRE_TIMEUP)
  370.   {
  371.     refreshLight(pauseRefreshLight ? twinklePos : -1);
  372.   }
  373.   else
  374.   {
  375.     if (pauseRefreshLight)
  376.     {
  377.       SEG_ENABLE = 0xFF;
  378.     }
  379.     else
  380.     {
  381.       refreshLight(-1);
  382.     }
  383.   }
  384.   n++;
  385.   if (n % 10 == 0)
  386.   {
  387.     refreshKeyStatus();
  388.   }
  389.   if (n == 100)
  390.   {
  391.     FLAG_100ms = 1;
  392.     n100++;
  393.     n500++;
  394.     n = 0;
  395.   }
  396.   if (n100 > 0)
  397.   {
  398.     if (n100 % 10 == 0)
  399.     {
  400.       if (!TIME_SETTING)
  401.       {
  402.         T_SECOUND++;
  403.         if (T_SECOUND == 30)
  404.         {
  405.           twinkle = 6;
  406.         }
  407.       }
  408.       n100 = 0;
  409.     }
  410.     if (n500 == 5)
  411.     {
  412.       n500 = 0;
  413.     }
  414.   }
  415.   if (n500)
  416.   {
  417.     n500 = 0;
  418.     if (TIME_SETTING || PRE_TIME_SETTING)
  419.     {
  420.       pauseRefreshLight = !pauseRefreshLight;
  421.     }
  422.     else if (PRE_TIMEUP)
  423.     {
  424.       pauseRefreshLight = 1;
  425.       twinklePos++;
  426.       if (twinklePos == 8)
  427.       {
  428.         twinklePos = 0;
  429.       }
  430.     }
  431.     else
  432.     {
  433.       if (twinkle > 0)
  434.       {
  435.         pauseRefreshLight = !pauseRefreshLight;
  436.         twinkle--;
  437.       }
  438.       else
  439.       {
  440.         pauseRefreshLight = 0;
  441.       }
  442.     }
  443.   }
  444. }
  445. void sys_init()
  446. {
  447.   WTST = 0;
  448.   CKCON = 0;
  449.   EAXFR = 1;
  450.   P3M0 = 0x00;
  451.   P3M1 = 0x00;
  452.   P3M0 &= ~0x03; // P30,P31 和 USB 的 D-,D+ 共用 PIN 脚
  453.   P3M1 |= 0x03;  // 需要将 P30,P31 设置为高阻输入模式
  454.   IRC48MCR = 0x80; // 使能内部 48M 的 USB 专用 IRC
  455.   while (!(IRC48MCR & 0x01))
  456.     ; // 等待震荡源稳定
  457.   USBCLK = 0x00; // 设置 USB 时钟源为内部 48M 的 USB 专用 IRC
  458.   USBCON = 0x09; // 使能 USB 功能
  459.   usb_init(); // 调用 USB CDC 初始化库函数
  460.   EUSB = 1; // 使能 USB 中断
  461. }
复制代码

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:327
  • 最近打卡:2025-05-08 13:27:17
已绑定手机

21

主题

487

回帖

1063

积分

金牌会员

积分
1063
发表于 2024-8-3 08:14:10 | 显示全部楼层
进来看看
回复

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:98
  • 最近打卡:2025-02-18 09:33:29

1

主题

32

回帖

486

积分

中级会员

积分
486
发表于 2024-8-7 15:46:11 | 显示全部楼层
本帖最后由 CListery 于 2024-8-7 15:58 编辑

第三十集:
ADC采集NTC温度并显示
  1. #include <stc32g.h>
  2. #define PRINTF_HID
  3. #include <stc32_stc8_usb.h>
  4. #include "adc.h"
  5. #include "extint.h"
  6. #include "key.h"
  7. #include "led.h"
  8. #include "timer.h"
  9. #define FOSC 24000000UL // ISP 下载时需将工作频率设置为 24MHz
  10. char *USER_DEVICEDESC = NULL;
  11. char *USER_PRODUCTDESC = NULL;
  12. char *USER_STCISPCMD = "@STCISP#"; // 设置自动复位到ISP区的用户接口命令
  13. bit FLAG_100ms = 1, FLAG_500ms = 0;
  14. u16 NTC_ADC_DATA[191] = {
  15.     3980, // -40   0
  16.     3972, // -39   1
  17.     3964, // -38   2
  18.     3955, // -37   3
  19.     3946, // -36   4
  20.     3936, // -35   5
  21.     3926, // -34   6
  22.     3915, // -33   7
  23.     3904, // -32   8
  24.     3892, // -31   9
  25.     3880, // -30   10
  26.     3867, // -29   11
  27.     3853, // -28   12
  28.     3838, // -27   13
  29.     3823, // -26   14
  30.     3807, // -25   15
  31.     3791, // -24   16
  32.     3774, // -23   17
  33.     3756, // -22   18
  34.     3737, // -21   19
  35.     3717, // -20   20
  36.     3697, // -19   21
  37.     3675, // -18   22
  38.     3653, // -17   23
  39.     3630, // -16   24
  40.     3606, // -15   25
  41.     3581, // -14   26
  42.     3556, // -13   27
  43.     3529, // -12   28
  44.     3501, // -11   29
  45.     3473, // -10   30
  46.     3444, // -9    31
  47.     3413, // -8    32
  48.     3382, // -7    33
  49.     3350, // -6    34
  50.     3317, // -5    35
  51.     3283, // -4    36
  52.     3249, // -3    37
  53.     3213, // -2    38
  54.     3177, // -1    39
  55.     3139, // 0     40
  56.     3101, // 1     41
  57.     3063, // 2     42
  58.     3023, // 3     43
  59.     2983, // 4     44
  60.     2942, // 5     45
  61.     2901, // 6     46
  62.     2858, // 7     47
  63.     2816, // 8     48
  64.     2773, // 9     49
  65.     2729, // 10    50
  66.     2685, // 11    51
  67.     2640, // 12    52
  68.     2595, // 13    53
  69.     2550, // 14    54
  70.     2505, // 15    55
  71.     2459, // 16    56
  72.     2414, // 17    57
  73.     2368, // 18    58
  74.     2322, // 19    59
  75.     2276, // 20    60
  76.     2230, // 21    61
  77.     2184, // 22    62
  78.     2139, // 23    63
  79.     2093, // 24    64
  80.     2048, // 25    65
  81.     2003, // 26    66
  82.     1958, // 27    67
  83.     1914, // 28    68
  84.     1870, // 29    69
  85.     1827, // 30    70
  86.     1784, // 31    71
  87.     1741, // 32    72
  88.     1699, // 33    73
  89.     1657, // 34    74
  90.     1617, // 35    75
  91.     1576, // 36    76
  92.     1536, // 37    77
  93.     1497, // 38    78
  94.     1459, // 39    79
  95.     1421, // 40    80
  96.     1384, // 41    81
  97.     1348, // 42    82
  98.     1312, // 43    83
  99.     1277, // 44    84
  100.     1242, // 45    85
  101.     1209, // 46    86
  102.     1176, // 47    87
  103.     1144, // 48    88
  104.     1112, // 49    89
  105.     1082, // 50    90
  106.     1052, // 51    91
  107.     1022, // 52    92
  108.     994,  // 53    93
  109.     966,  // 54    94
  110.     939,  // 55    95
  111.     912,  // 56    96
  112.     886,  // 57    97
  113.     861,  // 58    98
  114.     837,  // 59    99
  115.     813,  // 60    100
  116.     790,  // 61    101
  117.     767,  // 62    102
  118.     745,  // 63    103
  119.     724,  // 64    104
  120.     703,  // 65    105
  121.     683,  // 66    106
  122.     663,  // 67    107
  123.     644,  // 68    108
  124.     626,  // 69    109
  125.     608,  // 70    110
  126.     590,  // 71    111
  127.     573,  // 72    112
  128.     557,  // 73    113
  129.     541,  // 74    114
  130.     525,  // 75    115
  131.     510,  // 76    116
  132.     496,  // 77    117
  133.     481,  // 78    118
  134.     468,  // 79    119
  135.     454,  // 80    120
  136.     441,  // 81    121
  137.     429,  // 82    122
  138.     417,  // 83    123
  139.     405,  // 84    124
  140.     394,  // 85    125
  141.     382,  // 86    126
  142.     372,  // 87    127
  143.     361,  // 88    128
  144.     351,  // 89    129
  145.     341,  // 90    130
  146.     332,  // 91    131
  147.     323,  // 92    132
  148.     314,  // 93    133
  149.     305,  // 94    134
  150.     297,  // 95    135
  151.     289,  // 96    136
  152.     281,  // 97    137
  153.     273,  // 98    138
  154.     265,  // 99    139
  155.     258,  // 100   140
  156.     251,  // 101   141
  157.     245,  // 102   142
  158.     238,  // 103   143
  159.     232,  // 104   144
  160.     225,  // 105   145
  161.     219,  // 106   146
  162.     214,  // 107   147
  163.     208,  // 108   148
  164.     202,  // 109   149
  165.     197,  // 110   150
  166.     192,  // 111   151
  167.     187,  // 112   152
  168.     182,  // 113   153
  169.     177,  // 114   154
  170.     173,  // 115   155
  171.     168,  // 116   156
  172.     164,  // 117   157
  173.     160,  // 118   158
  174.     156,  // 119   159
  175.     152,  // 120   160
  176.     148,  // 121   161
  177.     144,  // 122   162
  178.     141,  // 123   163
  179.     137,  // 124   164
  180.     134,  // 125   165
  181.     130,  // 126   166
  182.     127,  // 127   167
  183.     124,  // 128   168
  184.     121,  // 129   169
  185.     118,  // 130   170
  186.     115,  // 131   171
  187.     112,  // 132   172
  188.     110,  // 133   173
  189.     107,  // 134   174
  190.     104,  // 135   175
  191.     102,  // 136   176
  192.     100,  // 137   177
  193.     97,   // 138   178
  194.     95,   // 139   179
  195.     93,   // 140   180
  196.     91,   // 141   181
  197.     88,   // 142   182
  198.     86,   // 143   183
  199.     84,   // 144   184
  200.     82,   // 145   185
  201.     81,   // 146   186
  202.     79,   // 147   187
  203.     77,   // 148   188
  204.     75,   // 149   189
  205.     73,   // 150   190
  206. };
  207. void sys_init();
  208. void Delay1ms(void) //@24.000MHz
  209. {
  210.   unsigned char data i, j;
  211.   i = 24;
  212.   j = 85;
  213.   do
  214.   {
  215.     while (--j)
  216.       ;
  217.   } while (--i);
  218. }
  219. void Delay100ms()
  220. {
  221.   u8 i = 100;
  222.   while (--i)
  223.   {
  224.     Delay1ms();
  225.   }
  226. }
  227. u16 cal_temperature(u16 adcVal);
  228. void main()
  229. {
  230.   u16 ntcVal;
  231.   u16 temp;
  232.   sys_init();
  233.   // initTimer0(0x30, 0xF8);
  234.   initTimer1(0x40, 0xA2);
  235.   initADC(0);
  236.   EA = 1;
  237.   P0M0 = 0;
  238.   P0M1 = 0;
  239.   P4M0 = 0;
  240.   P4M1 = 0;
  241.   P6M0 = 0;
  242.   P6M1 = 0;
  243.   P7M0 = 0;
  244.   P7M1 = 0;
  245.   P1M1 = 0x38;
  246.   P1M0 = 0x30; // 设置P1.4、P1.5为漏极开路(实验箱加了上拉电阻到3.3V), P1.3 为 ADC 高阻输入口
  247.   // SSD0 = 0;
  248.   // SSD1 = 1;
  249.   // SSD2 = 2;
  250.   // SSD3 = 3;
  251.   // SSD4 = 4;
  252.   // SSD5 = 5;
  253.   // SSD6 = 6;
  254.   // SSD7 = 7;
  255.   // 等待 USB 完成配置
  256.   while (DeviceState != DEVSTATE_CONFIGURED)
  257.     ;
  258.   while (1)
  259.   {
  260.     if (bUsbOutReady) // 当硬件接收完成上位机通过串口助手发送数据后
  261.                       // 会自动将 bUsbOutReady 置 1
  262.                       // 接收的数据字节保存在 OutNumber 变量总
  263.                       // 接收的数据保存在 UsbOutBuffer 缓冲区
  264.     {
  265.       USB_SendData(UsbOutBuffer, OutNumber); // 使用 Usb_SendData 库函数可向上位机发送数据
  266.                                              // 这里的测试代码为将接收数据原样返回
  267.       usb_OUT_done();                        // 处理完成接收的数据后
  268.                                              // 调用 usb_OUT_done 准备接收下一笔数据
  269.     }
  270.     if (FLAG_100ms)
  271.     {
  272.       FLAG_100ms = 0;
  273.       ntcVal = queryADC(3);
  274.       if (ntcVal < 4096)
  275.       {
  276.         temp = cal_temperature(ntcVal);
  277.         SSD0 = temp % 10;
  278.         SSD1 = temp / 10 % 10 + 11;
  279.         SSD2 = temp / 100;
  280.       }
  281.       printf("ntc: %d -> %d\r\n", ntcVal, temp);
  282.     }
  283.   }
  284. }
  285. u16 cal_temperature(u16 adcVal)
  286. {
  287.   u8 i;
  288.   float temp;
  289.   if (adcVal < NTC_ADC_DATA[191 / 2])
  290.   {
  291.     i = 191 / 2;
  292.   }
  293.   else
  294.   {
  295.     i = 0;
  296.   }
  297.   for (; i < 191; i++)
  298.   {
  299.     if (NTC_ADC_DATA[i] == adcVal)
  300.     {
  301.       temp = (i - 40) * 10;
  302.       break;
  303.     }
  304.     else if (NTC_ADC_DATA[i] < adcVal)
  305.     {
  306.       temp = ((float)(NTC_ADC_DATA[i - 1] - adcVal) / (float)(NTC_ADC_DATA[i - 1] - NTC_ADC_DATA[i]) + (i - 40)) * 10;
  307.       break;
  308.     }
  309.   }
  310.   return (u16)temp;
  311. }
  312. void t1_run(void) interrupt 3
  313. // void t0_run() interrupt 1
  314. {
  315.   static u8 n = 0, n100 = 0, n500 = 0;
  316.   refreshLight(-1);
  317.   n++;
  318.   if (n % 10 == 0)
  319.   {
  320.     refreshKeyStatus();
  321.   }
  322.   if (n == 100)
  323.   {
  324.     FLAG_100ms = 1;
  325.     n100++;
  326.     n500++;
  327.     n = 0;
  328.   }
  329.   if (n100 > 0)
  330.   {
  331.     if (n500 == 5)
  332.     {
  333.       n500 = 0;
  334.     }
  335.     if (n100 % 10 == 0)
  336.     {
  337.       n100 = 0;
  338.     }
  339.   }
  340.   if (n500)
  341.   {
  342.     n500 = 0;
  343.   }
  344. }
  345. void sys_init()
  346. {
  347.   WTST = 0;
  348.   CKCON = 0;
  349.   EAXFR = 1;
  350.   P3M0 = 0x00;
  351.   P3M1 = 0x00;
  352.   P3M0 &= ~0x03; // P30,P31 和 USB 的 D-,D+ 共用 PIN 脚
  353.   P3M1 |= 0x03;  // 需要将 P30,P31 设置为高阻输入模式
  354.   IRC48MCR = 0x80; // 使能内部 48M 的 USB 专用 IRC
  355.   while (!(IRC48MCR & 0x01))
  356.     ; // 等待震荡源稳定
  357.   USBCLK = 0x00; // 设置 USB 时钟源为内部 48M 的 USB 专用 IRC
  358.   USBCON = 0x09; // 使能 USB 功能
  359.   usb_init(); // 调用 USB CDC 初始化库函数
  360.   EUSB = 1; // 使能 USB 中断
  361. }
复制代码





回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-9 03:05 , Processed in 0.114438 second(s), 66 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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