找回密码
 立即注册
楼主: 乐高

AI8051U教学视频课后小练 | 高质量打卡

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:270
  • 最近打卡:2026-02-06 08:39:27
已绑定手机

1

主题

59

回帖

602

积分

高级会员

积分
602
发表于 2025-3-16 22:28:50 | 显示全部楼层
第二十一集   Flash模拟EEPROM     课后小练
密码锁.png 下次下载不擦除用户EEPROM.png
虽然看上去只有几句要求,但做起来还是有点麻烦。按键又增加了一个,单独用矩阵键盘是不够用了。要用到ADC键盘,我把这两个键盘都用上了,可以同时工作,类似于笔记本电脑的大小键盘
下载程序的时候需要注意一点:不选择“下次下载用户程序时擦除用户EEPROM区”,不然保存在EEPROM 的数据,经过一次下载就没了,还不知道问题出在哪里。当然,如你需要,可以选择擦除。
  1. void main(void)
  2. {
  3.         Sys_init();                                                                                //系统初始化
  4.         usb_init();                                     //USB CDC 接口配置
  5.     IE2 |= 0x80;                                    //使能USB中断
  6.         Timer0_Init();                                                                        //定时器初始化
  7.         ADC_Init();
  8.     EA = 1;                                                                                        //IE |= 0X80;
  9.         WDT_CONTR = 0x25;                                                                //使能看门狗,溢出时间约1.05S
  10.         //while (DeviceState != DEVSTATE_CONFIGURED);     //等待USB完成配置
  11.         //P40 = 0 ;
  12.         Parm_Init();
  13.         while(1)
  14.         {
  15.                
  16.                 if( blink_stop)                                                        //新密码输入完成,再次按下“#”键,这里是ADC键盘F号键
  17.                   if(ADC_KEY_READ(ADC_Read(0))==15)
  18.                         {  
  19.                                 admin = 0 ;blink_stop = 0;
  20.                                 EEPROM_SectorErase(E_ADDR);                //清空地址里的数据,擦除扇区
  21.                                 memcpy(dat,cod,8);
  22.                                 dat[8] = SYS_Run_times;
  23.                                 dat[9] = (u8)(dat[0]+dat[1]+dat[2]+dat[3]+dat[4]+dat[5]+dat[6]+dat[7]+dat[8]);
  24.                                 EEPROM_write_n(E_ADDR,dat,10);
  25.                         
  26.                         }
  27.                
  28.                 Task_Pro_Handler_Callback();                                //执行功能函数
  29.                 WDT_CONTR = 0x35;                                                   //清看门狗
  30.         }
  31. }
复制代码
  1. u8 SYS_Run_times = 0;
  2. u8 dat[10];                        //0-7:8位密码   8:开机次数   9:校验码(累加校验)
  3. /*任务1:实现手册的EEPROM的基本操作,并用数码管显示当前的数值。并实现每次重新开机数值+1*/
  4. void Parm_Init(void)
  5. {
  6.         EEPROM_read_n( E_ADDR ,dat,10 );
  7.         if( dat[8] == 0xff )                        //如果读取到的数据是0xff,就是第一次上电,此时可以初始化
  8.         {
  9.                 EEPROM_SectorErase(E_ADDR);        //清空地址里的数据,擦除扇区
  10.                 memcpy(dat,cod2,8);  
  11.                 dat[8] = 1;
  12.                 dat[9] = (u8)(dat[0]+dat[1]+dat[2]+dat[3]+dat[4]+dat[5]+dat[6]+dat[7]+dat[8]);
  13.                 EEPROM_write_n(E_ADDR,dat,10);
  14.                
  15.                 //SYS_Run_times = 1;
  16.         }
  17.         else                                                        //第二次及其之后的上电
  18.         {
  19.                 if( dat[9] == (u8)(dat[0]+dat[1]+dat[2]+dat[3]+dat[4]+dat[5]+dat[6]+dat[7]+dat[8]) )        //校验通过,数据有效
  20.                 {
  21.                         SYS_Run_times = dat[8];
  22.                         SYS_Run_times +=1;
  23.                         memcpy(cod2,dat,8);                        
  24.                 }
  25.                 else
  26.                 {
  27.                         //如果数据校验出错,执行什么
  28.                 }
  29.         }
  30. }
复制代码
  1. sbit COL1 =        P0^0;                        //矩阵键盘的数据口端口定义
  2. sbit COL2 =        P0^1;
  3. sbit COL3 =        P0^2;                        
  4. sbit COL4 =        P0^3;
  5. sbit ROW1 =        P0^6;
  6. sbit ROW2 =        P0^7;
  7. //矩阵端口数据处理
  8. void Matrixkey_W(u8 m)            //向6个管脚写入数据
  9. {
  10.         COL1 = m & (0x01<<0);
  11.         COL2 = m & (0x01<<1);
  12.         COL3 = m & (0x01<<2);
  13.         COL4 = m & (0x01<<3);
  14.         ROW1 = m & (0x01<<4);
  15.         ROW2 = m & (0x01<<5);
  16. //        ROW3 = m & (0x01<<6);
  17. //        ROW4 = m & (0x01<<7);
  18. }
  19. u8 Matrixkey_R()                                 //从6个管脚读出数据
  20. {
  21.   u8 n =0;
  22.   // n  &= (u8)COL1;
  23.    if(COL1)                                                        
  24.          n |= 0x01;                                         
  25.    if(COL2)
  26.          n |= 0x02;
  27.    if(COL3)
  28.         n  |= 0x04;
  29.    if(COL4)
  30.          n |= 0x08;
  31.    if(ROW1)
  32.          n |= 0x10;
  33.    if(ROW2)
  34.          n |= 0x20;
  35. //   if(ROW3)
  36. //         n |= 0x40;
  37. //   if(ROW4)
  38. //         n |= 0x80;
  39.    return n;
  40. }
  41. void KEY_Task(void)                            //2*4矩阵键盘扫描
  42. {  
  43.         u8 key_temp;
  44.          u8 key1,key2;        
  45.          Matrixkey_W(0x30);
  46.         key1 = Matrixkey_R();
  47.         if(key1 != 0x30 )
  48.         {        
  49.                 key1 = Matrixkey_R()&0x30;                                    //确定哪一行的按键按下        
  50.                 Matrixkey_W(0x0f);
  51.                 key2 = Matrixkey_R();
  52.                 if(key2 != 0x0f)
  53.                         key2 = Matrixkey_R()&0x0f;                             //确定哪一列的按键按下
  54.                 key_temp=key1|key2;                                            //确定按键位置
  55.          }
  56.         else
  57.                 key_temp = key_no;
  58.         
  59.                 switch(key_temp)                                                //当确定按键按下后,列举所有的按键情况
  60.                 {   
  61.                          case 0x2e: key_value=0;break;
  62.                          case 0x2d: key_value=1;break;
  63.                          case 0x2b: key_value=2;break;
  64.                          case 0x27: key_value=3;break;
  65.                          case 0x1e: key_value=4;break;
  66.                          case 0x1d: key_value=5;break;
  67.                          case 0x1b: key_value=6;break;
  68.                          case 0x17: key_value=7;break;
  69.                          case 0xff: key_value=255;break;                        
  70.                  }        
  71. }
复制代码
  1. void PW_write_Task(void)
  2. {
  3.         u8 key ;
  4.         if(ADC_KEY_READ(ADC_Read(0))==15 & open)                //开锁后长按“#”号按键,这里设置ADC15号F按键为“#”号按键
  5.                 t_count++;
  6.                
  7.         if(t_count>300)                                                                        //长按“#”号按键3秒,进入管理员模式,admin置一
  8.         {
  9.                 admin = 1;
  10.                 memcpy(cod ,cod0,8);                             //将数组cod0的值复制给cod
  11.                 t_count = 0;
  12.         }
  13.         if(key_value<11)                                //只要矩阵键盘或者ADC键盘有按键按下,就把键值读入。
  14.                 key = key_value;                        //实现两组按键同时起作用
  15.         else
  16.                 key = ADC_KEY_READ(ADC_Read(0));
  17.         if( key< 11 )
  18.         {        
  19.                 Key_num ++ ;
  20.                
  21.                 if(Key_num ==6)
  22.                 {
  23.                          j++;
  24.                 if(open ==0 )
  25.                   {                                
  26.                          cod[j-1] = cod1[key];                                         //把收到的数字逐一存入cod[]中
  27.                         if(j==8)                                                                  //如果按了8个数字
  28.                          {
  29.                                 if(!memcmp(cod,cod2,8))                       //比较cod与cod2两数组是否相等,若相等显示“--OPEN--”,不等显示初始值“--------”
  30.                                         open = 1;                                
  31.                             else
  32.                                  {                                
  33.                                         memcpy(cod,cod0,8);                       //将初始值cod0复制给cod,回到起始状态
  34.                                         j = 0;
  35.                                  }
  36.                           }                        
  37.                    }
  38.                  if(admin)
  39.                  {
  40.                          cod[j-1] = cod1[key];                                          //进入管理员模式,把新的密码数字逐一存入cod[]中
  41.                                  if(j==8)                                                           //如果按了8个数字,停止闪烁,正常显示新的密码
  42.                          {
  43.                                  blink_stop = 1;
  44.                          }
  45.                  }
  46.                  if( key ==10)
  47.                         {
  48.                                 j = 0;
  49.                                 open =0;
  50.                         }
  51.                 if((open ==0)&&(j==0))
  52.                                 memcpy(cod,cod0,8);                               //将初始值cod0复制给cod,回到起始状态
  53.                 }               
  54.    }
  55.         else
  56.                 Key_num = 0;
  57. }
复制代码

21.EEPROM.zip (235.76 KB, 下载次数: 102)



回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:270
  • 最近打卡:2026-02-06 08:39:27
已绑定手机

1

主题

59

回帖

602

积分

高级会员

积分
602
发表于 2025-3-17 08:27:16 | 显示全部楼层
第二十一集     Flash模拟EEPROM    课后小练补充
密码锁.png
这次我在程序中加入了查看开锁密码和开机次数的功能,把程序版本号改为了U 2.00。
设置的查看开锁密码的数组是“31415926”,查看开机次数的数组是“88889999”。
MCU运行频率24M。
  1. if(open ==0 )
  2.                   {                                
  3.                          cod[j-1] = cod1[key];                                         //把收到的数字逐一存入cod[]中
  4.                         if(j==8)                                                                  //如果按了8个数字
  5.                          {
  6.                                 if(!memcmp(cod,cod2,8))                       //比较cod与cod2两数组是否相等,若相等显示“--OPEN--”
  7.                                         open = 1;        
  8.                                 else if(!memcmp(cod,cod4,8))               //比较cod与cod4两数组是否相等,若相等则显示开锁密码
  9.                                         memcpy(cod,cod2,8);                       //将初始值cod2复制给cod
  10.                                 else if(!memcmp(cod,cod5,8))               //比较cod与cod5两数组是否相等,若相等则显示开机次数
  11.                                 {
  12.                                         cod[0] = 0;
  13.                                         cod[1] = 0;
  14.                                         cod[2] = 0;
  15.                                         cod[3] = 0;
  16.                                         cod[4] = 0;
  17.                                         cod[5] = SEG_NUM[SYS_Run_times/100];
  18.                                         cod[6] = SEG_NUM[SYS_Run_times%100/10];
  19.                                         cod[7] = SEG_NUM[SYS_Run_times%10];
  20.                                 }
  21.                             else                                                                 //不等显示初始值“--------”
  22.                                  {                                
  23.                                         memcpy(cod,cod0,8);                       //将初始值cod0复制给cod,回到起始状态
  24.                                         j = 0;
  25.                                  }
  26.                           }                        
  27.                    }
复制代码


21.EEPROM (U 2.00).zip (237.23 KB, 下载次数: 115)

回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:270
  • 最近打卡:2026-02-06 08:39:27
已绑定手机

1

主题

59

回帖

602

积分

高级会员

积分
602
发表于 2025-3-19 11:06:18 | 显示全部楼层
触摸按键演示板

IMG_20250319_110739.jpg 触摸按键演示版.jpg
  1. void main(void)
  2. {
  3.         u8 i,j;
  4.         char xdata dat[50];
  5.         P_SW2 |=0x80;
  6.         UART1_config(1);    // 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
  7. //1.需要用到的触摸引脚设置为高阻输入
  8.      P1M0 = 0x00; P1M1 = 0xf8;           //P1.3-P1.7
  9.         P3M0 = 0x00; P3M1 = 0x0c;                         //P3.2 、 P3.3,(P3.0 、 P3.1 作为串口1通讯口)
  10.                         
  11.    // P3M0 = 0x00; P3M1 = 0xfc;                  
  12.     P5M0 = 0x00; P5M1 = 0x10;               //P5.4
  13. //2.配置是否需要同时使用触摸LED指示和触摸检测
  14.         TSRT = 0;                                        //不需要使用LED
  15. //3.需要用到的触摸通道使能
  16.         TSCHEN1 = 0xfc;                                 
  17.         TSCHEN2 = 0x0c;
  18. //4.设置触摸按键的开关频率,参考电压和放电时间
  19.         TSCFG1 = (7<<4) + 6;   //工作频率设为最低,3 时钟为1000个系统时钟,6时钟为5000个系统时钟
  20.         TSCFG2 = 2;                       //参考电压为 5/8 AVCC
  21. //5. 开启触摸
  22.         TSCTRL = 0xa1 ;
  23. //6.开启触摸中断并保存数据
  24.         IE2 |= 0x80;
  25.         
  26.         EA = 1;        
  27. }
复制代码



触摸按键演示板.zip (100.59 KB, 下载次数: 116)

触摸按键演示板 (1).zip (101.26 KB, 下载次数: 110)   程序(1)修改了一下LED数组操作序号,这样更合理一些。
1 喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:270
  • 最近打卡:2026-02-06 08:39:27
已绑定手机

1

主题

59

回帖

602

积分

高级会员

积分
602
发表于 2025-3-27 16:22:36 | 显示全部楼层
第二十二集  比较器   课后小练

比较器密码锁.png 比较器电路部分.jpg
首先让我们对照电路图看程序,内部比较器的一端CMP-输入脚接内部1.19V参考电压;另一端CMP+接P4.6,P4.6接在USB+5V下面的可调电阻W1调节端。
CMPEXCFG |= 0x04;       //内部1.19V参考电压为CMP-输入脚   
CMPEXCFG &= ~0x03;   //P4.6为CMP+输入脚     
INVCMPO = 0;              //比较器正向输出  
CMPO_S = 0;                //选择P4.5作为比较器输出脚,P4.5在LCD12864模块接口的第四位。因为设定了比较器正向输出 ,所以当CMP+电压大于CMP-电压的时候,P4.5为高电平输出。
P42 = ~CMPRES;          //中断方式读取比较器比较结果,CMPRESS=0,LED11灭;CMPRESS=1,LED11亮。原程序是P42 = CMPRES; 为了节省断电后的电流,我把它取反了。
//在P4.5端口接上一个发光二极管,以及从实验箱上的LED11都可以观察比较器的输出结果,我把它们接成同相了。
比较器输出指示.jpg
在程序测试时,首先需要调节W1的阻值,使得P4.6端口的电压大于1.19V且不太多,这样可以使得掉电后,MCU有足够的时间去保存数据,而且不用在MCU两端加大容量电容。

  1. void PW_write_Task(void)
  2. {
  3.         u8 key ;
  4.         if(ADC_KEY_READ(ADC_Read(0))==15 & open)                //开锁后长按“#”号按键,这里设置ADC15号F按键为“#”号按键
  5.                 t_count++;
  6.                
  7.         if(t_count>300)                                                                        //长按“#”号按键3秒,进入管理员模式,admin置一
  8.         {
  9.                 admin = 1;
  10.                
  11.                 memcpy(cod ,cod0,8);                            //将数组cod0的值复制给cod
  12.                 t_count = 0;
  13.         }
  14.         if(key_value<11)                                //只要矩阵键盘或者ADC键盘有按键按下,就把键值读入。
  15.                 key = key_value;                        //实现两组按键同时起作用
  16.         else
  17.                 key = ADC_KEY_READ(ADC_Read(0));
  18.         if( key< 11 )
  19.         {        
  20.                 Key_num ++ ;
  21.                
  22.                 if(Key_num ==6)
  23.                 {
  24.                          j++;
  25.                 if(open ==0 )
  26.                   {                                
  27.                          cod[j-1] = cod1[key];                                         //把收到的数字逐一存入cod[]中
  28.                         if(j==8)                                                                  //如果按了8个数字
  29.                          {
  30.                                 if(!memcmp(cod,cod2,8))                       //比较cod与cod2两数组是否相等,若相等显示“--OPEN--”,不等显示初始值“--------”
  31.                                 {
  32.                                         open = 1;
  33.                                         open_t++;                                                 //开门次数加一
  34.                                 }
  35.                                 else if(!memcmp(cod,cod4,8))               //比较cod与cod4两数组是否相等,若相等则显示开锁密码
  36.                                         memcpy(cod,cod2,8);                       //将初始值cod2复制给cod
  37.                                 else if(!memcmp(cod,cod5,8))               //比较cod与cod5两数组是否相等,若相等则显示开机次数
  38.                                 {
  39.                                         /*依次显示3位错输次数,3位开门次数,2位进管理员模式次数*/
  40.                                         cod[0] = SEG_NUM[err_t/100];
  41.                                         cod[1] = SEG_NUM[err_t%100/10];
  42.                                         cod[2] = SEG_NUM[err_t%10];
  43.                                         cod[3] = SEG_NUM[open_t/100];
  44.                                         cod[4] = SEG_NUM[open_t%100/10];
  45.                                         cod[5] = SEG_NUM[open_t%10];
  46.                                         cod[6] = SEG_NUM[adm_t%100/10];
  47.                                         cod[7] = SEG_NUM[adm_t%10];
  48.                                 }
  49.                             else                                       
  50.                                  {                                
  51.                                         err_t++;                                                 //输入错误,错输次数加一
  52.                                         memcpy(cod,cod0,8);                       //将初始值cod0复制给cod,回到起始状态
  53.                                         j = 0;
  54.                                  }
  55.                           }                        
  56.                    }
  57.                  if(admin)
  58.                  {
  59.                          cod[j-1] = cod1[key];                                          //进入管理员模式,把新的密码数字逐一存入cod[]中
  60.                                  if(j==8)                                                           //如果按了8个数字,停止闪烁,正常显示新的密码
  61.                          {
  62.                                  blink_stop = 1;
  63.                                  adm_t++;                                                        //完成一次修改密码,进管理员次数加一
  64.                          }
  65.                  }
  66.                  if( key ==10)
  67.                         {
  68.                                 j = 0;
  69.                                 open =0;
  70.                                 if(admin)
  71.                                 {
  72.                                         adm_t++;                                                //中途退出,进管理员次数也加一次
  73.                                         admin = 0;
  74.                                 }
  75.                         }
  76.                 if((open ==0)&&(j==0))
  77.                                 memcpy(cod,cod0,8);                               //将初始值cod0复制给cod,回到起始状态
  78.                 }               
  79.    }
  80.         else
  81.                 Key_num = 0;
  82.                 dat[8] = err_t;
  83.                 dat[9] = open_t;
  84.                 dat[10] = adm_t;
  85.                 dat[11] = (u8)(dat[0]+dat[1]+dat[2]+dat[3]+dat[4]+dat[5]+dat[6]+dat[7]+dat[8]+dat[9]+dat[10]);
  86. }
复制代码



回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:270
  • 最近打卡:2026-02-06 08:39:27
已绑定手机

1

主题

59

回帖

602

积分

高级会员

积分
602
发表于 2025-3-27 16:57:44 | 显示全部楼层
第二十二集    比较器  课后小练(续)

比较器密码锁.png
我在二十一集程序的基础上稍作了一些增删。仍然采用输入31415926来读出开门密码,输入88889999来显示(一次8位同时显示)1、密码输入错误次数(前3位),2、开门次数(中3位),3、进入管理员模式次数(后2位)。如下图:密码输入错误6次,开门5次,进入管理员模式3次。
IMG_20250327_164420.jpg
  1. //========================================================================
  2. // 函数: void CMP_config(void)
  3. // 描述: 比较器初始化函数。
  4. // 参数: 无.
  5. // 返回: 无.
  6. // 版本: V1.0, 2020-6-10
  7. //========================================================================
  8. void CMP_config(void)
  9. {
  10.     CMPEXCFG = 0x00;
  11. //  CMPEXCFG |= 0x40;       //比较器DC迟滞输入选择,0:0mV; 0x40:10mV; 0x80:20mV; 0xc0:30mV
  12. //  CMPEXCFG &= ~0x04;      //P4.4为CMP-输入脚
  13.     CMPEXCFG |= 0x04;       //内部1.19V参考电压为CMP-输入脚
  14.     CMPEXCFG &= ~0x03;      //P4.6为CMP+输入脚
  15. //  CMPEXCFG |= 0x01;       //P5.0为CMP+输入脚
  16. //  CMPEXCFG |= 0x02;       //P5.1为CMP+输入脚
  17. //  CMPEXCFG |= 0x03;       //ADC输入脚为CMP+输入脚
  18.     CMPCR2 = 0x00;
  19.     INVCMPO = 0;            //比较器正向输出
  20. //  INVCMPO = 1;            //比较器反向输出
  21.     DISFLT = 0;             //使能0.1us滤波
  22. //  DISFLT = 1;             //禁止0.1us滤波
  23. //  CMPCR2 &= ~0x3f;        //比较器结果直接输出
  24.     CMPCR2 |= 0x10;         //比较器结果经过16个去抖时钟后输出
  25.     CMPCR1 = 0x00;
  26. //  PIE = 0;                //禁止比较器上升沿中断
  27.     PIE = 1;                //使能比较器上升沿中断
  28. //  NIE = 0;                //禁止比较器下降沿中断
  29.     NIE = 1;                //使能比较器下降沿中断
  30. //  CMPOE = 0;              //禁止比较器输出
  31.     CMPOE = 1;              //使能比较器输出
  32.     CMPO_S = 0;             //选择P4.5作为比较器输出脚
  33. //  CMPO_S = 1;             //选择P4.1作为比较器输出脚
  34.     CMPEN = 1;              //使能比较器模块
  35. }
复制代码
  1. u8 dat[12];                        //0-7:8位开门密码   8:错输次数   9:开门次数  10:进管理员模式次数   11:校验码(累加校验)
  2. void Parm_Init(void)
  3. {
  4.         EEPROM_read_n( E_ADDR ,dat,12 );
  5.         if( dat[8] == 0xff )                        //如果读取到的数据是0xff,就是第一次上电,此时可以初始化
  6.         {
  7.                 memcpy(dat,cod2,8);
  8.                
  9.         }
  10.         else
  11.         {
  12.          if( dat[11] == (u8)(dat[0]+dat[1]+dat[2]+dat[3]+dat[4]+dat[5]+dat[6]+dat[7]+dat[8]+dat[9]+dat[10]) )        //校验通过,数据有效
  13.          {
  14.                 EEPROM_SectorErase(E_ADDR);        //清空地址里的数据,擦除扇区
  15.                 memcpy(cod2,dat,8);
  16.                 err_t = dat[8];
  17.                 open_t = dat[9];
  18.                 adm_t = dat[10];
  19.          }
  20.         }
  21. }
复制代码
  1. /******************* 比较器中断函数 ********************/
  2. void CMP_Isr() interrupt 21
  3. {
  4.    // u8  i;
  5.     CMPIF = 0;          //清中断标志
  6.     P42 = ~CMPRES;       //中断方式读取比较器比较结果,CMPRESS=0,LED11灭;CMPRESS=1,LED11亮。
  7.     if(CMPRES)
  8.     {
  9.         if(LowVolFlag)
  10.         {
  11.             LowVolFlag = 0;             //清除低电压标志
  12.                         memcpy(cod,cod0,8);                 //点亮数码管
  13. //            if(Test_cnt != Temp_cnt)
  14. //            {
  15. //                EEPROM_read_n(E_ADDR,tmp,2);        //读出2字节
  16. //                Test_cnt = ((u16)tmp[0] << 8) + tmp[1]; //秒计数
  17. //                if(Test_cnt > 10000)    Test_cnt = 0;   //秒计数范围为0~10000
  18. //                Temp_cnt = Test_cnt;
  19. //            }
  20.         }
  21.     }
  22.     else
  23.     {
  24.                 //Display_Seg(0,0);
  25.                 memcpy(cod,cod6,8);           //熄灭数码管
  26.         if(!LowVolFlag)
  27.         {
  28.             LowVolFlag = 1;           //设置低电压标志                                       
  29. //                        dat[8] = err_t;
  30. //                        dat[9] = open_t;
  31. //                        dat[10] = adm_t;
  32. //                        dat[11] = (u8)(dat[0]+dat[1]+dat[2]+dat[3]+dat[4]+dat[5]+dat[6]+dat[7]+dat[8]+dat[9]+dat[10]);
  33.                         EEPROM_write_n(E_ADDR,dat,12);
  34. //            if(Test_cnt != Temp_cnt)
  35. //            {
  36. //                Temp_cnt = Test_cnt;
  37. //                EEPROM_SectorErase(EE_ADDRESS); //擦除扇区
  38. //                tmp[0] = (u8)(Temp_cnt >> 8);
  39. //                tmp[1] = (u8)Temp_cnt;
  40. //                EEPROM_write_n(EE_ADDRESS,tmp,2);
  41. //            }
  42.         }
  43.     }
  44. }
复制代码

22.比较器.zip (404.72 KB, 下载次数: 111)

回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:633
  • 最近打卡:2026-02-12 00:01:11
已绑定手机

157

主题

1913

回帖

2451

积分

金牌会员

积分
2451
发表于 2025-3-28 16:24:30 | 显示全部楼层
有点强啊
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:24
  • 最近打卡:2025-06-24 17:27:03
已绑定手机

0

主题

24

回帖

150

积分

注册会员

积分
150
发表于 2025-5-25 07:50:14 | 显示全部楼层
乐*** 发表于 2025-3-12 16:04
第20集  ADC_NTC测温  课后小练

这是一个学习的好地方,有这个么老大,很高兴很有缘分,有一群志同道合的朋友,物以类聚 ,人 以群分
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:502
  • 最近打卡:2026-02-12 10:09:57

0

主题

34

回帖

120

积分

注册会员

积分
120
发表于 2025-9-24 09:57:50 | 显示全部楼层
乐*** 发表于 2025-3-2 09:55
第18集  串口高级应用  课后小练
本人愚钝,MODBUS-RTU 花了整整一个星期的时间才初步完成了此集课后小练 ...

用梁工的程序能测试通过,但你的程序为什么不行呀!我反复看了视频都对的,用你的原码还是不行!!!
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:502
  • 最近打卡:2026-02-12 10:09:57

0

主题

34

回帖

120

积分

注册会员

积分
120
发表于 2025-9-24 10:00:47 | 显示全部楼层
C:\TEMP\qq.jpg  硬件如图

硬件如图

硬件如图
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-2-12 21:42 , Processed in 1.887693 second(s), 90 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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