找回密码
 立即注册
楼主: AI芯启强

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

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:30
  • 最近打卡:2025-06-17 16:59:11

12

主题

52

回帖

573

积分

版主

积分
573
发表于 2024-12-27 16:03:10 | 显示全部楼层
第十集  虚拟LED和数码管

任务一:P2口流水灯,P10闪烁






任务二:左边数码管显示P32按下次数, 右边数码管显示P33按下次数







任务3:按下数字按键在数码管显示对应的数字按键




AI8051U第十集虚拟LED和shu码管 手敲代码.zip

7.94 MB, 下载次数: 28

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:30
  • 最近打卡:2025-06-17 16:59:11

12

主题

52

回帖

573

积分

版主

积分
573
发表于 2025-1-4 00:41:25 | 显示全部楼层
第十一集  矩阵按键

任务一:数码管显示当前按键

截图202501040112489060.jpg

  1. #include "io.h"
  2. u8 State1=0;
  3. u8 State2=0;
  4. u8 State3=0;
  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( P32==0 )
  50.         {
  51.                 Key_Vol++;
  52.                 if(Key_Vol == 5)
  53.                 {
  54.                         //按键按下的任务
  55.                         printf("按键单击\r\n");
  56.                 }
  57.         }
  58.         else
  59.         {
  60.                 Key_Vol = 0;
  61.         }
  62. }
  63. u8 key_num = 0xff;
  64. //任务1:数码管显示当前的按键号
  65. void Task_1(void)
  66. {
  67.         COL1 = 0;
  68.         COL2 = 0;
  69.         COL3 = 0;
  70.         COL4 = 0;
  71.         ROW1 = 1;
  72.         ROW2 = 1;
  73.         if((ROW1 == 0)||(ROW2== 0))  //或
  74.         {
  75.                 if((ROW1 == 0)&&(ROW2== 0))  //与
  76.                 {
  77.                 }
  78.                 else if(((ROW1 == 1)&&(ROW2== 0))||((ROW1 == 0)&&(ROW2== 1)))
  79.                 {
  80.                         if (ROW1 ==0)
  81.                                 key_num = 0;
  82.                 else if (ROW2 ==0)
  83.                                 key_num = 4;
  84.                        
  85.                        
  86.                                 COL1 = 1;
  87.                                 COL2 = 1;
  88.                                 COL3 = 1;
  89.                                 COL4 = 1;
  90.                                 ROW1 = 0;
  91.                                 ROW2 = 0;
  92.                         if(COL1 ==  0)
  93.                         {
  94.                 //                key_num = key_num;
  95.                         }
  96.                         else if(COL2 ==  0)
  97.                         {
  98.                                 key_num = key_num + 1;
  99.                         }
  100.                         else if(COL3 ==  0)
  101.                         {
  102.                                 key_num = key_num + 2;
  103.                         }
  104.                                                 else if(COL4 == 0)
  105.                         {
  106.                                 key_num = key_num + 3;
  107.                         }
  108.                 }
  109.         COL1 = 0;
  110.         COL2 = 0;
  111.         COL3 = 0;
  112.         COL4 = 0;
  113.         ROW1 = 1;
  114.         ROW2 = 1;      
  115.                
  116.         }
  117.         else
  118.         {
  119.                 key_num = 0xff ;
  120.         }
  121. }
  122.       
  123. void Init_595(void)
  124. {
  125.                 HC595_SER  = 0;
  126.                 HC595_RCK  = 0;
  127.                 HC595_SCK  = 0;
  128. }
  129. void Send_595( u8 dat )
  130. {
  131.     u8 i;
  132.         for(i=0;i<8;i++)
  133.         {
  134.                 dat<<=1;         //DAT=(DAT<<1);  //CY
  135.                 HC595_SER = CY;                    //先把数据写到引脚上
  136.                 HC595_SCK = 1;                        //输出上升沿的时钟信号
  137.                 HC595_SCK = 0;
  138.         }
  139. }
  140. void Display_seg(u8 HC595_1,u8 HC595_2)
  141. {
  142.         Send_595(HC595_1);
  143.         Send_595(HC595_2);
  144.       
  145.         HC595_RCK  = 1;                          //数据输出
  146.         HC595_RCK  = 0;
  147. }
  148. void SEG_Task(void)
  149. {
  150.         if(key_num==255)
  151.                 Display_seg(SEG_NUM[17],~T_NUM[0]);
  152.         else
  153.           Display_seg(SEG_NUM[key_num],~T_NUM[0]);
  154. }
复制代码


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:30
  • 最近打卡:2025-06-17 16:59:11

12

主题

52

回帖

573

积分

版主

积分
573
发表于 2025-1-4 00:54:35 | 显示全部楼层
第十一集  矩阵按键

任务二:密码锁
截图202501040045065256.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(P32==0)
  50.          {
  51.             Key_Vol++;
  52.                   if(Key_Vol==5)
  53.                         {
  54.                                 printf("按键单击\r\n");
  55.                         }
  56.          }
  57.          else
  58.          {
  59.             Key_Vol=0;
  60.          }
  61. }
  62. u8 key_num=0xff;
  63. void Task_1(void)
  64. {
  65.     COL1 = 0;
  66.                 COL2 = 0;
  67.                 COL3 = 0;
  68.                 COL4 = 0;
  69.                 ROW1 = 1;
  70.                 ROW2 = 1;
  71.       
  72.                 if((ROW1==0) || (ROW2==0))                  //如果行按键有按下
  73.                 {
  74.                         if((ROW1==0)&&(ROW2==0))                //如果两行都有按键按下,不处理
  75.                         {
  76.                        
  77.                         }
  78.                         else if(((ROW1==1)&&(ROW2==0)) || ((ROW1==0)&&(ROW2==1)))  //如果有单颗按键按下
  79.                         {
  80.                                         if(ROW1==0)                                //判断哪一行,输出行开始的序号
  81.                                                  key_num=0;
  82.                                         else if(ROW2==0)
  83.                                                  key_num=4;
  84.                                         COL1 = 1;
  85.                                         COL2 = 1;
  86.                                         COL3 = 1;
  87.                                         COL4 = 1;
  88.                                         ROW1 = 0;
  89.                                         ROW2 = 0;
  90.                               
  91.                                   if(COL1 == 0)                                //判断哪一列,叠加按键的序号
  92.                                         {
  93. //                                                key_num = key_num;
  94.                                         }
  95.                                         else if(COL2 == 0)
  96.                                         {
  97.                                                 key_num = key_num+1;
  98.                                         }
  99.                                         else if(COL3 == 0)
  100.                                         {
  101.                                                 key_num = key_num+2;                              
  102.                                         }
  103.                                         else if(COL4 == 0)
  104.                                         {
  105.                                                 key_num = key_num+3;                       
  106.                                         }
  107.                                 }
  108.                                 COL1 = 0;
  109.                                 COL2 = 0;
  110.                                 COL3 = 0;
  111.                                 COL4 = 0;
  112.                                 ROW1 = 1;
  113.                                 ROW2 = 1;                       
  114.                         }
  115.                 else
  116.                 {
  117.                         key_num=0xff;
  118.                 }
  119. }
  120. void Init_595(void)
  121. {
  122.         HC595_SER =0;
  123.         HC595_RCK        =0;
  124.         HC595_SCK        =0;
  125. }
  126. void Send_595(u8 dat)
  127. {
  128.         u8 i;
  129.       
  130.         for(i=0;i<8;i++)
  131.         {
  132.                 dat <<=1;         //DAT=(DAT<<1);   //CY
  133.                 HC595_SER= CY;
  134.                 HC595_SCK = 1;    //输出上升沿的时钟信号
  135.                 HC595_SCK = 0;
  136.         }      
  137. }
  138. void Display_Seg(u8 HC595_1,u8 HC595_2)
  139. {
  140.         Send_595(HC595_1);   //数码管段码输出  高电平点亮
  141.         Send_595(HC595_2);   //数码管位码输出  低电平点亮
  142.       
  143.         HC595_RCK        = 1;      //数据输出
  144.         HC595_RCK        = 0;
  145. }
  146. u8 passward[8]={16,16,16,16,16,16,16,16};
  147. u8 Seg_no=0;
  148. void SEG_Task(void)
  149. {
  150.         u8 num=0;
  151.         if(Seg_no==0)              //小时十位
  152.         {  
  153.       Display_Seg(SEG_NUM[passward[0]],~T_NUM[0]);   //数码管刷新段码和位码
  154.         }
  155.         else if(Seg_no==1)         //小时个位
  156.         {  
  157.       Display_Seg(SEG_NUM[passward[1]],~T_NUM[1]);   //数码管刷新段码和位码
  158.         }
  159.         else if(Seg_no==2)         //第一个横杠
  160.         {  
  161.                   Display_Seg(SEG_NUM[passward[2]],~T_NUM[2]);   //数码管刷新段码和位码
  162.         }
  163.         else if(Seg_no==3)         //分钟十位
  164.         {  
  165.       Display_Seg(SEG_NUM[passward[3]],~T_NUM[3]);   //数码管刷新段码和位码
  166.         }
  167.         else if(Seg_no==4)         //分钟个位
  168.         {  
  169.       Display_Seg(SEG_NUM[passward[4]],~T_NUM[4]);   //数码管刷新段码和位码
  170.         }
  171.         else if(Seg_no==5)         //第二个横杠
  172.         {  
  173.                   Display_Seg(SEG_NUM[passward[5]],~T_NUM[5]);   //数码管刷新段码和位码
  174.         }
  175.         else if(Seg_no==6)         //秒钟十位
  176.         {  
  177.       Display_Seg(SEG_NUM[passward[6]],~T_NUM[6]);   //数码管刷新段码和位码
  178.         }
  179.         else if(Seg_no==7)         //秒钟个位
  180.         {  
  181.       Display_Seg(SEG_NUM[passward[7]],~T_NUM[7]);   //数码管刷新段码和位码
  182.         }
  183.         else
  184.         {
  185.       
  186.         }
  187.       
  188.         Seg_no ++;
  189.         if(Seg_no>7)
  190.                  Seg_no=0;
  191. }
  192. u8 Key_Vol3=0;
  193. u8 key_no=0;
  194. void PW_write_Task(void)
  195. {
  196.            if(key_num<0xff)
  197.          {
  198.             Key_Vol3++;
  199.                   if(Key_Vol3==5)
  200.                         {
  201.                                 if(key_no==0)
  202.                                 {
  203.                                                 passward[0]=16;
  204.                                                 passward[1]=16;
  205.                                                 passward[2]=16;
  206.                                                 passward[3]=16;
  207.                                                 passward[4]=16;
  208.                                                 passward[5]=16;
  209.                                                 passward[6]=16;
  210.                                                 passward[7]=16;                              
  211.                                 }
  212.                                        
  213.                                 passward[key_no]=key_num;
  214.                                 key_no++;
  215. //                        passward[7]=17;
  216.                                 if(key_no==8)    //密码输入到了八位
  217.                                 {
  218. 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))
  219.                                         {
  220.                                                 passward[0]=17;
  221.                                                 passward[1]=17;
  222.                                                 passward[2]=17;
  223.                                                 passward[3]=17;
  224.                                                 passward[4]=17;
  225.                                                 passward[5]=17;
  226.                                                 passward[6]=17;
  227.                                                 passward[7]=1;                                               
  228.                                         }
  229.                                         else
  230.                                         {
  231.                                                 passward[0]=16;
  232.                                                 passward[1]=16;
  233.                                                 passward[2]=16;
  234.                                                 passward[3]=16;
  235.                                                 passward[4]=16;
  236.                                                 passward[5]=16;
  237.                                                 passward[6]=16;
  238.                                                 passward[7]=16;                                               
  239.                                         }
  240.                                         key_no=0;
  241.                                 }         
  242.                         }
  243.          }
  244.          else
  245.          {
  246.             Key_Vol3=0;
  247.          }
  248. }
复制代码


Ai8051U第十一集-矩阵键盘 手敲代码.rar

4.06 MB, 下载次数: 30

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:30
  • 最近打卡:2025-06-17 16:59:11

12

主题

52

回帖

573

积分

版主

积分
573
发表于 2025-1-14 11:17:22 | 显示全部楼层
第十二集   复位系统

任务一:编写看门狗程序  | 硬件复位
按下P33键进行复位
截图202501141104227820.jpg

附手敲代码:

  1. void main(void)
  2. {
  3.                 Sys_init();     
  4.                 usb_init();      
  5.                 IE2 |= 0x80;                                 
  6.                 Timer0_Init();                                
  7.                 Init_595();
  8.                 EA = 1;                                         
  9.         
  10.           P40 = 0;
  11.          
  12.          while (DeviceState != DEVSTATE_CONFIGURED);  
  13.           WDT_CONTR = 0X24;
  14.         
  15.         while(1)
  16.         {
  17.                
  18.         if (bUsbOutReady)                                                      
  19.         {
  20.             //USB_SendData(UsbOutBuffer,OutNumber);      
  21.             usb_OUT_done();                                                      
  22.         }
  23.                 Task_Pro_Handler_Callback();                           
  24.     if( P33 != 0 )
  25.                 WDT_CONTR = 0X34;
  26.         }
  27. }
  28. void Timer0_Isr(void) interrupt 1                //1MS执行一次
  29. {
  30.         Task_Marks_Handler_Callback();                                       
  31. }
复制代码



任务二:软件复位
按下P33键,进入下载模式
截图202501141127385596.jpg

附手敲代码:
  1. #include "config.h"
  2. #include "task.h"
  3. #include "io.h"
  4. char *USER_DEVICEDESC = NULL;
  5. char *USER_PRODUCTDESC = NULL;
  6. char *USER_STCISPCMD = "@STCISP#";
  7. void main(void)
  8. {
  9.                 Sys_init();            
  10.                 usb_init();
  11.                 IE2 |= 0x80;   
  12.                 Timer0_Init();     
  13.                 Init_595();
  14.                 EA = 1;   
  15.               P40 = 0;
  16.          
  17.          while (DeviceState != DEVSTATE_CONFIGURED);     //等待USB完成配置
  18.           WDT_CONTR = 0X24;
  19.         
  20.         while(1)
  21.         {
  22.                
  23.         if (bUsbOutReady)     
  24.         {
  25.             //USB_SendData(UsbOutBuffer,OutNumber);
  26.                         
  27.             usb_OUT_done();   
  28.         }
  29.                 Task_Pro_Handler_Callback();      
  30.                 WDT_CONTR = 0X34;
  31.         }
  32. }
  33. void Timer0_Isr(void) interrupt 1                //1MS执行一次
  34. {
  35.         Task_Marks_Handler_Callback();   
  36. }
复制代码


AI8051U第12集复位系统 手敲代码.zip

11.21 MB, 下载次数: 27

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:30
  • 最近打卡:2025-06-17 16:59:11

12

主题

52

回帖

573

积分

版主

积分
573
发表于 2025-1-23 16:57:30 | 显示全部楼层
第十三集  外部中断
手敲代码,测试成功



#include "config.h"
#include "task.h"
#include "io.h"

char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";

void Delay3000ms(void)        //@24.000MHz
{
        unsigned long edata i;
        _nop_();
        _nop_();
        i = 17999998UL;
        while (i) i--;
}

void main(void)
{
        Sys_init();                                                                                //系统初始化
        usb_init();                                     //USB CDC 接口配置

    IE2 |= 0x80;                                    //使能USB中断
        Timer0_Init();                                                                        //定时器初始化
        Init_595();
        INT1_Init();                                                                        //外部中断1初始化
        
    EA = 1;                                                                                        //IE |= 0X80;
        P40 = 0;
        
        while (DeviceState != DEVSTATE_CONFIGURED);     //等待USB完成配置
//        WDT_CONTR = 0X24;
        
        while(1)
        {
               
        if (bUsbOutReady)                                                        //如果接收到了数据
        {
            //USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
                        
            usb_OUT_done();                                                        //
        }      
                P00 = !P00;
                Delay3000ms();
        }
}
void Timer0_Isr(void) interrupt 1               
{
Task_Marks_Handler_Callback();                                       
}



AI8051U第13集外部中断 手敲代码.zip

3.42 MB, 下载次数: 24

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:30
  • 最近打卡:2025-06-17 16:59:11

12

主题

52

回帖

573

积分

版主

积分
573
发表于 2025-1-24 16:57:16 | 显示全部楼层
第十四集  IO 中断

任务一:编写IO口中断程序
截图202501241614445654.jpg

  1. void P3_IO_Init(void)
  2. {
  3.    P3IM0 = 0X00;
  4.          P3IM1 = 0X00;
  5.         
  6.         P3INTE = 0X08;
  7. }
  8. void P3_IO_ISR(void)    interrupt 40
  9. {
  10.   u8 intf;
  11.         intf = P3INTF;
  12.         
  13.         if( intf )
  14.         {
  15.             P3INTF = 0;
  16.                
  17.                   if( intf & 0x08 )
  18.                         {
  19.                           P01 = !P01;
  20.                         }
  21.         }
  22. }
复制代码


任务二:编写P4端口的I0中断 打断 P3低电平中断的的程序
截图202501241654571439.jpg

  1. void P4_IO_Init(void)
  2. {
  3.         P4IM0 = 0X00;        
  4.         P4IM1 = 0Xff;
  5.         
  6.         P4INTE= 0X80;               
  7.         
  8.         PINIPH  |= (1<<4);        
  9.         PINIPL  |= (1<<4);
  10. }
  11. void P4_IO_ISR(void)        interrupt 41
  12. {
  13.         u8 intf;
  14.         
  15.         intf = P4INTF;
  16.         
  17.         if( intf )                        
  18.         {
  19.                 P4INTF = 0;
  20.                
  21.                 if( intf & 0x80 )
  22.                 {
  23.                         passward[0] = 2;
  24.                 }
  25.         }
  26. }
复制代码

AI8051U第14集IO中断手敲代码.zip

4.6 MB, 下载次数: 28

回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-6-18 03:57 , Processed in 1.871360 second(s), 77 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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