找回密码
 立即注册
楼主: 飞行者

Ai8051u擎天柱学习冲哥《8051U深度入门到32位51大型实战视频》记录贴

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:158
  • 最近打卡:2025-10-15 08:07:41

2

主题

55

回帖

535

积分

高级会员

积分
535
发表于 2025-8-29 22:00:59 | 显示全部楼层
15。定时器做计数器

任务一.png 任务二.png
tim.c
  1. #include "tim.h"
  2. u32 Count_T1 = 0;
  3. //void TIM1_Count_Init(void)
  4. //{
  5. //        T1_CT = 1;                //设置外部计数
  6. //        T1_M1 = 0;                //设置模式为16位自动重载
  7. //        T1_M0 = 0;
  8. //        T1_GATE = 0;
  9. //       
  10. //        TH1 = (65536-Count_num)>>8;         //65526
  11. //        TL1 = (65536-Count_num);
  12. //       
  13. //        P3PU |= 0x20;
  14. //       
  15. //        TR1 = 1;
  16. //        ET1 = 1;                //定时器/计数器T1的中断允许位
  17. //}
  18. //void Timer1_Isr(void) interrupt 3
  19. //{
  20. //        Count_T1++;                //T1引脚检测到10个脉冲就会溢出一次
  21. //}
  22. ////定时器1计数
  23. //void T1_RunTask(void)
  24. //{
  25. //        u32 count_th_tl = 0;
  26. //        count_th_tl = ((u16)TH1<<8) + (u16)TL1;
  27. //        count_th_tl -= 65526;
  28. //       
  29. //        SEG7_ShowLong(Count_T1 * Count_num + count_th_tl, 10);
  30. //}
  31. /*
  32. 任务2:编写INT1测量低电平时间
  33. 由按键模拟信号,100us的计数周期计数
  34. */
  35. void Timer1_Isr(void) interrupt 3
  36. {
  37.         static u32 count_p33 = 0;        //p33计数变量初始值为0
  38.        
  39.         if(P33 == 0)                                //按键按下计数
  40.         {
  41.                 count_p33 ++;
  42.         }
  43.         else
  44.         {
  45.                 if(count_p33 > 0)
  46.                 {
  47.                         Count_T1 = count_p33;
  48.                 }
  49.                 count_p33 = 0;
  50.         }
  51.        
  52. }
  53. void Timer1_Init(void)                //100微秒@24.000MHz
  54. {
  55.         AUXR &= 0xBF;                        //定时器时钟12T模式
  56.         TMOD &= 0x0F;                        //设置定时器模式
  57.         TL1 = 0x38;                                //设置定时初始值
  58.         TH1 = 0xFF;                                //设置定时初始值
  59.         TF1 = 0;                                //清除TF1标志
  60.         TR1 = 1;                                //定时器1开始计时
  61.         ET1 = 1;                                //使能定时器1中断
  62. }
  63. //数码管输出Count_T1值
  64. void T1_RunTask(void)
  65. {
  66.         //SEG7_ShowLong(Count_T1 , 10);        //整数输出
  67.         SEG7_ShowString("%07.01f",((float)Count_T1)/10);
  68. }
复制代码

demo1.rar (208.02 KB, 下载次数: 12)
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:158
  • 最近打卡:2025-10-15 08:07:41

2

主题

55

回帖

535

积分

高级会员

积分
535
发表于 2025-8-29 22:04:54 | 显示全部楼层
15.定时器做计数器 课后小练

借鉴坛友乐高的课后作业
课后小练   
编译器一直有一个警告,消不掉。
CT计数器:
在设备的出料端口有一个感应器,每次有成品出来就会有一个低电平出来,计算相邻的两个产品出来的时间差来计算CT时间。
     1.计算P33引脚的相邻两次按下的时间,精确到100ms(即单个时间)
     2.计算按下P33的次数(即总产量)
3.数码管前四位显示单个时间 ,后四位显示次数

tim.c

  1. #include "tim.h"
  2. #include "io.h"
  3. extern u32 Count_INT1;           // 从io.c外部引用,用于存储总产量计数
  4. u32  Count_T1 = 0;               // 定时器1计数值(每10ms加1)
  5. u32  Count1 = 0;                 // 暂存的时间计数值
  6. extern u32 Count;                // 从io.c外部引用,用于存储CT时间(100ms单位)
  7. void INT1_Isr(void) interrupt 2
  8. {
  9.         Count1 = Count_T1;
  10.         if(Count1 >5)
  11.         {
  12.                 Count = Count1/10;
  13.                 Count_INT1++;
  14.         }
  15.         Count_T1 = 0;
  16.        
  17.        
  18. }
  19. void Ext_Init(void)
  20. {
  21.         IT1 = 1;                        //INT1(P3.3)下降沿中断
  22.         EX1 = 1;                        //使能INT1中断
  23. }
  24. void Timer1_Isr(void) interrupt 3
  25. {
  26.         Count_T1++;
  27. }
  28. void Timer1_Init(void)                //100微秒@24.000MHz
  29. {
  30.         AUXR |= 0x40;                        //定时器时钟1T模式
  31.         TMOD &= 0x0F;                        //设置定时器模式
  32.         TL1 = 0xA0;                                //设置定时初始值
  33.         TH1 = 0xF6;                                //设置定时初始值
  34.         TF1 = 0;                                //清除TF1标志
  35.         TR1 = 1;                                //定时器1开始计时
  36.         ET1 = 1;                                //使能定时器1中断
  37. }
复制代码

demo1.rar (207.61 KB, 下载次数: 10)

回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:158
  • 最近打卡:2025-10-15 08:07:41

2

主题

55

回帖

535

积分

高级会员

积分
535
发表于 2025-9-11 22:45:12 | 显示全部楼层
16 DS18b20测温
屏幕截图 2025-09-05 071044.png
18b20.c
  1. #include "18b20.h"
  2. u8  MinusFlag = 0;                //温度正负标志位,等于0为正数,等于1为负数
  3. u32 Temp_18b20;                        //最终温度,放大了10000倍
  4. void Delay480us(void)        //@24.000MHz
  5. {
  6.         unsigned long edata i;
  7.         _nop_();
  8.         _nop_();
  9.         _nop_();
  10.         i = 2878UL;
  11.         while (i) i--;
  12. }
  13. void Delay60us(void)        //@24.000MHz
  14. {
  15.         unsigned long edata i;
  16.         _nop_();
  17.         _nop_();
  18.         _nop_();
  19.         i = 358UL;
  20.         while (i) i--;
  21. }
  22. void Delay1us(void)        //@24.000MHz
  23. {
  24.         unsigned long edata i;
  25.         _nop_();
  26.         _nop_();
  27.         _nop_();
  28.         i = 4UL;
  29.         while (i) i--;
  30. }
  31. //复位(输出0保持480us,输出1保持60us,读取当前电平,延时420us)
  32. void DS18B20_Reset(void)
  33. {
  34.         u8 flag = 1;
  35.         while(flag)                //只要括号里的变量大于0,就会一直执行
  36.         {
  37.                 DQ = 0;
  38.                 Delay480us();
  39.                 DQ = 1;
  40.                 Delay60us();
  41.                 flag = DQ;
  42.                 Delay480us();       
  43.         }
  44. }
  45. //写逻辑0(输出0保持60us+,输出1保持1us+)
  46. void DS18B20_Write_0(void)
  47. {
  48.         DQ = 0;
  49.         Delay60us();
  50.         DQ = 1;
  51.         Delay1us();
  52.         Delay1us();
  53. }
  54. //写逻辑1(输出0保持1us+,输出1保持60us+)
  55. void DS18B20_Write_1(void)
  56. {
  57.         DQ = 0;
  58.         Delay1us();
  59.         Delay1us();
  60.         DQ = 1;
  61.         Delay60us();
  62. }
  63. //读逻辑0/1(输出0保持1us+,输出1保持1us+,读取当前电平,延时60us)
  64. bit DS18B20_Read(void)
  65. {
  66.         bit state = 0;
  67.         DQ = 0;
  68.         Delay1us();
  69.         Delay1us();
  70.         DQ = 1;
  71.         Delay1us();
  72.         Delay1us();
  73.         state = DQ;                //暂存这个DQ的值
  74.         Delay60us();
  75.        
  76.         return state;        //读取单个位的数据
  77. }
  78. //写1字节(先输出低位,在输出高位)
  79. void DS18B20_WriteByte( u8 dat )
  80. {
  81.         u8 i;
  82.         for(i=0;i<8;i++)
  83.         {
  84.                 if( dat & 0x01 )                //最低位是1,发逻辑1电平
  85.                 {
  86.                         DS18B20_Write_1();
  87.                 }
  88.                 else                                        //否则,发逻辑0电平
  89.                 {
  90.                         DS18B20_Write_0();
  91.                 }
  92.                 dat >>= 1;                                //dat = (dat>>1);
  93.         }
  94. }
  95. //读1字节(先读到的是低位,后读到的是高位)
  96. u8 DS18B20_ReadByte( void )
  97. {
  98.         u8 i;
  99.         u8 dat=0;                                //数据暂存
  100.         for(i=0;i<8;i++)                //循环读取八次
  101.         {
  102.                 dat >>= 1;
  103.                 if( DS18B20_Read())
  104.                 {
  105.                         dat |= 0x80;
  106.                 }
  107.                 else
  108.                 {
  109.                 }               
  110.         }
  111.         return dat;
  112. }
  113. //温度读取换算函数
  114. //(复位-CCH-44H-等待-复位-CCH-BEH-读取2字节温度数据-换算)
  115. void DS18B20_ReadTemp(void)
  116. {
  117.         u8  TempH = 0;
  118.         u8  TempL = 0;
  119.         u16 Temp = 0;
  120.        
  121. //-----------------发送检测命令--------------------------       
  122.         DS18B20_Reset();                        //1,发送复位命令
  123.         DS18B20_WriteByte(0xcc);        //2,跳过ROM命令
  124.         DS18B20_WriteByte(0x44);        //3.开始转化命令
  125.         while(!DQ);                                 //4.等待引脚变成高电平
  126.        
  127. //-----------------发送读取命令---------------------------
  128.         DS18B20_Reset();                        //1,发送复位命令
  129.         DS18B20_WriteByte(0xcc);                //2,跳过ROM命令
  130.         DS18B20_WriteByte(0xBE);                //3.开始读取命令
  131.         TempL = DS18B20_ReadByte(); //读取低字节温度
  132.         TempH = DS18B20_ReadByte(); //读取高字节温度
  133.        
  134.         if( TempH & 0x80 )                        //如果最高位是1,这个就是负数
  135.         {
  136.                 MinusFlag = 1;                        //标志位1,温度为负
  137.                 Temp = (((u16)TempH << 8) | ((u16)TempL << 0));                //两个八位转换为16位
  138.                 Temp = (~Temp)+1;                //负数补码,取反加1
  139.                 Temp_18b20 = (u32)Temp*625;        //最终温度       
  140.         }
  141.         else
  142.         {
  143.                 MinusFlag = 0;                        //标志位1,温度为正
  144.                 Temp = (((u16)TempH << 8) | ((u16)TempL << 0));                //两个八位转换为16位
  145.                 Temp_18b20 = (u32)Temp*625;        //最终温度
  146.         }
  147. }
复制代码

demo3.rar (233.27 KB, 下载次数: 5)
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:158
  • 最近打卡:2025-10-15 08:07:41

2

主题

55

回帖

535

积分

高级会员

积分
535
发表于 2025-9-11 22:56:34 | 显示全部楼层
16.DS18b20测温 课后小练 测温计 参考坛友“乐高”的16课课后小练代码

屏幕截图 2025-09-04 215230.png
io.c
  1. #include "io.h"
  2. #include "18b20.h"
  3. u8 Key_vol = 0;
  4. u8  MinusFlag;
  5. u8 SEG_NUM[] =                                 //不带小数点
  6. {
  7.     0x3F,       /*'0', 0*/
  8.     0x06,       /*'1', 1*/
  9.     0x5B,       /*'2', 2*/
  10.     0x4F,       /*'3', 3*/
  11.     0x66,       /*'4', 4*/
  12.     0x6D,       /*'5', 5*/
  13.     0x7D,       /*'6', 6*/
  14.     0x07,       /*'7', 7*/
  15.     0x7F,       /*'8', 8*/
  16.     0x6F,       /*'9', 9*/
  17.     0x77,       /*'A', 10*/
  18.     0x7C,       /*'B', 11*/
  19.     0x39,       /*'C', 12*/
  20.     0x5E,       /*'D', 13*/
  21.     0x79,       /*'E', 14*/
  22.     0x71,       /*'F', 15*/
  23.     0x54,       /*'N', 16*/
  24.     0x5C,       /*'O', 17*/
  25.     0x73,       /*'P', 18*/
  26.     0x50,       /*'R', 19*/
  27.     0x40,       /*'-', 20*/
  28.     0x00,       /*' ', 21*/
  29.     0x80,       /*'.', 22*/
  30. };
  31. u8 SEG_NUM1[] =                                //带小数点
  32. {
  33.         0xBF,       /*'0', 0*/
  34.     0x86,       /*'1', 1*/
  35.     0xDB,       /*'2', 2*/
  36.     0xCF,       /*'3', 3*/
  37.     0xE6,       /*'4', 4*/
  38.     0xED,       /*'5', 5*/
  39.     0xFD,       /*'6', 6*/
  40.     0x87,       /*'7', 7*/
  41.     0xFF,       /*'8', 8*/
  42.     0x6F,       /*'9', 9*/
  43.     0x77,       /*'A', 10*/
  44.     0x7C,       /*'B', 11*/
  45.     0x39,       /*'9', 12*/
  46.     0x5E,       /*'D', 13*/
  47.     0x79,       /*'E', 14*/
  48.     0x71,       /*'F', 15*/
  49.     0x40,       /*'-', 16*/
  50.     0x00,       /*' ', 17*/
  51.     0x80,       /*'.', 18*/
  52. };
  53. u8 T_NUM[8] =
  54. {
  55.         0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80
  56. };
  57. void Init_595(void)
  58. {
  59.         HC595_SER  = 0;
  60.         HC595_RCK  = 0;
  61.         HC595_SCK  = 0;
  62. }
  63. void Send_595( u8 dat )
  64. {
  65.         u8 i;
  66.        
  67.         for( i=0; i<8; i++ )
  68.         {
  69.                 dat <<= 1;                        //数值左移一位
  70.                 HC595_SER  = CY;        //数据写到引脚
  71.             HC595_SCK  = 1;                //输出上升沿的时钟信号
  72.         HC595_SCK  = 0;
  73.         }
  74. }
  75. void Display_Seg( u8 HC595_1,u8 HC595_2)
  76. {
  77.         Send_595(HC595_1);                //数码管段码输出        高电平点亮
  78.         Send_595(HC595_2);                //数码管位码输出        低电平点亮
  79.        
  80.         HC595_RCK  = 1;                        //数据输出
  81.         HC595_RCK  = 0;
  82. }
  83. u8 passward[8] = { 21,21,21,21,21,21,21,21};
  84. u8 Seg_no = 0;
  85. void SEG_Task0(void)                //未开机,熄屏
  86. {
  87.         switch(Seg_no)
  88.                 {
  89.                 case 0: Display_Seg( SEG_NUM[21], ~T_NUM[0] );                   break;
  90.                 case 1: Display_Seg( SEG_NUM[21], ~T_NUM[1] );          break;
  91.                 case 2: Display_Seg( SEG_NUM[21], ~T_NUM[2] );                   break;
  92.                 case 3: Display_Seg( SEG_NUM[21], ~T_NUM[3] );                   break;
  93.                 case 4: Display_Seg( SEG_NUM[21], ~T_NUM[4] );               break;
  94.                 case 5: Display_Seg( SEG_NUM[21], ~T_NUM[5] );                   break;
  95.                 case 6: Display_Seg( SEG_NUM1[17], ~T_NUM[6] );          break;
  96.                 case 7: Display_Seg( SEG_NUM[21], ~T_NUM[7] );          break;
  97.                   }
  98.                
  99.                
  100. }
  101. void SEG_Task1(void)                ////开机2秒内显示"---C"
  102. {
  103.         switch(Seg_no)
  104.                 {
  105.                 case 0: Display_Seg( SEG_NUM[21], ~T_NUM[0] );                   break;
  106.                 case 1: Display_Seg( SEG_NUM[21], ~T_NUM[1] );          break;
  107.                 case 2: Display_Seg( SEG_NUM[21], ~T_NUM[2] );                   break;
  108.                 case 3: Display_Seg( SEG_NUM[21], ~T_NUM[3] );                   break;
  109.                 case 4: Display_Seg( SEG_NUM[20], ~T_NUM[4] );               break;
  110.                 case 5: Display_Seg( SEG_NUM[20], ~T_NUM[5] );                   break;
  111.                 case 6: Display_Seg( SEG_NUM[20], ~T_NUM[6] );          break;
  112.                 case 7: Display_Seg( SEG_NUM[12], ~T_NUM[7] );          break;
  113.                   }
  114.                
  115. }
  116. void SEG_Task2(void)                ////开机2秒内显示"---F"
  117. {
  118.         switch(Seg_no)
  119.                 {
  120.                 case 0: Display_Seg( SEG_NUM[21], ~T_NUM[0] );                   break;
  121.                 case 1: Display_Seg( SEG_NUM[21], ~T_NUM[1] );          break;
  122.                 case 2: Display_Seg( SEG_NUM[21], ~T_NUM[2] );                   break;
  123.                 case 3: Display_Seg( SEG_NUM[21], ~T_NUM[3] );                   break;
  124.                 case 4: Display_Seg( SEG_NUM[20], ~T_NUM[4] );               break;
  125.                 case 5: Display_Seg( SEG_NUM[20], ~T_NUM[5] );                   break;
  126.                 case 6: Display_Seg( SEG_NUM[20], ~T_NUM[6] );          break;
  127.                 case 7: Display_Seg( SEG_NUM[15], ~T_NUM[7] );          break;
  128.                   }
  129.                
  130. }
  131. void SEG_Task3(void)                //开机2秒后正常显示摄氏温度
  132. {
  133.         switch(Seg_no)
  134.                 {
  135.                 case 0: Display_Seg( SEG_NUM[passward[0]], ~T_NUM[0] );                   break;
  136.                 case 1: Display_Seg( SEG_NUM[passward[1]], ~T_NUM[1] );         break;
  137.                 case 2: Display_Seg( SEG_NUM[passward[2]], ~T_NUM[2] );                   break;
  138.                 case 3: if(MinusFlag)
  139.                                 Display_Seg( SEG_NUM[20], ~T_NUM[3] );                   break;
  140.                 case 4: Display_Seg( SEG_NUM[passward[4]], ~T_NUM[4] );               break;
  141.                 case 5: Display_Seg( SEG_NUM1[passward[5]], ~T_NUM[5] );                   break;
  142.                 case 6: Display_Seg( SEG_NUM[passward[6]], ~T_NUM[6] );         break;
  143.                 case 7: Display_Seg( SEG_NUM[12], ~T_NUM[7] );         break;
  144.                
  145.                   }
  146.                
  147. }
  148. void SEG_Task4(void)                //开机2秒后正常显示华氏温度
  149. {
  150.         switch(Seg_no)
  151.                 {
  152.                 case 0: Display_Seg( SEG_NUM[passward[0]], ~T_NUM[0] );                   break;
  153.                 case 1: Display_Seg( SEG_NUM[passward[1]], ~T_NUM[1] );         break;
  154.                 case 2: Display_Seg( SEG_NUM[passward[2]], ~T_NUM[2] );                   break;
  155.                 case 3: if(MinusFlag)
  156.                                 Display_Seg( SEG_NUM[20], ~T_NUM[3] );                   break;
  157.                 case 4: Display_Seg( SEG_NUM[passward[4]], ~T_NUM[4] );               break;
  158.                 case 5: Display_Seg( SEG_NUM1[passward[5]], ~T_NUM[5] );                   break;
  159.                 case 6: Display_Seg( SEG_NUM[passward[6]], ~T_NUM[6] );         break;
  160.                 case 7: Display_Seg( SEG_NUM[15], ~T_NUM[7] );         break;
  161.                   }
  162.                
  163. }
  164. u16 Timing = 0;                        //计时
  165. bit Temp_C_F;                        //温度标志位,1(真)华氏,0(假)摄氏
  166. bit run = 0;                        //开关机标志位,0关机,1开机
  167. void SEG_Show(void)
  168. {
  169.         u8 num =0;
  170.         if(run == 0)                //没有按下开机键
  171.         {
  172.                 Timing = 0;
  173.                 SEG_Task0();        //执行息屏函数
  174.         }
  175.         else
  176.         {
  177.                 Timing++;
  178.                 if(Timing>2000)
  179.                 {
  180.                         if(Temp_C_F)
  181.                                 SEG_Task4();
  182.                         else
  183.                                 SEG_Task3();
  184.                         Timing = 2000;
  185.                 }
  186.                 else
  187.                 {
  188.                          if(Temp_C_F)
  189.                                  SEG_Task2();
  190.                          else
  191.                                  SEG_Task1();
  192.                 }
  193.         }
  194.         Seg_no ++;
  195.         if( Seg_no>7 )
  196.                 Seg_no=0;
  197. }
  198. void SEG_Show_U32(u32 num)
  199. {
  200.         u8 i;
  201.         for(i=0; i<3;i++)
  202.         {
  203.                 passward[6-i] = num%10;
  204.                 num /= 10;
  205.         }
  206. }
  207. //u8 Key_Vol3 = 0;                                                //判断按钮是否按下
  208. u8 Key_no = 0;                                                        //数码管位计数
  209. u16 key_num;
  210. void KEY_Task(void)
  211. {
  212. //---------------开关机-------------------------
  213.                 if(Temp_C_F == 0)
  214.                         SEG_Show_U32(Temp_18b20);
  215.                 else
  216.                         SEG_Show_U32(Temp_F);
  217.                 if(P01 == 0)
  218.                 {
  219.                        
  220.                         if(P01 == 0)
  221.                         {
  222.                                 run = !run;
  223.                                 key_num = 0;
  224.                         }
  225.                         while(P01 == 0);
  226.                 }
  227. //---------------华氏摄氏转换-------------------------       
  228.         key_num++;
  229.         if(P03 == 0)
  230.         {
  231.                 Key_vol++;
  232.                 key_num = 0;
  233.                 if(Key_vol == 5)
  234.                 {
  235.                         Temp_C_F = !Temp_C_F;
  236.                 }
  237.         }
  238.         else
  239.                 Key_vol = 0;
  240.         if(key_num == 3000)
  241.                 run = 0;
  242.                
  243. }
复制代码

demo2.rar (230.73 KB, 下载次数: 4)
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:158
  • 最近打卡:2025-10-15 08:07:41

2

主题

55

回帖

535

积分

高级会员

积分
535
发表于 2025-9-14 21:28:09 | 显示全部楼层
17.串口的简单应用

屏幕截图 2025-09-14 184555.png
usart.c
  1. #include "usart.h"
  2. #include "io.h"
  3. u8 Rec_Dat[50];                //接收缓冲区
  4. u8 Rec_Num = 0;                //接收计数
  5. bit B_TX2_Busy = 0;        //发送完成标志位
  6. void Uart2_Isr(void) interrupt 8
  7. {
  8.         if (S2CON & 0x02)        //检测串口2发送中断
  9.         {
  10.                 S2CON &= ~0x02;        //清除串口2发送中断请求位
  11.                 B_TX2_Busy = 0;        //发送完成清零
  12.         }
  13.         if (S2CON & 0x01)        //检测串口2接收中断
  14.         {
  15.                 S2CON &= ~0x01;        //清除串口2接收中断请求位
  16.                
  17.                 Rec_Dat[Rec_Num++] = S2BUF;
  18.         }
  19. }
  20. void Uart2_Init(void)        //9600bps@24.000MHz
  21. {
  22.        
  23.         P_SW2 |= 0x01;                //UART2/USART2: RxD2(P4.2), TxD2(P4.3)
  24.        
  25.         S2CON = 0x50;                //8位数据,可变波特率
  26.         AUXR |= 0x04;                //定时器时钟1T模式
  27.         T2L = 0x8F;                        //设置定时初始值
  28.         T2H = 0xFD;                        //设置定时初始值
  29.         AUXR |= 0x10;                //定时器2开始计时
  30.         IE2 |= 0x01;                //使能串口2中断
  31.        
  32.         B_TX2_Busy = 0;
  33.         Rec_Num = 0;       
  34. }
  35. void Uart2_SendStr(u8 *puts)                        //串口数据发送函数
  36. {
  37.            for (; *puts != 0;  puts++)     //遇到停止符0结束
  38.     {
  39.         S2BUF = *puts;
  40.         B_TX2_Busy = 1;
  41.         while(B_TX2_Busy);
  42.     }
  43. }
  44. /*
  45. 1.发送OPEN\r\n打开数码管,数码管显示“- - - -”
  46. 思路:判断发送的数据最后六位,是否等于open\r\n,只要检测到OPEN\r\n ,
  47. OPEN前面的数据都可以忽略不计
  48. 2.发送CLOSE\r\n打开数码管,数码管全部熄灭
  49. */
  50. void Usart2_RunTask(void)
  51. {
  52.         if(Rec_Num >= 6)        //是否接收到了6位以上的数据
  53.         {
  54.                 if((Rec_Dat[Rec_Num-1] == '\n') && (Rec_Dat[Rec_Num-2] == '\r'))                //数据末尾判断
  55.                 {
  56.                         if((Rec_Dat[Rec_Num-6] == 'O') && (Rec_Dat[Rec_Num-5] == 'P') && (Rec_Dat[Rec_Num-4] == 'E') && (Rec_Dat[Rec_Num-3] == 'N'))
  57.                         {
  58.                                 passward[0] = 20;
  59.                                 passward[1] = 20;
  60.                                 passward[2] = 20;
  61.                                 passward[3] = 20;
  62.                                 Uart2_SendStr("打开成功\r\n");
  63.                         }
  64.                         else if((Rec_Dat[Rec_Num-7] == 'C') && (Rec_Dat[Rec_Num-6] == 'L') && (Rec_Dat[Rec_Num-5] == 'O') && (Rec_Dat[Rec_Num-4] == 'S') && (Rec_Dat[Rec_Num-3] == 'E'))
  65.                         {
  66.                                 passward[0] = 21;
  67.                                 passward[1] = 21;
  68.                                 passward[2] = 21;
  69.                                 passward[3] = 21;
  70.                                 Uart2_SendStr("关闭成功\r\n");
  71.                         }
  72.                         Rec_Num = 0;
  73.                 }
  74.                
  75.         }
  76. }
复制代码

demo1.rar (229.79 KB, 下载次数: 5)
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:158
  • 最近打卡:2025-10-15 08:07:41

2

主题

55

回帖

535

积分

高级会员

积分
535
发表于 2025-9-14 21:31:37 | 显示全部楼层
17.串口的简单应用  课后小练 智能数码管显示屏

屏幕截图 2025-09-14 212205.png
void Usart2_RunTask(void)
  1. void Usart2_RunTask(void)
  2. {
  3.         if(Rec_Num >= 6)        //是否接收到了6位以上的数据
  4.         {
  5.                 if((Rec_Dat[Rec_Num-1] == '\n') && (Rec_Dat[Rec_Num-2] == '\r'))                //数据末尾判断
  6.                 {
  7.                         if((Rec_Dat[Rec_Num-6] == 'O') && (Rec_Dat[Rec_Num-5] == 'P') && (Rec_Dat[Rec_Num-4] == 'E') && (Rec_Dat[Rec_Num-3] == 'N'))
  8.                         {
  9.                                 passward[0] = 20;
  10.                                 passward[1] = 20;
  11.                                 passward[2] = 20;
  12.                                 passward[3] = 20;
  13.                                 Uart2_SendStr("打开成功\r\n");
  14.                         }
  15.                         else if((Rec_Dat[Rec_Num-7] == 'C') && (Rec_Dat[Rec_Num-6] == 'L') && (Rec_Dat[Rec_Num-5] == 'O') && (Rec_Dat[Rec_Num-4] == 'S') && (Rec_Dat[Rec_Num-3] == 'E'))
  16.                         {
  17.                                 passward[0] = 21;
  18.                                 passward[1] = 21;
  19.                                 passward[2] = 21;
  20.                                 passward[3] = 21;
  21.                                 Uart2_SendStr("关闭成功\r\n");
  22.                         }else if((Rec_Dat[Rec_Num-9] == 'D') &&(Rec_Dat[Rec_Num-8] == 'A') &&(Rec_Dat[Rec_Num-7] == 'T') && (Rec_Dat[Rec_Num-6] == '+') && (Rec_Dat[Rec_Num-5] == '1') && (Rec_Dat[Rec_Num-4] == '2') && (Rec_Dat[Rec_Num-3] == '3'))
  23.                         {
  24.                                 passward[0] = 1;
  25.                                 passward[1] = 2;
  26.                                 passward[2] = 3;
  27. //                                passward[3] = 21;
  28.                                 Uart2_SendStr("发送成功\r\n");
  29.                         }
  30.                         Rec_Num = 0;
  31.                 }
  32.                
  33.         }
  34. }
复制代码

demo1.rar (230.21 KB, 下载次数: 4)

回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-10-16 05:55 , Processed in 1.819336 second(s), 79 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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