找回密码
 立即注册
楼主: 芯未来

《8051U深度入门到32位51大型实战视频》学习心得

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-06-16 09:55:47

9

主题

30

回帖

691

积分

版主

积分
691
发表于 2025-1-23 14:36:51 | 显示全部楼层
跟着冲哥打卡第13集,已手敲代码,测试通过
13.png



  1. #include "io.h"
  2. u8 State1=0;                      //LED1初始状态
  3. u8 State2=0;                      //LED2初始状态
  4. u8 State3=0;                      //LED3初始状态
  5. u16  Key_Vol=0;                   //按键按下持续时间
  6. u8 SEG_NUM[]=
  7. {
  8.         0x3F,       /*'0', 0*/
  9.     0x06,       /*'1', 1*/
  10.     0x5B,       /*'2', 2*/
  11.     0x4F,       /*'3', 3*/
  12.     0x66,       /*'4', 4*/
  13.     0x6D,       /*'5', 5*/
  14.     0x7D,       /*'6', 6*/
  15.     0x07,       /*'7', 7*/
  16.     0x7F,       /*'8', 8*/
  17.     0x6F,       /*'9', 9*/
  18.     0x77,       /*'A', 10*/
  19.     0x7C,       /*'B', 11*/
  20.     0x39,       /*'C', 12*/
  21.     0x5E,       /*'D', 13*/
  22.     0x79,       /*'E', 14*/
  23.     0x71,       /*'F', 15*/
  24.     0x40,       /*'-', 16*/
  25.     0x00,       /*' ', 17*/
  26.     0x80,       /*'.', 18*/
  27. };
  28. u8 T_NUM[8]=
  29. {
  30.         0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80
  31. };
  32. void LED0_Blink(void)
  33. {
  34.         State1=!State1;
  35.         P00=State1;
  36. }
  37. void LED1_Blink(void)
  38. {
  39.         State2=!State2;
  40.         P01=State2;
  41. }
  42. void LED2_Blink(void)
  43. {
  44.         State3=!State3;
  45.         P02=State3;
  46. }
  47. void KEY_Task(void)
  48. {
  49.         if(P33==0)
  50.         {
  51.                 Key_Vol++;
  52.                 if(Key_Vol==5)
  53.                 {
  54.                         //按键按下的任务
  55. //                        printf("按键单击\r\n");
  56.                        
  57.                         USB_Reset_U( );
  58.                         IAP_CONTR=0X20;
  59.                 }
  60.         }
  61.         else
  62.         {
  63.                 Key_Vol=0;
  64.         }
  65. }
  66. /*
  67.    #define ROW1   P06                //端口定义
  68.    #define ROW2   P07
  69.    #define COL1   P00
  70.    #define COL2   P01
  71.    #define COL3   P02
  72.    #define COL4   P03
  73. */
  74. u8 key_num=0xff;
  75. //任务1:数码管显示当前的按键号
  76. void Task_1(void)
  77. {
  78.         //第一步:现将P0.0-P0.3输出低电平,P0.6-P0.7输出高电平,如果有按键按下,按下的那一行的IO就会变成低电平,就可以判断出哪一行按下了。
  79.     COL1=0;
  80.         COL2=0;
  81.         COL3=0;
  82.         COL4=0;
  83.         ROW1=1;
  84.         ROW2=1;
  85.         if((ROW1==0)||(ROW2==0))       //如果行按键有按下
  86.         {
  87.                 if((ROW1==0)&&(ROW2==0))   //如果两行都有按键按下,不处理
  88.                 {
  89.                        
  90.                 }
  91.                 else if(((ROW1==1)&&(ROW2==0)) ||((ROW1==0)&&(ROW2==1)))     //如果有按键按下,而且只有1颗
  92.                 {
  93.                         if(ROW1==0)       //判断哪一行,输出行开始的序号
  94.                                 key_num=0;
  95.                         else if(ROW2==0)
  96.                                 key_num=4;
  97.                         //第二步:现将P0.0-P0.3输出高电平,P0.6-P0.7输出低电平,如果有按键按下,按下的那一列的IO就会变成低电平,就可以判断出哪一列按下了。
  98.                     COL1=1;
  99.                 COL2=1;
  100.                 COL3=1;
  101.                 COL4=1;
  102.                 ROW1=0;
  103.                 ROW2=0;
  104.                         if(COL1==0)    //判断哪一列,叠加按键的序号
  105.                         {
  106.                         }
  107.                         else if(COL2==0)
  108.                         {
  109.                                 key_num=key_num+1;
  110.                         }
  111.                         else if(COL3==0)
  112.                         {
  113.                                 key_num=key_num+2;
  114.                         }
  115.                         else if(COL4==0)
  116.                         {
  117.                                 key_num=key_num+3;
  118.                         }
  119.                 }
  120.                 COL1=0;
  121.             COL2=0;
  122.             COL3=0;
  123.             COL4=0;
  124.             ROW1=1;
  125.             ROW2=1;
  126.         }
  127.         else
  128.         {
  129.                 key_num=0xff;
  130.         }
  131.        
  132.     //第三步:行列组合一下就可以判断出是哪个按键按下了。
  133. }       
  134. void Init_595(void)
  135. {
  136.    HC595_SER =0;
  137.    HC595_RCK =0;
  138.    HC595_SCK =0;
  139. }
  140. void Send_595(u8 dat)
  141. {
  142.         u8 i;
  143.         for(i=0;i<8;i++)
  144.         {
  145.                 dat <<=1;  //DAT=(DAT<<1);  //CY
  146.                 HC595_SER=CY;    //先把数据写到引脚上
  147.                 HC595_SCK=1;                //输出上升沿的时钟信号
  148.                 HC595_SCK=0;
  149.         }
  150. }
  151. void Display_Seg(u8 HC595_1,u8 HC595_2)
  152. {
  153.         Send_595(HC595_1);      //数码管段码输出   高电平点亮
  154.         Send_595(HC595_2);      //数码管位码       低电平点亮
  155.        
  156.         HC595_RCK=1;           //数据输出
  157.         HC595_RCK=0;
  158. }
  159. //void SEG_Task(void)
  160. //{
  161. //        if(key_num==255)
  162. //                Display_Seg( SEG_NUM[17], ~T_NUM[0]);
  163. //        else
  164. //                Display_Seg( SEG_NUM[key_num], ~T_NUM[0]);
  165. //}
  166. u8 passward[8]={16,16,16,16,16,16,16,16};
  167. u8 Seg_no=0;
  168. void SEG_Task(void)
  169. {
  170.         u8 num=0;        
  171.         if(Seg_no==0)                                             
  172.         {
  173.                 Display_Seg( SEG_NUM[passward[0]], ~T_NUM[0]);        
  174.         }
  175.         else if(Seg_no==1)                                      
  176.         {
  177.                 Display_Seg( SEG_NUM[passward[1]], ~T_NUM[1]);        
  178.         }
  179.         else if(Seg_no==2)                                       
  180.         {
  181.                 Display_Seg( SEG_NUM[passward[2]], ~T_NUM[2]);        
  182.         }
  183.         else if(Seg_no==3)                                       
  184.         {
  185.                 Display_Seg( SEG_NUM[passward[3]], ~T_NUM[3]);        
  186.         }
  187.         else if(Seg_no==4)                                       
  188.         {
  189.                 Display_Seg( SEG_NUM[passward[4]], ~T_NUM[4]);        
  190.         }
  191.         else if(Seg_no==5)                                       
  192.         {
  193.                 Display_Seg( SEG_NUM[passward[5]], ~T_NUM[5]);         
  194.         }
  195.         else if(Seg_no==6)                                       
  196.         {
  197.                 Display_Seg( SEG_NUM[passward[6]], ~T_NUM[6]);        
  198.         }
  199.         else if(Seg_no==7)                                       
  200.         {
  201.                 Display_Seg( SEG_NUM[passward[7]], ~T_NUM[7]);        
  202.         }
  203.         else
  204.         {
  205.                
  206.         }
  207.         Seg_no ++;
  208.         if( Seg_no >7)
  209.                 Seg_no=0;
  210. }
  211. u8 Key_Vol3=0;
  212. u8 key_no=0;
  213. void PW_write_Task(void)
  214. {
  215.         if(key_num<0xff)
  216.         {
  217.                 Key_Vol3++;
  218.                 if(Key_Vol3== 5)
  219.                 {
  220.                         if(key_no==0)
  221.                         {
  222.                                 passward[0]=16;
  223.                                 passward[1]=16;
  224.                                 passward[2]=16;
  225.                                 passward[3]=16;
  226.                                 passward[4]=16;
  227.                                 passward[5]=16;
  228.                                 passward[6]=16;
  229.                                 passward[7]=16;
  230.                                
  231.                         }
  232.                         passward[key_no]=key_num;
  233.                         key_no ++;
  234. //                        passward[7]=17;
  235.                         if(key_no==8)     //密码输入到8位
  236.                         {
  237.                                 if((passward[0]==1)&&(passward[1]==2)&&(passward[2]==3)&&(passward[3]==4)&&(passward[4]==5)&&(passward[5]==6)&&(passward[6]==7)&&(passward[7]==0))
  238.                                 {
  239.                                         passward[0]=17;
  240.                                         passward[1]=17;
  241.                                         passward[2]=17;
  242.                                         passward[3]=17;
  243.                                         passward[4]=17;
  244.                                         passward[5]=17;
  245.                                         passward[6]=17;
  246.                                         passward[7]=1;
  247.                                 }
  248.                                 else
  249.                                 {
  250.                                         passward[0]=16;
  251.                                     passward[1]=16;
  252.                                     passward[2]=16;
  253.                                     passward[3]=16;
  254.                                     passward[4]=16;
  255.                                     passward[5]=16;
  256.                                     passward[6]=16;
  257.                                     passward[7]=16;
  258.                                        
  259.                                 }
  260.                                 key_no=0;
  261.                         }
  262.                 }
  263.         }
  264.         else
  265.         {
  266.                 Key_Vol3=0;
  267.         }
  268. }
  269. void INT1_Init(void)
  270. {
  271.         IT1=1;            //下降沿中断
  272.         EX1=1;            //打开中断允许
  273.         EA=1;            //打开总中断
  274. }
  275. void INT_ISR(void)   interrupt  2
  276. {
  277.         P01=!P01;
  278. }
复制代码


AI8051U教学视频第十三集外部中断.zip

166.36 KB, 下载次数: 13

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-06-16 09:55:47

9

主题

30

回帖

691

积分

版主

积分
691
发表于 2025-1-23 15:35:52 | 显示全部楼层
跟着冲哥打卡第14集,已手敲代码,测试通过
任务1:编写IO口中断程序
14.1.jpg

  1. #include "io.h"
  2. u8 State1=0;                      //LED1初始状态
  3. u8 State2=0;                      //LED2初始状态
  4. u8 State3=0;                      //LED3初始状态
  5. u16  Key_Vol=0;                   //按键按下持续时间
  6. u8 SEG_NUM[]=
  7. {
  8.         0x3F,       /*'0', 0*/
  9.     0x06,       /*'1', 1*/
  10.     0x5B,       /*'2', 2*/
  11.     0x4F,       /*'3', 3*/
  12.     0x66,       /*'4', 4*/
  13.     0x6D,       /*'5', 5*/
  14.     0x7D,       /*'6', 6*/
  15.     0x07,       /*'7', 7*/
  16.     0x7F,       /*'8', 8*/
  17.     0x6F,       /*'9', 9*/
  18.     0x77,       /*'A', 10*/
  19.     0x7C,       /*'B', 11*/
  20.     0x39,       /*'C', 12*/
  21.     0x5E,       /*'D', 13*/
  22.     0x79,       /*'E', 14*/
  23.     0x71,       /*'F', 15*/
  24.     0x40,       /*'-', 16*/
  25.     0x00,       /*' ', 17*/
  26.     0x80,       /*'.', 18*/
  27. };
  28. u8 T_NUM[8]=
  29. {
  30.         0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80
  31. };
  32. void LED0_Blink(void)
  33. {
  34.         State1=!State1;
  35.         P00=State1;
  36. }
  37. void LED1_Blink(void)
  38. {
  39.         State2=!State2;
  40.         P01=State2;
  41. }
  42. void LED2_Blink(void)
  43. {
  44.         State3=!State3;
  45.         P02=State3;
  46. }
  47. void KEY_Task(void)
  48. {
  49.         if(P33==0)
  50.         {
  51.                 Key_Vol++;
  52.                 if(Key_Vol==5)
  53.                 {
  54.                         //按键按下的任务
  55. //                        printf("按键单击\r\n");
  56.                         
  57.                         USB_Reset_U( );
  58.                         IAP_CONTR=0X20;
  59.                 }
  60.         }
  61.         else
  62.         {
  63.                 Key_Vol=0;
  64.         }
  65. }
  66. /*
  67.    #define ROW1   P06                //端口定义
  68.    #define ROW2   P07
  69.    #define COL1   P00
  70.    #define COL2   P01
  71.    #define COL3   P02
  72.    #define COL4   P03
  73. */
  74. u8 key_num=0xff;
  75. //任务1:数码管显示当前的按键号
  76. void Task_1(void)
  77. {
  78.         //第一步:现将P0.0-P0.3输出低电平,P0.6-P0.7输出高电平,如果有按键按下,按下的那一行的IO就会变成低电平,就可以判断出哪一行按下了。
  79.     COL1=0;
  80.         COL2=0;
  81.         COL3=0;
  82.         COL4=0;
  83.         ROW1=1;
  84.         ROW2=1;
  85.         if((ROW1==0)||(ROW2==0))       //如果行按键有按下
  86.         {
  87.                 if((ROW1==0)&&(ROW2==0))   //如果两行都有按键按下,不处理
  88.                 {
  89.                         
  90.                 }
  91.                 else if(((ROW1==1)&&(ROW2==0)) ||((ROW1==0)&&(ROW2==1)))     //如果有按键按下,而且只有1颗
  92.                 {
  93.                         if(ROW1==0)       //判断哪一行,输出行开始的序号
  94.                                 key_num=0;
  95.                         else if(ROW2==0)
  96.                                 key_num=4;
  97.                         //第二步:现将P0.0-P0.3输出高电平,P0.6-P0.7输出低电平,如果有按键按下,按下的那一列的IO就会变成低电平,就可以判断出哪一列按下了。
  98.                     COL1=1;
  99.                 COL2=1;
  100.                 COL3=1;
  101.                 COL4=1;
  102.                 ROW1=0;
  103.                 ROW2=0;
  104.                         if(COL1==0)    //判断哪一列,叠加按键的序号
  105.                         {
  106.                         }
  107.                         else if(COL2==0)
  108.                         {
  109.                                 key_num=key_num+1;
  110.                         }
  111.                         else if(COL3==0)
  112.                         {
  113.                                 key_num=key_num+2;
  114.                         }
  115.                         else if(COL4==0)
  116.                         {
  117.                                 key_num=key_num+3;
  118.                         }
  119.                 }
  120.                 COL1=0;
  121.             COL2=0;
  122.             COL3=0;
  123.             COL4=0;
  124.             ROW1=1;
  125.             ROW2=1;
  126.         }
  127.         else
  128.         {
  129.                 key_num=0xff;
  130.         }
  131.         
  132.     //第三步:行列组合一下就可以判断出是哪个按键按下了。
  133. }        
  134. void Init_595(void)
  135. {
  136.    HC595_SER =0;
  137.    HC595_RCK =0;
  138.    HC595_SCK =0;
  139. }
  140. void Send_595(u8 dat)
  141. {
  142.         u8 i;
  143.         for(i=0;i<8;i++)
  144.         {
  145.                 dat <<=1;  //DAT=(DAT<<1);  //CY
  146.                 HC595_SER=CY;    //先把数据写到引脚上
  147.                 HC595_SCK=1;                //输出上升沿的时钟信号
  148.                 HC595_SCK=0;
  149.         }
  150. }
  151. void Display_Seg(u8 HC595_1,u8 HC595_2)
  152. {
  153.         Send_595(HC595_1);      //数码管段码输出   高电平点亮
  154.         Send_595(HC595_2);      //数码管位码       低电平点亮
  155.         
  156.         HC595_RCK=1;           //数据输出
  157.         HC595_RCK=0;
  158. }
  159. //void SEG_Task(void)
  160. //{
  161. //        if(key_num==255)
  162. //                Display_Seg( SEG_NUM[17], ~T_NUM[0]);
  163. //        else
  164. //                Display_Seg( SEG_NUM[key_num], ~T_NUM[0]);
  165. //}
  166. u8 passward[8]={16,16,16,16,16,16,16,16};
  167. u8 Seg_no=0;
  168. void SEG_Task(void)
  169. {
  170.         u8 num=0;        
  171.         if(Seg_no==0)                                             
  172.         {
  173.                 Display_Seg( SEG_NUM[passward[0]], ~T_NUM[0]);        
  174.         }
  175.         else if(Seg_no==1)                                      
  176.         {
  177.                 Display_Seg( SEG_NUM[passward[1]], ~T_NUM[1]);        
  178.         }
  179.         else if(Seg_no==2)                                       
  180.         {
  181.                 Display_Seg( SEG_NUM[passward[2]], ~T_NUM[2]);        
  182.         }
  183.         else if(Seg_no==3)                                       
  184.         {
  185.                 Display_Seg( SEG_NUM[passward[3]], ~T_NUM[3]);        
  186.         }
  187.         else if(Seg_no==4)                                       
  188.         {
  189.                 Display_Seg( SEG_NUM[passward[4]], ~T_NUM[4]);        
  190.         }
  191.         else if(Seg_no==5)                                       
  192.         {
  193.                 Display_Seg( SEG_NUM[passward[5]], ~T_NUM[5]);         
  194.         }
  195.         else if(Seg_no==6)                                       
  196.         {
  197.                 Display_Seg( SEG_NUM[passward[6]], ~T_NUM[6]);        
  198.         }
  199.         else if(Seg_no==7)                                       
  200.         {
  201.                 Display_Seg( SEG_NUM[passward[7]], ~T_NUM[7]);        
  202.         }
  203.         else
  204.         {
  205.                
  206.         }
  207.         Seg_no ++;
  208.         if( Seg_no >7)
  209.                 Seg_no=0;
  210. }
  211. u8 Key_Vol3=0;
  212. u8 key_no=0;
  213. void PW_write_Task(void)
  214. {
  215.         if(key_num<0xff)
  216.         {
  217.                 Key_Vol3++;
  218.                 if(Key_Vol3== 5)
  219.                 {
  220.                         if(key_no==0)
  221.                         {
  222.                                 passward[0]=16;
  223.                                 passward[1]=16;
  224.                                 passward[2]=16;
  225.                                 passward[3]=16;
  226.                                 passward[4]=16;
  227.                                 passward[5]=16;
  228.                                 passward[6]=16;
  229.                                 passward[7]=16;
  230.                                 
  231.                         }
  232.                         passward[key_no]=key_num;
  233.                         key_no ++;
  234. //                        passward[7]=17;
  235.                         if(key_no==8)     //密码输入到8位
  236.                         {
  237.                                 if((passward[0]==1)&&(passward[1]==2)&&(passward[2]==3)&&(passward[3]==4)&&(passward[4]==5)&&(passward[5]==6)&&(passward[6]==7)&&(passward[7]==0))
  238.                                 {
  239.                                         passward[0]=17;
  240.                                         passward[1]=17;
  241.                                         passward[2]=17;
  242.                                         passward[3]=17;
  243.                                         passward[4]=17;
  244.                                         passward[5]=17;
  245.                                         passward[6]=17;
  246.                                         passward[7]=1;
  247.                                 }
  248.                                 else
  249.                                 {
  250.                                         passward[0]=16;
  251.                                     passward[1]=16;
  252.                                     passward[2]=16;
  253.                                     passward[3]=16;
  254.                                     passward[4]=16;
  255.                                     passward[5]=16;
  256.                                     passward[6]=16;
  257.                                     passward[7]=16;
  258.                                        
  259.                                 }
  260.                                 key_no=0;
  261.                         }
  262.                 }
  263.         }
  264.         else
  265.         {
  266.                 Key_Vol3=0;
  267.         }
  268. }
  269. //void INT1_Init(void)
  270. //{
  271. //        IT1=1;            //下降沿中断
  272. //        EX1=1;            //打开中断允许
  273. //        EA=1;            //打开总中断
  274. //}
  275. //void INT_ISR(void)   interrupt  2
  276. //{
  277. //        P01=!P01;
  278. //}
  279. void P3_IO_Init(void)
  280. {
  281.         P3IM0=0X00;          //IO中断模式设置为了下降沿
  282.         P3IM1=0X00;
  283.         
  284.         P3INTE=0X08;          //打开中断
  285. }
  286. void P3_IO_ISR(void)     interrupt  40
  287. {
  288.         u8 intf;
  289.         intf=P3INTF;
  290.         if(intf)             //判断也没有IO出发了中断
  291.         {
  292.                 P3INTF=0;
  293.                 if( intf & 0X08 )     //判断是否是P33按钮按下
  294.                 {
  295.                         P01=!P01;
  296.                 }
  297.         }
  298. }
复制代码
任务2:编写P4端口的IO中断  打断P3低电平中断的的程序
1.设置P33优先级比P47高  按下P33显示1,按下P47显示2,P33高优先级可以打断P47低优先级中断
140201.jpg

  1. #include "io.h"
  2. u8 State1=0;                      //LED1初始状态
  3. u8 State2=0;                      //LED2初始状态
  4. u8 State3=0;                      //LED3初始状态
  5. u16  Key_Vol=0;                   //按键按下持续时间
  6. u8 SEG_NUM[]=
  7. {
  8.         0x3F,       /*'0', 0*/
  9.     0x06,       /*'1', 1*/
  10.     0x5B,       /*'2', 2*/
  11.     0x4F,       /*'3', 3*/
  12.     0x66,       /*'4', 4*/
  13.     0x6D,       /*'5', 5*/
  14.     0x7D,       /*'6', 6*/
  15.     0x07,       /*'7', 7*/
  16.     0x7F,       /*'8', 8*/
  17.     0x6F,       /*'9', 9*/
  18.     0x77,       /*'A', 10*/
  19.     0x7C,       /*'B', 11*/
  20.     0x39,       /*'C', 12*/
  21.     0x5E,       /*'D', 13*/
  22.     0x79,       /*'E', 14*/
  23.     0x71,       /*'F', 15*/
  24.     0x40,       /*'-', 16*/
  25.     0x00,       /*' ', 17*/
  26.     0x80,       /*'.', 18*/
  27. };
  28. u8 T_NUM[8]=
  29. {
  30.         0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80
  31. };
  32. void LED0_Blink(void)
  33. {
  34.         State1=!State1;
  35.         P00=State1;
  36. }
  37. void LED1_Blink(void)
  38. {
  39.         State2=!State2;
  40.         P01=State2;
  41. }
  42. void LED2_Blink(void)
  43. {
  44.         State3=!State3;
  45.         P02=State3;
  46. }
  47. void KEY_Task(void)
  48. {
  49.         if(P33==0)
  50.         {
  51.                 Key_Vol++;
  52.                 if(Key_Vol==5)
  53.                 {
  54.                         //按键按下的任务
  55. //                        printf("按键单击\r\n");
  56.                         
  57.                         USB_Reset_U( );
  58.                         IAP_CONTR=0X20;
  59.                 }
  60.         }
  61.         else
  62.         {
  63.                 Key_Vol=0;
  64.         }
  65. }
  66. /*
  67.    #define ROW1   P06                //端口定义
  68.    #define ROW2   P07
  69.    #define COL1   P00
  70.    #define COL2   P01
  71.    #define COL3   P02
  72.    #define COL4   P03
  73. */
  74. u8 key_num=0xff;
  75. //任务1:数码管显示当前的按键号
  76. void Task_1(void)
  77. {
  78.         //第一步:现将P0.0-P0.3输出低电平,P0.6-P0.7输出高电平,如果有按键按下,按下的那一行的IO就会变成低电平,就可以判断出哪一行按下了。
  79.     COL1=0;
  80.         COL2=0;
  81.         COL3=0;
  82.         COL4=0;
  83.         ROW1=1;
  84.         ROW2=1;
  85.         if((ROW1==0)||(ROW2==0))       //如果行按键有按下
  86.         {
  87.                 if((ROW1==0)&&(ROW2==0))   //如果两行都有按键按下,不处理
  88.                 {
  89.                         
  90.                 }
  91.                 else if(((ROW1==1)&&(ROW2==0)) ||((ROW1==0)&&(ROW2==1)))     //如果有按键按下,而且只有1颗
  92.                 {
  93.                         if(ROW1==0)       //判断哪一行,输出行开始的序号
  94.                                 key_num=0;
  95.                         else if(ROW2==0)
  96.                                 key_num=4;
  97.                         //第二步:现将P0.0-P0.3输出高电平,P0.6-P0.7输出低电平,如果有按键按下,按下的那一列的IO就会变成低电平,就可以判断出哪一列按下了。
  98.                     COL1=1;
  99.                 COL2=1;
  100.                 COL3=1;
  101.                 COL4=1;
  102.                 ROW1=0;
  103.                 ROW2=0;
  104.                         if(COL1==0)    //判断哪一列,叠加按键的序号
  105.                         {
  106.                         }
  107.                         else if(COL2==0)
  108.                         {
  109.                                 key_num=key_num+1;
  110.                         }
  111.                         else if(COL3==0)
  112.                         {
  113.                                 key_num=key_num+2;
  114.                         }
  115.                         else if(COL4==0)
  116.                         {
  117.                                 key_num=key_num+3;
  118.                         }
  119.                 }
  120.                 COL1=0;
  121.             COL2=0;
  122.             COL3=0;
  123.             COL4=0;
  124.             ROW1=1;
  125.             ROW2=1;
  126.         }
  127.         else
  128.         {
  129.                 key_num=0xff;
  130.         }
  131.         
  132.     //第三步:行列组合一下就可以判断出是哪个按键按下了。
  133. }        
  134. void Init_595(void)
  135. {
  136.    HC595_SER =0;
  137.    HC595_RCK =0;
  138.    HC595_SCK =0;
  139. }
  140. void Send_595(u8 dat)
  141. {
  142.         u8 i;
  143.         for(i=0;i<8;i++)
  144.         {
  145.                 dat <<=1;  //DAT=(DAT<<1);  //CY
  146.                 HC595_SER=CY;    //先把数据写到引脚上
  147.                 HC595_SCK=1;                //输出上升沿的时钟信号
  148.                 HC595_SCK=0;
  149.         }
  150. }
  151. void Display_Seg(u8 HC595_1,u8 HC595_2)
  152. {
  153.         Send_595(HC595_1);      //数码管段码输出   高电平点亮
  154.         Send_595(HC595_2);      //数码管位码       低电平点亮
  155.         
  156.         HC595_RCK=1;           //数据输出
  157.         HC595_RCK=0;
  158. }
  159. //void SEG_Task(void)
  160. //{
  161. //        if(key_num==255)
  162. //                Display_Seg( SEG_NUM[17], ~T_NUM[0]);
  163. //        else
  164. //                Display_Seg( SEG_NUM[key_num], ~T_NUM[0]);
  165. //}
  166. u8 passward[8]={17,17,17,17,17,17,17,17};
  167. u8 Seg_no=0;
  168. void SEG_Task(void)
  169. {
  170.         u8 num=0;        
  171.         if(Seg_no==0)                                             
  172.         {
  173.                 Display_Seg( SEG_NUM[passward[0]], ~T_NUM[0]);        
  174.         }
  175.         else if(Seg_no==1)                                      
  176.         {
  177.                 Display_Seg( SEG_NUM[passward[1]], ~T_NUM[1]);        
  178.         }
  179.         else if(Seg_no==2)                                       
  180.         {
  181.                 Display_Seg( SEG_NUM[passward[2]], ~T_NUM[2]);        
  182.         }
  183.         else if(Seg_no==3)                                       
  184.         {
  185.                 Display_Seg( SEG_NUM[passward[3]], ~T_NUM[3]);        
  186.         }
  187.         else if(Seg_no==4)                                       
  188.         {
  189.                 Display_Seg( SEG_NUM[passward[4]], ~T_NUM[4]);        
  190.         }
  191.         else if(Seg_no==5)                                       
  192.         {
  193.                 Display_Seg( SEG_NUM[passward[5]], ~T_NUM[5]);         
  194.         }
  195.         else if(Seg_no==6)                                       
  196.         {
  197.                 Display_Seg( SEG_NUM[passward[6]], ~T_NUM[6]);        
  198.         }
  199.         else if(Seg_no==7)                                       
  200.         {
  201.                 Display_Seg( SEG_NUM[passward[7]], ~T_NUM[7]);        
  202.         }
  203.         else
  204.         {
  205.                
  206.         }
  207.         Seg_no ++;
  208.         if( Seg_no >7)
  209.                 Seg_no=0;
  210. }
  211. u8 Key_Vol3=0;
  212. u8 key_no=0;
  213. void PW_write_Task(void)
  214. {
  215.         if(key_num<0xff)
  216.         {
  217.                 Key_Vol3++;
  218.                 if(Key_Vol3== 5)
  219.                 {
  220.                         if(key_no==0)
  221.                         {
  222.                                 passward[0]=16;
  223.                                 passward[1]=16;
  224.                                 passward[2]=16;
  225.                                 passward[3]=16;
  226.                                 passward[4]=16;
  227.                                 passward[5]=16;
  228.                                 passward[6]=16;
  229.                                 passward[7]=16;
  230.                                 
  231.                         }
  232.                         passward[key_no]=key_num;
  233.                         key_no ++;
  234. //                        passward[7]=17;
  235.                         if(key_no==8)     //密码输入到8位
  236.                         {
  237.                                 if((passward[0]==1)&&(passward[1]==2)&&(passward[2]==3)&&(passward[3]==4)&&(passward[4]==5)&&(passward[5]==6)&&(passward[6]==7)&&(passward[7]==0))
  238.                                 {
  239.                                         passward[0]=17;
  240.                                         passward[1]=17;
  241.                                         passward[2]=17;
  242.                                         passward[3]=17;
  243.                                         passward[4]=17;
  244.                                         passward[5]=17;
  245.                                         passward[6]=17;
  246.                                         passward[7]=1;
  247.                                 }
  248.                                 else
  249.                                 {
  250.                                         passward[0]=16;
  251.                                     passward[1]=16;
  252.                                     passward[2]=16;
  253.                                     passward[3]=16;
  254.                                     passward[4]=16;
  255.                                     passward[5]=16;
  256.                                     passward[6]=16;
  257.                                     passward[7]=16;
  258.                                        
  259.                                 }
  260.                                 key_no=0;
  261.                         }
  262.                 }
  263.         }
  264.         else
  265.         {
  266.                 Key_Vol3=0;
  267.         }
  268. }
  269. //void INT1_Init(void)
  270. //{
  271. //        IT1=1;            //下降沿中断
  272. //        EX1=1;            //打开中断允许
  273. //        EA=1;            //打开总中断
  274. //}
  275. //void INT_ISR(void)   interrupt  2
  276. //{
  277. //        P01=!P01;
  278. //}
  279. //数码管显示0:执行while函数    1:执行P3_IO中断   2:执行P4_IO中断
  280. void P3_IO_Init(void)
  281. {
  282.         P3IM0=0X00;          //IO中断模式设置为了下降沿
  283.         P3IM1=0Xff;
  284.         
  285.         P3INTE=0X08;          //打开中断
  286. }
  287. void P3_IO_ISR(void)     interrupt  40
  288. {
  289.         u8 intf;
  290.         intf=P3INTF;
  291.         if(intf)             //判断也没有IO出发了中断
  292.         {
  293.                 P3INTF=0;
  294.                 if( intf & 0X08 )     //判断是否是P33按钮按下
  295.                 {
  296.                         passward[0]=1;
  297. //                        P01=!P01;
  298.                 }
  299.         }
  300. }
  301. void P4_IO_Init(void)
  302. {
  303.         P4IM0=0X00;          //IO中断模式设置为了下降沿
  304.         P4IM1=0Xff;
  305.         
  306.         P4INTE=0X80;          //打开中断
  307. }
  308. void P4_IO_ISR(void)     interrupt  41
  309. {
  310.         u8 intf;
  311.         intf=P4INTF;
  312.         if(intf)             //判断也没有IO出发了中断
  313.         {
  314.                 P4INTF=0;
  315.                 if( intf & 0X80 )     //判断是否是P33按钮按下
  316.                 {
  317.                         passward[0]=2;
  318.                 }
  319.         }
  320. }
复制代码

2.设置P47优先级比P33高  按下P33显示1,按下P47显示2,P47高优先级可以打断P33低优先级中断
140202.png


  1. #include "io.h"
  2. u8 State1=0;                      //LED1初始状态
  3. u8 State2=0;                      //LED2初始状态
  4. u8 State3=0;                      //LED3初始状态
  5. u16  Key_Vol=0;                   //按键按下持续时间
  6. u8 SEG_NUM[]=
  7. {
  8.         0x3F,       /*'0', 0*/
  9.     0x06,       /*'1', 1*/
  10.     0x5B,       /*'2', 2*/
  11.     0x4F,       /*'3', 3*/
  12.     0x66,       /*'4', 4*/
  13.     0x6D,       /*'5', 5*/
  14.     0x7D,       /*'6', 6*/
  15.     0x07,       /*'7', 7*/
  16.     0x7F,       /*'8', 8*/
  17.     0x6F,       /*'9', 9*/
  18.     0x77,       /*'A', 10*/
  19.     0x7C,       /*'B', 11*/
  20.     0x39,       /*'C', 12*/
  21.     0x5E,       /*'D', 13*/
  22.     0x79,       /*'E', 14*/
  23.     0x71,       /*'F', 15*/
  24.     0x40,       /*'-', 16*/
  25.     0x00,       /*' ', 17*/
  26.     0x80,       /*'.', 18*/
  27. };
  28. u8 T_NUM[8]=
  29. {
  30.         0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80
  31. };
  32. void LED0_Blink(void)
  33. {
  34.         State1=!State1;
  35.         P00=State1;
  36. }
  37. void LED1_Blink(void)
  38. {
  39.         State2=!State2;
  40.         P01=State2;
  41. }
  42. void LED2_Blink(void)
  43. {
  44.         State3=!State3;
  45.         P02=State3;
  46. }
  47. void KEY_Task(void)
  48. {
  49.         if(P33==0)
  50.         {
  51.                 Key_Vol++;
  52.                 if(Key_Vol==5)
  53.                 {
  54.                         //按键按下的任务
  55. //                        printf("按键单击\r\n");
  56.                         
  57.                         USB_Reset_U( );
  58.                         IAP_CONTR=0X20;
  59.                 }
  60.         }
  61.         else
  62.         {
  63.                 Key_Vol=0;
  64.         }
  65. }
  66. /*
  67.    #define ROW1   P06                //端口定义
  68.    #define ROW2   P07
  69.    #define COL1   P00
  70.    #define COL2   P01
  71.    #define COL3   P02
  72.    #define COL4   P03
  73. */
  74. u8 key_num=0xff;
  75. //任务1:数码管显示当前的按键号
  76. void Task_1(void)
  77. {
  78.         //第一步:现将P0.0-P0.3输出低电平,P0.6-P0.7输出高电平,如果有按键按下,按下的那一行的IO就会变成低电平,就可以判断出哪一行按下了。
  79.     COL1=0;
  80.         COL2=0;
  81.         COL3=0;
  82.         COL4=0;
  83.         ROW1=1;
  84.         ROW2=1;
  85.         if((ROW1==0)||(ROW2==0))       //如果行按键有按下
  86.         {
  87.                 if((ROW1==0)&&(ROW2==0))   //如果两行都有按键按下,不处理
  88.                 {
  89.                         
  90.                 }
  91.                 else if(((ROW1==1)&&(ROW2==0)) ||((ROW1==0)&&(ROW2==1)))     //如果有按键按下,而且只有1颗
  92.                 {
  93.                         if(ROW1==0)       //判断哪一行,输出行开始的序号
  94.                                 key_num=0;
  95.                         else if(ROW2==0)
  96.                                 key_num=4;
  97.                         //第二步:现将P0.0-P0.3输出高电平,P0.6-P0.7输出低电平,如果有按键按下,按下的那一列的IO就会变成低电平,就可以判断出哪一列按下了。
  98.                     COL1=1;
  99.                 COL2=1;
  100.                 COL3=1;
  101.                 COL4=1;
  102.                 ROW1=0;
  103.                 ROW2=0;
  104.                         if(COL1==0)    //判断哪一列,叠加按键的序号
  105.                         {
  106.                         }
  107.                         else if(COL2==0)
  108.                         {
  109.                                 key_num=key_num+1;
  110.                         }
  111.                         else if(COL3==0)
  112.                         {
  113.                                 key_num=key_num+2;
  114.                         }
  115.                         else if(COL4==0)
  116.                         {
  117.                                 key_num=key_num+3;
  118.                         }
  119.                 }
  120.                 COL1=0;
  121.             COL2=0;
  122.             COL3=0;
  123.             COL4=0;
  124.             ROW1=1;
  125.             ROW2=1;
  126.         }
  127.         else
  128.         {
  129.                 key_num=0xff;
  130.         }
  131.         
  132.     //第三步:行列组合一下就可以判断出是哪个按键按下了。
  133. }        
  134. void Init_595(void)
  135. {
  136.    HC595_SER =0;
  137.    HC595_RCK =0;
  138.    HC595_SCK =0;
  139. }
  140. void Send_595(u8 dat)
  141. {
  142.         u8 i;
  143.         for(i=0;i<8;i++)
  144.         {
  145.                 dat <<=1;  //DAT=(DAT<<1);  //CY
  146.                 HC595_SER=CY;    //先把数据写到引脚上
  147.                 HC595_SCK=1;                //输出上升沿的时钟信号
  148.                 HC595_SCK=0;
  149.         }
  150. }
  151. void Display_Seg(u8 HC595_1,u8 HC595_2)
  152. {
  153.         Send_595(HC595_1);      //数码管段码输出   高电平点亮
  154.         Send_595(HC595_2);      //数码管位码       低电平点亮
  155.         
  156.         HC595_RCK=1;           //数据输出
  157.         HC595_RCK=0;
  158. }
  159. //void SEG_Task(void)
  160. //{
  161. //        if(key_num==255)
  162. //                Display_Seg( SEG_NUM[17], ~T_NUM[0]);
  163. //        else
  164. //                Display_Seg( SEG_NUM[key_num], ~T_NUM[0]);
  165. //}
  166. u8 passward[8]={17,17,17,17,17,17,17,17};
  167. u8 Seg_no=0;
  168. void SEG_Task(void)
  169. {
  170.         u8 num=0;        
  171.         if(Seg_no==0)                                             
  172.         {
  173.                 Display_Seg( SEG_NUM[passward[0]], ~T_NUM[0]);        
  174.         }
  175.         else if(Seg_no==1)                                      
  176.         {
  177.                 Display_Seg( SEG_NUM[passward[1]], ~T_NUM[1]);        
  178.         }
  179.         else if(Seg_no==2)                                       
  180.         {
  181.                 Display_Seg( SEG_NUM[passward[2]], ~T_NUM[2]);        
  182.         }
  183.         else if(Seg_no==3)                                       
  184.         {
  185.                 Display_Seg( SEG_NUM[passward[3]], ~T_NUM[3]);        
  186.         }
  187.         else if(Seg_no==4)                                       
  188.         {
  189.                 Display_Seg( SEG_NUM[passward[4]], ~T_NUM[4]);        
  190.         }
  191.         else if(Seg_no==5)                                       
  192.         {
  193.                 Display_Seg( SEG_NUM[passward[5]], ~T_NUM[5]);         
  194.         }
  195.         else if(Seg_no==6)                                       
  196.         {
  197.                 Display_Seg( SEG_NUM[passward[6]], ~T_NUM[6]);        
  198.         }
  199.         else if(Seg_no==7)                                       
  200.         {
  201.                 Display_Seg( SEG_NUM[passward[7]], ~T_NUM[7]);        
  202.         }
  203.         else
  204.         {
  205.                
  206.         }
  207.         Seg_no ++;
  208.         if( Seg_no >7)
  209.                 Seg_no=0;
  210. }
  211. u8 Key_Vol3=0;
  212. u8 key_no=0;
  213. void PW_write_Task(void)
  214. {
  215.         if(key_num<0xff)
  216.         {
  217.                 Key_Vol3++;
  218.                 if(Key_Vol3== 5)
  219.                 {
  220.                         if(key_no==0)
  221.                         {
  222.                                 passward[0]=16;
  223.                                 passward[1]=16;
  224.                                 passward[2]=16;
  225.                                 passward[3]=16;
  226.                                 passward[4]=16;
  227.                                 passward[5]=16;
  228.                                 passward[6]=16;
  229.                                 passward[7]=16;
  230.                                 
  231.                         }
  232.                         passward[key_no]=key_num;
  233.                         key_no ++;
  234. //                        passward[7]=17;
  235.                         if(key_no==8)     //密码输入到8位
  236.                         {
  237.                                 if((passward[0]==1)&&(passward[1]==2)&&(passward[2]==3)&&(passward[3]==4)&&(passward[4]==5)&&(passward[5]==6)&&(passward[6]==7)&&(passward[7]==0))
  238.                                 {
  239.                                         passward[0]=17;
  240.                                         passward[1]=17;
  241.                                         passward[2]=17;
  242.                                         passward[3]=17;
  243.                                         passward[4]=17;
  244.                                         passward[5]=17;
  245.                                         passward[6]=17;
  246.                                         passward[7]=1;
  247.                                 }
  248.                                 else
  249.                                 {
  250.                                         passward[0]=16;
  251.                                     passward[1]=16;
  252.                                     passward[2]=16;
  253.                                     passward[3]=16;
  254.                                     passward[4]=16;
  255.                                     passward[5]=16;
  256.                                     passward[6]=16;
  257.                                     passward[7]=16;
  258.                                        
  259.                                 }
  260.                                 key_no=0;
  261.                         }
  262.                 }
  263.         }
  264.         else
  265.         {
  266.                 Key_Vol3=0;
  267.         }
  268. }
  269. //void INT1_Init(void)
  270. //{
  271. //        IT1=1;            //下降沿中断
  272. //        EX1=1;            //打开中断允许
  273. //        EA=1;            //打开总中断
  274. //}
  275. //void INT_ISR(void)   interrupt  2
  276. //{
  277. //        P01=!P01;
  278. //}
  279. //数码管显示0:执行while函数    1:执行P3_IO中断   2:执行P4_IO中断
  280. void P3_IO_Init(void)
  281. {
  282.         P3IM0=0X00;          //IO中断模式设置为了下降沿
  283.         P3IM1=0Xff;
  284.         
  285.         P3INTE=0X08;          //打开中断
  286. }
  287. void P3_IO_ISR(void)     interrupt  40
  288. {
  289.         u8 intf;
  290.         intf=P3INTF;
  291.         if(intf)             //判断也没有IO出发了中断
  292.         {
  293.                 P3INTF=0;
  294.                 if( intf & 0X08 )     //判断是否是P33按钮按下
  295.                 {
  296.                         passward[0]=1;
  297. //                        P01=!P01;
  298.                 }
  299.         }
  300. }
  301. void P4_IO_Init(void)
  302. {
  303.         P4IM0=0X00;          //IO中断模式设置为了下降沿
  304.         P4IM1=0Xff;
  305.         
  306.         P4INTE=0X80;          //打开中断
  307.         PINIPH |=(1<<4);       //写入最高优先级
  308.         PINIPL |=(1<<4);
  309.         
  310. }
  311. void P4_IO_ISR(void)     interrupt  41
  312. {
  313.         u8 intf;
  314.         intf=P4INTF;
  315.         if(intf)             //判断也没有IO出发了中断
  316.         {
  317.                 P4INTF=0;
  318.                 if( intf & 0X80 )     //判断是否是P33按钮按下
  319.                 {
  320.                         passward[0]=2;
  321.                 }
  322.         }
  323. }
复制代码






AI8051U视频打卡第14集IO中断.zip

167.79 KB, 下载次数: 15

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-06-16 09:55:47

9

主题

30

回帖

691

积分

版主

积分
691
发表于 2025-1-24 14:20:05 | 显示全部楼层
打卡第15集,已手敲代码,测试通过
任务1: 编写定时器1计数的程序  为了方便计数,10个脉冲中断一次
15.1.jpg


  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.         TR1=1;                        //启动定时器1
  15.         ET1=1;                       //打开定时器1外部中断
  16. }
  17. void Timer1_Isr(void) interrupt 3        //1ms执行一次
  18. {
  19.         Count_T1 ++;                     //T1引脚检测到第10个脉冲就会溢出一次
  20. }
  21. void T1_RunTask(void)
  22. {
  23.         u32 count_th_t1=0;
  24.         count_th_t1=((u16)TH1<<8)+(u16)TL1;
  25.         count_th_t1-=65526;
  26.         SEG7_ShowLong(Count_T1*Count_num+count_th_t1,10);
  27. }
复制代码
任务2:编写INT1测量低电平时间(由按键模拟信号,100us的计数周期计数)
截图202501241417026728.jpg
  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. //        TR1=1;                        //启动定时器1
  15. //        ET1=1;                       //打开定时器1外部中断
  16. //}
  17. //void Timer1_Isr(void) interrupt 3        //1ms执行一次
  18. //{
  19. //        Count_T1 ++;                     //T1引脚检测到第10个脉冲就会溢出一次
  20. //}
  21. //void T1_RunTask(void)
  22. //{
  23. //        u32 count_th_t1=0;
  24. //        count_th_t1=((u16)TH1<<8)+(u16)TL1;
  25. //        count_th_t1-=65526;
  26. //        SEG7_ShowLong(Count_T1*Count_num+count_th_t1,10);
  27. //}
  28. void Timer1_Isr(void) interrupt 3
  29. {
  30.         static u32  count_p33=0;
  31.         if(P33==0)      //按键按下开始计数
  32.         {
  33.                 count_p33 ++;
  34.         }
  35.         else
  36.         {
  37.                 if(count_p33>0)     //表示之前按下了这个按键
  38.                 {
  39.                         Count_T1=count_p33;
  40.                 }
  41.                 count_p33=0;
  42.         }               
  43. }
  44. void Timer1_Init(void)                //100微秒@24.000MHz
  45. {
  46.         AUXR &= 0xBF;                        //定时器时钟12T模式
  47.         TMOD &= 0x0F;                        //设置定时器模式
  48.         TL1 = 0x38;                                //设置定时初始值
  49.         TH1 = 0xFF;                                //设置定时初始值
  50.         TF1 = 0;                                //清除TF1标志
  51.         TR1 = 1;                                //定时器1开始计时
  52.         ET1 = 1;                                //使能定时器1中断
  53. }
  54. void T1_RunTask(void)
  55. {
  56. //        SEG7_ShowLong(Count_T1,10);   //显示整数
  57.         SEG7_ShowString("%07.01f",((float)Count_T1)/10);
  58. }
复制代码


AI8051视频打卡第十五集定时器做count.zip

188.89 KB, 下载次数: 20

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-06-16 09:55:47

9

主题

30

回帖

691

积分

版主

积分
691
发表于 2025-2-6 11:13:05 | 显示全部楼层
跟着冲哥打卡第十六集,已手敲代码,测试通过
1601.png
  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.                 Rec_Dat[Rec_Num++]=S2BUF;
  17.         }
  18. }
  19. void Uart2_Init(void)        //9600bps@24.000MHz
  20. {
  21.         P_SW2 |= 0x01;                                                //UART2/USART2: RxD2(P4.6), TxD2(P4.7)
  22.         S2CON = 0x50;                //8位数据,可变波特率
  23.         AUXR |= 0x04;                //定时器时钟1T模式
  24.         T2L = 0x8F;                        //设置定时初始值
  25.         T2H = 0xFD;                        //设置定时初始值
  26.         AUXR |= 0x10;                //定时器2开始计时
  27.         IE2 |= 0x01;                //使能串口2中断
  28.        
  29.         Rec_Num=0;
  30.         B_TX2_Busy=0;
  31. }
  32. void Uart2_SendStr(u8 *puts)   //串口数据发送函数
  33. {
  34.         for(; *puts !=0;  puts++)     //遇到停止符0结束
  35.         {
  36.                 S2BUF = *puts;
  37.                 B_TX2_Busy=1;
  38.                 while(B_TX2_Busy);
  39.         }
  40. }
  41. //1.发送OPEN\r\n打开数码管,数码管显示“----”
  42. //2.发送CLOSE\r\n打开数码管,数码管全部熄灭
  43. void Usart2_RunTask(void)
  44. {
  45.          if(Rec_Num>=6)     //是否接收到了6位以上的数据
  46.          {
  47.                  if ((Rec_Dat[Rec_Num-1]=='\n') && (Rec_Dat[Rec_Num-2]=='\r'))  //末尾判断
  48.                  {
  49.                           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'))
  50.                           {
  51.                                   passward[0]=16;
  52.                   passward[1]=16;
  53.                   passward[2]=16;
  54.                   passward[3]=16;
  55.                                   Uart2_SendStr("打开成功!\r\n");
  56.                           }
  57.                           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'))
  58.               {
  59.                   passward[0]=17;
  60.                   passward[1]=17;
  61.                   passward[2]=17;
  62.                   passward[3]=17;
  63.                                   Uart2_SendStr("关闭成功!\r\n");
  64.                       }
  65.                            Rec_Num=0;
  66.              }
  67.      }
  68. }
复制代码



AI8051U视频打卡第十六集串口简单应用.zip

211.35 KB, 下载次数: 14

回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-6-30 13:27 , Processed in 1.050622 second(s), 66 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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