找回密码
 立即注册
查看: 1143|回复: 13

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

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

9

主题

30

回帖

689

积分

版主

积分
689
发表于 2024-11-29 11:54:21 | 显示全部楼层 |阅读模式
本帖最后由 Alley 于 2024-11-30 11:55 编辑

跟着冲哥打卡第三集,成功点亮第一颗LED,已手敲代码,测试通过

截图202411291153184108.jpg
截图202411291153121994.jpg
截图202411291152598378.jpg



点亮第一颗LED.zip

39.04 KB, 下载次数: 36

回复

使用道具 举报 送花

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

9

主题

30

回帖

689

积分

版主

积分
689
发表于 2024-11-29 14:21:48 | 显示全部楼层
本帖最后由 Alley 于 2024-11-30 11:55 编辑

打卡第四集,已手敲代码,测试通过

截图202411291421108479.jpg
截图202411291421032850.jpg


不停电下载.zip

2.03 MB, 下载次数: 27

回复 支持 反对

使用道具 举报 送花

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

9

主题

30

回帖

689

积分

版主

积分
689
发表于 2024-11-29 17:03:22 | 显示全部楼层
本帖最后由 Alley 于 2024-11-30 11:50 编辑

打卡第五集,已手敲代码,测试通过

截图202411291700598945.jpg

C语言基础.zip

75.47 KB, 下载次数: 23

回复 支持 反对

使用道具 举报 送花

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

9

主题

30

回帖

689

积分

版主

积分
689
发表于 2024-12-1 14:14:55 | 显示全部楼层
本帖最后由 Alley 于 2024-12-1 14:16 编辑

跟着冲哥打卡第六集,已手敲代码,测试通过


截图202412011415599819.jpg


IO输入输出.rar

105.32 KB, 下载次数: 19

回复 支持 反对

使用道具 举报 送花

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

9

主题

30

回帖

689

积分

版主

积分
689
发表于 2024-12-5 14:00:33 | 显示全部楼层
跟着冲哥打卡第七集,已手敲代码,测试通过

07.定时器中断.jpg




07.定时器中断.mp4

3.15 MB, 下载次数: 18

07.定时器中断.zip

96.65 KB, 下载次数: 24

回复 支持 反对

使用道具 举报 送花

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

9

主题

30

回帖

689

积分

版主

积分
689
发表于 2024-12-7 19:53:08 | 显示全部楼层
跟着冲哥打卡第八集,已手敲代码,测试通过
任务一:

任务1.png
任务二:
任务2.png
任务三:
任务3.png
任务1.png

AI8051教学视频第八集定时器周期性调度.rar

139 KB, 下载次数: 28

回复 支持 反对

使用道具 举报 送花

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

9

主题

30

回帖

689

积分

版主

积分
689
发表于 2024-12-17 10:58:51 | 显示全部楼层
跟着冲哥打卡第九集,已手敲代码,测试通过
任务1:数码管静态的显示一个数字
09.1.png 09.11.jpg
任务2:数码管显示“12345678”
09.2.png 09.21.jpg
任务3:数码管显示“00-00-00”分别代表时分秒,每过一秒钟秒+1
09.3.png
任务4:虚拟显示-LED,P2流水灯效果
09.4.png




AI8051教学视频第九集shu码管.zip

163.79 KB, 下载次数: 17

回复 支持 反对

使用道具 举报 送花

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

9

主题

30

回帖

689

积分

版主

积分
689
发表于 2024-12-26 17:07:48 | 显示全部楼层
擎天柱---跟着冲哥打卡第十集,已手敲代码,测试通过
任务1:P2口流水灯,P10闪烁
10.1.jpg
任务2:左边数码管显示P32按下次数,右边数码管显示P33按下次数
10.2.jpg
任务3:按下数字按键在数码管显示对应的数字按键
10.3.jpg

AI8051教学视频第十集虚拟LED和shu码管.zip

157.88 KB, 下载次数: 14

回复 支持 反对

使用道具 举报 送花

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

9

主题

30

回帖

689

积分

版主

积分
689
发表于 2025-1-14 11:45:48 | 显示全部楼层
跟着冲哥打卡第11集,已手敲代码,测试通过
任务1:数码管显示当前的按键号

11-01.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(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. /*
  64.    #define ROW1   P06                //端口定义
  65.    #define ROW2   P07
  66.    #define COL1   P00
  67.    #define COL2   P01
  68.    #define COL3   P02
  69.    #define COL4   P03
  70. */
  71. u8 key_num=0xff;
  72. //任务1:数码管显示当前的按键号
  73. void Task_1(void)
  74. {
  75.         
  76.         //第一步:现将P0.0-P0.3输出低电平,P0.6-P0.7输出高电平,如果有按键按下,按下的那一行的IO就会变成低电平,就可以判断出哪一行按下了。
  77.     COL1=0;
  78.         COL2=0;
  79.         COL3=0;
  80.         COL4=0;
  81.         ROW1=1;
  82.         ROW2=1;
  83.         
  84.         if((ROW1==0)||(ROW2==0))       //如果行按键有按下
  85.         {
  86.                 if((ROW1==0)&&(ROW2==0))   //如果两行都有按键按下,不处理
  87.                 {
  88.                         
  89.                 }
  90.                 else if(((ROW1==1)&&(ROW2==0)) ||((ROW1==0)&&(ROW2==1)))     //如果有按键按下,而且只有1颗
  91.                 {
  92.                         if(ROW1==0)       //判断哪一行,输出行开始的序号
  93.                                 key_num=0;
  94.                         else if(ROW2==0)
  95.                                 key_num=4;
  96.                         //第二步:现将P0.0-P0.3输出高电平,P0.6-P0.7输出低电平,如果有按键按下,按下的那一列的IO就会变成低电平,就可以判断出哪一列按下了。
  97.                     COL1=1;
  98.                 COL2=1;
  99.                 COL3=1;
  100.                 COL4=1;
  101.                 ROW1=0;
  102.                 ROW2=0;
  103.                         
  104.                         if(COL1==0)    //判断哪一列,叠加按键的序号
  105.                         {
  106. //                                key_num=key_num+0;
  107.                         }
  108.                         else if(COL2==0)
  109.                         {
  110.                                 key_num=key_num+1;
  111.                         }
  112.                         else if(COL3==0)
  113.                         {
  114.                                 key_num=key_num+2;
  115.                         }
  116.                         else if(COL4==0)
  117.                         {
  118.                                 key_num=key_num+3;
  119.                         }
  120.                 }
  121.                 COL1=0;
  122.             COL2=0;
  123.             COL3=0;
  124.             COL4=0;
  125.             ROW1=1;
  126.             ROW2=1;
  127.         }
  128.         else
  129.         {
  130.                 key_num=0xff;
  131.         }
  132.         
  133.     //第三步:行列组合一下就可以判断出是哪个按键按下了。
  134. }        
  135. void Init_595(void)
  136. {
  137.    HC595_SER =0;
  138.    HC595_RCK =0;
  139.    HC595_SCK =0;
  140. }
  141. void Send_595(u8 dat)
  142. {
  143.         u8 i;
  144.         for(i=0;i<8;i++)
  145.         {
  146.                 dat <<=1;  //DAT=(DAT<<1);  //CY
  147.                 HC595_SER=CY;    //先把数据写到引脚上
  148.                 HC595_SCK=1;                //输出上升沿的时钟信号
  149.                 HC595_SCK=0;
  150.         }
  151. }
  152. void Display_Seg(u8 HC595_1,u8 HC595_2)
  153. {
  154.         Send_595(HC595_1);      //数码管段码输出   高电平点亮
  155.         Send_595(HC595_2);      //数码管位码       低电平点亮
  156.         
  157.         HC595_RCK=1;           //数据输出
  158.         HC595_RCK=0;
  159. }
  160. void SEG_Task(void)
  161. {
  162.         if(key_num==255)
  163.                 Display_Seg( SEG_NUM[17], ~T_NUM[0]);
  164.         else
  165.                 Display_Seg( SEG_NUM[key_num], ~T_NUM[0]);
  166. }
复制代码

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


AI8051U教学视频第十一集矩阵键盘.zip

162.71 KB, 下载次数: 19

回复 支持 反对

使用道具 举报 送花

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

9

主题

30

回帖

689

积分

版主

积分
689
发表于 2025-1-15 11:58:29 | 显示全部楼层
跟着冲哥打卡第12集,已手敲代码,测试通过
任务1:硬件复位
12.1.jpg

  1. #include "config.h"
  2. #include "task.h"
  3. #include "io.h"
  4. u8 State[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
  5. u8 i;
  6. //State[0]
  7. u8 Run_State=0;                  //运行状态
  8. u8 num=0;
  9. char *USER_DEVICEDESC = NULL;
  10. char *USER_PRODUCTDESC = NULL;
  11. char *USER_STCISPCMD = "@STCISP#";
  12. void main(void)
  13. {
  14.     int count=1;                                       //按键计数变量
  15.         Sys_init();                                      //系统初始化
  16.         usb_init();                                     //USB CDC 接口配置
  17.         
  18.     IE2 |= 0x80;                                    //使能USB中断
  19.         Timer0_Init();                                  //定时器初始化
  20.         Init_595();
  21.     EA = 1;                                                                                        //IE |= 0X80;
  22.         
  23.         P40=0;
  24.         
  25.         while (DeviceState != DEVSTATE_CONFIGURED);     //等待USB完成配置
  26.         WDT_CONTR=0X24;
  27.         
  28.         while(1)
  29.         {        
  30.         if (bUsbOutReady)                                                        //如果接收到了数据
  31.         {
  32.             //USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
  33.                         
  34.             usb_OUT_done();                                                        //
  35.         }
  36.                 Task_Pro_Handler_Callback( );               //执行函数
  37.                 if(P33!=0)
  38.                         WDT_CONTR=0X34;
  39.         }
  40. }
  41. void Timer0_Isr(void) interrupt 1        //1ms执行一次
  42. {
  43.         Task_Marks_Handler_Callback();          //系统计时
  44. }
复制代码
  1. #include "config.h"
  2. void Delay10ms(void)        //@24.000MHz
  3. {
  4.         unsigned long edata i;
  5.         _nop_();
  6.         _nop_();
  7.         _nop_();
  8.         i = 59998UL;
  9.         while (i) i--;
  10. }
  11. void USB_Reset_U(void)
  12. {        
  13.         P3M0 = 0x00;
  14.         P3M1 = 0x00;
  15.         
  16.         P3M0 &= ~0x03;
  17.         P3M1 |= 0x03;
  18.         
  19.         USBCON = 0X00;
  20.         USBCLK = 0X00;
  21.         IRC48MCR = 0X00;
  22.         Delay10ms();
  23. }
  24. void Sys_init(void)
  25. {
  26.         WTST = 0;                                       //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
  27.     EAXFR = 1;                                      //扩展寄存器(XFR)访问使能
  28.     CKCON = 0;                                      //提高访问XRAM速度
  29.         
  30.     P0M1 = 0x00;   P0M0 = 0x00;
  31.     P1M1 = 0x00;   P1M0 = 0x00;
  32.     P2M1 = 0x00;   P2M0 = 0x00;
  33.     P3M1 = 0x00;   P3M0 = 0x00;
  34.     P4M1 = 0x00;   P4M0 = 0x00;
  35.     P5M1 = 0x00;   P5M0 = 0x00;
  36.     P6M1 = 0x00;   P6M0 = 0x00;
  37.     P7M1 = 0x00;   P7M0 = 0x00;
  38.         
  39.         USB_Reset_U( );
  40. }
  41. void Timer0_Init(void)                //1毫秒@24.000MHz
  42. {
  43.         TM0PS = 0x00;                        //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
  44.         AUXR &= 0x7F;                        //定时器时钟12T模式
  45.         TMOD &= 0xF0;                        //设置定时器模式
  46.         TL0 = 0x30;                                //设置定时初始值
  47.         TH0 = 0xF8;                                //设置定时初始值
  48.         TF0 = 0;                                //清除TF0标志
  49.         TR0 = 1;                                //定时器0开始计时
  50.         ET0 = 1;                                //使能定时器0中断
  51. }
复制代码

任务2:软件复位
12.2.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. }
复制代码

AI8051U教学视频第十二集复位系统.zip

164.44 KB, 下载次数: 12

回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-6-30 06:24 , Processed in 1.980125 second(s), 99 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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