wuzhengmin 发表于 2025-8-22 12:10:48

外部中断x:x=2-4触发只有下降沿,触发后它就会标记为这个INTxIF的一个标志位,如果说我们打开了EX2和EX3,优先级位最低,不能改中断优先级外部中断x:x=2-4INTxIFEXn
EA

wuzhengmin 发表于 2025-8-22 12:38:05

下面看外部中断1的例子:外部中断1:IT1IE1EX1EAIE1:外部中断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.3INT1 中断(上升沿和下降沿),可同时支持上升沿和下降沿
设置还是3步:
IT1=1;   //使能INT1 下降沿中断EX1=1;//使能INT1 中断
EA=1;//打开总中断
对应中断函数中断号是2
void INT1_Isr() interrupt 2{
}

wuzhengmin 发表于 2025-8-22 12:46:15

各个中断服务函数对应的中断号,见下图:
试验箱上默认端口是高电平,按下就是低电平!

wuzhengmin 发表于 2025-8-22 13:24:04

任务1:编写外部中断1的程序

void INT1_Init(void) //INT1中断(上升沿和下降沿)P33按下,0可同时支持上升沿和下降沿
{
        IT1 = 1;                        //下降沿中断,0是上升沿和下降沿都可以
        EX1 = 1;                        //打开中断允许
        EA = 1;                                //打开总中断
}

void INT_ISR(void) interrupt 2//INT1中断(上升沿和下降沿)P33按下,可同时支持上升沿和下降沿
{
        P04 = !P04;
        P05 = !P05;
        P06 = !P06;
        P07 = !P07;
       
        //P33按下,P01就取反
}当然,首先要在main.c里初始化:


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




wuzhengmin 发表于 2025-8-26 10:44:33


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

    今天我们先跳到串口:
串口是最常用,最基本的通讯方法,我们从STC89C51开始就经常用,先看看这段代码:
//1.发送OPEN\r\n打开数码管,数码管显示“- - - -” 11 22 OPEN\r\n
//2.发送CLOSE\r\n打开数码管,数码管全部熄灭
//3.再打开的情况下,串口发送DAT+123\r\n,数码管显示数值“123”

void Usart2_RunTask(void)
{
      if( Rec_Num >= 6 )                //是否接收到了6位以上的数据
      {
            if(( Rec_Dat == '\n' ) && ( Rec_Dat == '\r' ) )        //末尾判断
            {
                  if( ( Rec_Dat == 'O' ) && ( Rec_Dat == 'P' ) && ( Rec_Dat == 'E' ) && ( Rec_Dat == 'N' ))
                  {                                 }
                                                               
                               
                              if( ( Rec_Dat == 'D' ) && ( Rec_Dat == 'A' ) &&( Rec_Dat == 'T' ) && ( Rec_Dat == '+' ) && ( Rec_Dat == '1' ) && ( Rec_Dat == '2' ) && ( Rec_Dat == '3' ))
                              {
                               passward = 8;
                               passward = 8;
                               passward = 8;
                               passward = 8;
                               Uart2_SendStr( "DAT+123!\r\n" );
                              }

                }
               Rec_Num = 0;
          }
   }
}





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

wuzhengmin 发表于 2025-8-26 10:46:34

我们故意多回复一个!给PC,表面收到的是“DAT+123\r\n”

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

wuzhengmin 发表于 2025-8-26 11:17:26

这里其实要理解结束符“\r\n”


仔细看下图:


wuzhengmin 发表于 2025-9-10 10:24:07

第二十二集 比较器

最近一直追赶,没有写体会,这半个月一直在研究比较器,跟着冲哥写了程序:
但是下载后发现,没有写入按键次数,感觉应该是不够电............
先看一下中断函数:
/******************* 比较器中断函数 ********************/
void CMP_Isr() interrupt 21
{


       
    CMPIF = 0;          //清中断标志
    P42 = CMPRES;       //中断方式读取比较器比较结果
   
    if(CMPRES)
    {
      if(LowVolFlag)
      {
            LowVolFlag = 0;    //清除低电压标志
            if(Test_cnt != Temp_cnt)
            {
                EEPROM_read_n(EE_ADDRESS,tmp,2);      //读出2字节
                Test_cnt = ((u16)tmp << 8) + tmp; //秒计数
                if(Test_cnt > 10000)    Test_cnt = 0;   //秒计数范围为0~10000
                Temp_cnt = Test_cnt;
                                EEPROM_SectorErase(EE_ADDRESS); //擦除扇区
                               
            }
      }
    }
    else
    {
      
/*下面8行关闭数码管
                HC595_SER = 0;
      for(i=0; i<16; i++)   //先关闭显示,省电
      {
            HC595_SCK = 1;
            HC595_SCK = 0;
      }
               
      HC595_RCK = 1;
      HC595_RCK = 0;       //锁存输出数据
*/               
                Display_Seg(0,0);//实际这个函数入口参数直接写0,就是上面8行关闭数码管
               
               

      if(!LowVolFlag)
      {
            LowVolFlag = 1;    //设置低电压标志
            if(Test_cnt != Temp_cnt)
            {
                Temp_cnt = Test_cnt;
               
                tmp = (u8)(Temp_cnt >> 8);
                tmp = (u8)Temp_cnt;
                EEPROM_write_n(EE_ADDRESS,tmp,2);
            }
      }
    }
}

也没发现哪里有问题啊?

wuzhengmin 发表于 2025-9-10 10:31:06

EEPROM_write_n(EE_ADDRESS,tmp,2);
为什么没有执行?当然硬件上220uf 的电容首先要工作正常,但是主要问题可能还是在程序,看看主程序:
void main(void)
{
        Sys_init();                //系统初始化
       
        #if USB_STATE == 1
                usb_init();                                     //USB CDC 接口配置
                IE2 |= 0x80;                                    //使能USB中断
        #endif
       
        CMP_config();
       
    EA = 1;                                                                                        //IE |= 0X80;
       
        #if USB_STATE == 1
                while (DeviceState != DEVSTATE_CONFIGURED);   //等待USB完成配置
        #endif
       
        Parm_Read();//读取上电次数
       
       
        Timer0_Init();                                                                        //定时器初始化
        Init_595();
       
        while(1)
        {
               
                #if USB_STATE == 1               
                                if (bUsbOutReady)                                                        //如果接收到了数据
                                {
                                        //USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
                                       
                                        usb_OUT_done();                                                        //
                                }
                #endif
                               
                if (LowVolFlag == 0)//没有低电压发生(就是正常工作的时候)
                {
                        Task_Pro_Handler_Callback();                                //执行功能函数
                       
                        SEG_Show_U32( Test_cnt );                        //显示操作次数
                }
        }
}

USB也已经屏蔽

wuzhengmin 发表于 2025-9-10 10:33:30

数码管部分:

void SEG_Show_U32(u32 num)
{
        u8 i;
        for(i=0;i<2;i++)
        {
                passward = num%10;
                num /= 10;
        }
}
也已经尽量省电,只显示2位数码管
页: 7 8 9 10 11 12 13 14 15 16 [17] 18 19 20 21 22 23 24 25 26
查看完整版本: 第一次:环境的创立 | 送实验箱