找回密码
 立即注册
楼主: wuzhengmin

第一次:环境的创立 | 送实验箱

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:42
  • 最近打卡:2025-10-15 15:37:36
已绑定手机

2

主题

271

回帖

780

积分

高级会员

积分
780
发表于 2025-8-22 12:10:48 | 显示全部楼层
外部中断x:x=2-4
触发只有下降沿,触发后它就会标记为这个INTxIF的一个标志位,如果说我们打开了EX2和EX3,优先级位最低,不能改中断优先级
外部中断x:x=2-4
INTxIF
EXn

EA


截图202508221210342970.jpg
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:42
  • 最近打卡:2025-10-15 15:37:36
已绑定手机

2

主题

271

回帖

780

积分

高级会员

积分
780
发表于 2025-8-22 12:38:05 | 显示全部楼层
下面看外部中断1的例子:
外部中断1:
IT1
IE1
EX1
EA
IE1:外部中断1请求源(INTI/P3.3)标志。IE1=1,外部中断向CPU请求中断,当CPU响应该中断时由硬件清“0”IE1。

ITI:外部中断源1触发控制位。ITI-0,上升沿或下降沿均可触发外部中断1.ITI-1,外部中断1程控为下降沿触发方式。
EXI:外部中断 1 中断允许位。
0:禁止 INTI 中断1:允许 IN1 中断

打开手册看P771:

15.5.3  INT1 中断(上升沿和下降沿),可同时支持上升沿和下降沿

设置还是3步:

IT1=1;   //使能INT1 下降沿中断
EX1=1;  //使能INT1 中断

EA=1;  //打开总中断

对应中断函数中断号是2

void INT1_Isr() interrupt 2
{

}


回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:42
  • 最近打卡:2025-10-15 15:37:36
已绑定手机

2

主题

271

回帖

780

积分

高级会员

积分
780
发表于 2025-8-22 12:46:15 | 显示全部楼层
各个中断服务函数对应的中断号,见下图:

试验箱上默认端口是高电平,按下就是低电平!


截图202508221245537995.jpg
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:42
  • 最近打卡:2025-10-15 15:37:36
已绑定手机

2

主题

271

回帖

780

积分

高级会员

积分
780
发表于 2025-8-22 13:24:04 | 显示全部楼层
任务1:编写外部中断1的程序

  1. void INT1_Init(void) //INT1中断(上升沿和下降沿)P33按下,0可同时支持上升沿和下降沿
  2. {
  3.         IT1 = 1;                        //下降沿中断,0是上升沿和下降沿都可以
  4.         EX1 = 1;                        //打开中断允许
  5.         EA = 1;                                //打开总中断
  6. }
  7. void INT_ISR(void) interrupt 2  //INT1中断(上升沿和下降沿)P33按下,可同时支持上升沿和下降沿
  8. {
  9.         P04 = !P04;
  10.         P05 = !P05;
  11.         P06 = !P06;
  12.         P07 = !P07;
  13.        
  14.         //P33按下,P01就取反
  15. }
复制代码
当然,首先要在main.c里初始化:


        INT1_Init();  //外部中断1(P33按下)中断初始化                                                                        //外部中断1初始化




回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:42
  • 最近打卡:2025-10-15 15:37:36
已绑定手机

2

主题

271

回帖

780

积分

高级会员

积分
780
发表于 2025-8-26 10:44:33 | 显示全部楼层

第十四集   先看第十七集 串口的简单应用

    今天我们先跳到串口:
串口是最常用,最基本的通讯方法,我们从STC89C51开始就经常用,先看看这段代码:
  1. //1.发送OPEN\r\n打开数码管,数码管显示“- - - -” 11 22 OPEN\r\n
  2. //2.发送CLOSE\r\n打开数码管,数码管全部熄灭
  3. //3.再打开的情况下,串口发送DAT+123\r\n,数码管显示数值“123”
  4. void Usart2_RunTask(void)
  5. {
  6.       if( Rec_Num >= 6 )                //是否接收到了6位以上的数据
  7.       {
  8.               if(( Rec_Dat[Rec_Num-1] == '\n' ) && ( Rec_Dat[Rec_Num-2] == '\r' ) )        //末尾判断
  9.               {
  10.                     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' )  )
  11.                     {
复制代码
                                }
                                                               
                               
                                if( ( Rec_Dat[Rec_Num-9] == 'D' ) && ( Rec_Dat[Rec_Num-8] == 'A' ) &&( Rec_Dat[Rec_Num-7] == 'T' ) && ( Rec_Dat[Rec_Num-6] == '+' ) && ( Rec_Dat[Rec_Num-5] == '1' ) && ( Rec_Dat[Rec_Num-4] == '2' ) && ( Rec_Dat[Rec_Num-3] == '3' )  )
                              {
                               passward[0] = 8;
                               passward[1] = 8;
                               passward[2] = 8;
                               passward[3] = 8;
                               Uart2_SendStr( "DAT+123!\r\n" );
                              }

                }
               Rec_Num = 0;
          }
   }
}





上面是 单片机接收到DAT+123\r\n 就先在数码管前4位显示8888 接着通过串口2发送“DAT+123!

截图202508261025199655.jpg
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:42
  • 最近打卡:2025-10-15 15:37:36
已绑定手机

2

主题

271

回帖

780

积分

高级会员

积分
780
发表于 2025-8-26 10:46:34 | 显示全部楼层
我们故意多回复一个!给PC,表面收到的是“DAT+123\r\n”

回复的是 “ DAT+123!\r\n”
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:42
  • 最近打卡:2025-10-15 15:37:36
已绑定手机

2

主题

271

回帖

780

积分

高级会员

积分
780
发表于 2025-8-26 11:17:26 | 显示全部楼层
这里其实要理解结束符“\r\n”


仔细看下图:


截图202508261117204959.jpg
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:42
  • 最近打卡:2025-10-15 15:37:36
已绑定手机

2

主题

271

回帖

780

积分

高级会员

积分
780
发表于 2025-9-10 10:24:07 | 显示全部楼层
第二十二集 比较器

最近一直追赶,没有写体会,这半个月一直在研究比较器,跟着冲哥写了程序:
但是下载后发现,没有写入按键次数,感觉应该是不够电............
先看一下中断函数:
  1. /******************* 比较器中断函数 ********************/
  2. void CMP_Isr() interrupt 21
  3. {
  4.        
  5.     CMPIF = 0;          //清中断标志
  6.     P42 = CMPRES;       //中断方式读取比较器比较结果
  7.    
  8.     if(CMPRES)
  9.     {
  10.         if(LowVolFlag)
  11.         {
  12.             LowVolFlag = 0;    //清除低电压标志
  13.             if(Test_cnt != Temp_cnt)
  14.             {
  15.                 EEPROM_read_n(EE_ADDRESS,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.                                 EEPROM_SectorErase(EE_ADDRESS); //擦除扇区
  20.                                
  21.             }
  22.         }
  23.     }
  24.     else
  25.     {
  26.         
  27. /*下面8行关闭数码管
  28.                 HC595_SER = 0;
  29.         for(i=0; i<16; i++)     //先关闭显示,省电
  30.         {
  31.             HC595_SCK = 1;
  32.             HC595_SCK = 0;
  33.         }
  34.                
  35.         HC595_RCK = 1;
  36.         HC595_RCK = 0;       //锁存输出数据
  37. */               
  38.                 Display_Seg(0,0);  //实际这个函数入口参数直接写0,就是上面8行关闭数码管
  39.                
  40.                
  41.         if(!LowVolFlag)
  42.         {
  43.             LowVolFlag = 1;    //设置低电压标志
  44.             if(Test_cnt != Temp_cnt)
  45.             {
  46.                 Temp_cnt = Test_cnt;
  47.                
  48.                 tmp[0] = (u8)(Temp_cnt >> 8);
  49.                 tmp[1] = (u8)Temp_cnt;
  50.                 EEPROM_write_n(EE_ADDRESS,tmp,2);
  51.             }
  52.         }
  53.     }
  54. }
复制代码
也没发现哪里有问题啊?
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:42
  • 最近打卡:2025-10-15 15:37:36
已绑定手机

2

主题

271

回帖

780

积分

高级会员

积分
780
发表于 2025-9-10 10:31:06 | 显示全部楼层
EEPROM_write_n(EE_ADDRESS,tmp,2);
为什么没有执行?当然硬件上220uf 的电容首先要工作正常,但是主要问题可能还是在程序,看看主程序:
  1. void main(void)
  2. {
  3.         Sys_init();                //系统初始化
  4.        
  5.         #if USB_STATE == 1
  6.                 usb_init();                                     //USB CDC 接口配置
  7.                 IE2 |= 0x80;                                    //使能USB中断
  8.         #endif
  9.        
  10.         CMP_config();
  11.        
  12.     EA = 1;                                                                                        //IE |= 0X80;
  13.        
  14.         #if USB_STATE == 1
  15.                 while (DeviceState != DEVSTATE_CONFIGURED);     //等待USB完成配置
  16.         #endif
  17.        
  18.         Parm_Read();  //读取上电次数
  19.        
  20.        
  21.         Timer0_Init();                                                                        //定时器初始化
  22.         Init_595();
  23.        
  24.         while(1)
  25.         {
  26.                
  27.                 #if USB_STATE == 1               
  28.                                 if (bUsbOutReady)                                                        //如果接收到了数据
  29.                                 {
  30.                                         //USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
  31.                                        
  32.                                         usb_OUT_done();                                                        //
  33.                                 }
  34.                 #endif
  35.                                
  36.                 if (LowVolFlag == 0)  //没有低电压发生(就是正常工作的时候)
  37.                 {
  38.                         Task_Pro_Handler_Callback();                                //执行功能函数
  39.                        
  40.                         SEG_Show_U32( Test_cnt );                          //显示操作次数
  41.                 }
  42.         }
  43. }
复制代码
USB也已经屏蔽
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:42
  • 最近打卡:2025-10-15 15:37:36
已绑定手机

2

主题

271

回帖

780

积分

高级会员

积分
780
发表于 2025-9-10 10:33:30 | 显示全部楼层
数码管部分:

  1. void SEG_Show_U32(u32 num)
  2. {
  3.         u8 i;
  4.         for(i=0;i<2;i++)
  5.         {
  6.                 passward[7-i] = num%10;
  7.                 num /= 10;
  8.         }
  9. }
复制代码
也已经尽量省电,只显示2位数码管
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-10-16 06:16 , Processed in 0.160422 second(s), 92 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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