32G12K128 发表于 2025-1-23 14:14:38

第十四集 IO中断,已手敲代码,测试通过
任务1:IO中断程序,实现LED灯的亮灭
1.编译图片:

2.IO口主要代码如下:
#include "io.h"
void P3_IO_Init(void)
{   P3IM0=0X00;
      P3IM1=0X00;
      P3INTE=0X08;
}
voidP3_IO_ISR(void) interrupt 40      
{   u8 intf;
      intf=P3INTF;
      if(intf)
      {
          P3INTF=0;
                if(intf&0x08)
                {
                        P01=!P01;
                }      
            }
      P01=!P01;
}
3.学习视频:

任务2:实现按下P33口显示数字1,按下P47口显示数字2 :
1.编译图片:

2.主程序的代码:
#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;                                 
          Timer0_Init();
                Init_595();
      //INT1_Init();
      P3_IO_Init();
      P4_IO_Init();
       EA = 1;                                                                                       
       P40 = 0;
       while (DeviceState!=DEVSTATE_CONFIGURED);   
          while(1)
          {
                if (bUsbOutReady)                                                      
      {
            //USB_SendData(UsbOutBuffer,OutNumber);

            usb_OUT_done();                                                      
      }
       Task_Pro_Handler_Callback();      //执行功能函数
      passward=0;      
         }
}
void Timer0_Isr(void) interrupt 1                //1毫秒执行一次
{
    Task_Marks_Handler_Callback      ();    //系统计时

}
3.学习视频:

任务3:实现P33,P47口的I0中断 ,P47口中断优先P33口中断:
1.编译图片:

2.IO的主要程序:
#include "io.h"
void P3_IO_Init(void)
{   P3IM0=0X00;
      P3IM1=0Xff;
      P3INTE=0X08;      
}
voidP3_IO_ISR(void) interrupt 40      
{   u8 intf;
      intf=P3INTF;
      if(intf)
      {
          P3INTF=0;
                if(intf&0x08)
                {
                        passward=1;
                }      
               
      }

}
void P4_IO_Init(void)
{   P4IM0=0X00;
      P4IM1=0Xff;
      P4INTE=0X80;
      PINIPH |=(1<<4);
      PINIPL |=(1<<4);      
}
voidP4_IO_ISR(void) interrupt 41
{   u8 intf;
      intf=P4INTF;
      if(intf)
      {
          P4INTF=0;
                if(intf&0x80)
                {
                        passward=2;
                }      
      }
}
3.学习视频:







32G12K128 发表于 2025-1-24 15:23:16

第十五集 定时器做计数器,已手敲代码,测试通过。
任务1:定时器1计数的程序:
          10个脉冲中断一次,按下P35实现计数
1、编译图片:

2.主要代码:
#include "tim.h"
u32 Count_T1=0;
void TIM1_Count_Init(void)
{
         T1_CT=1;
         T1_M1=0;
         T1_M0=0;
      T1_GATE=0;
      TH1=(65536-Count_num)>>8;
      TL1=(65536-Count_num);
      P3PU |= 0x20;

      TR1=1;
      ET1=1;
      
}

void Timer1_Isr(void) interrupt 3                //1毫秒执行一次
{
Count_T1 ++;
      

}
void T1_RunTask(void)
{
      u32 count_th_t1=0;
      count_th_t1=((u16)TH1<<8)+(u16)TL1;
      count_th_t1-=65526;
      SEG7_ShowLong(Count_T1 *Count_num+count_th_t1,10);
      
}
3.学习视频

任务2:编写INT1测量低电平时间
1.编译图片:

2.主要代码:
#include "tim.h"
u32 Count_T1=0;
void Timer1_Isr(void) interrupt 3

{   static u32 count_p33 =0;
      if(P33==0)
      {count_p33++;
      }
      else      
      {
                if(count_p33>0)
               
                {
                        Count_T1=count_p33;
                }
                count_p33=0;
      }
}

void Timer1_Init(void)                //100微秒@24.000MHz
{
      AUXR &= 0xBF;                        //定时器时钟12T模式
      TMOD &= 0x0F;                        //设置定时器模式
      TL1 = 0x38;                              //设置定时初始值
      TH1 = 0xFF;                              //设置定时初始值
      TF1 = 0;                              //清除TF1标志
      TR1 = 1;                              //定时器1开始计时
      ET1 = 1;                              //使能定时器1中断
}

void T1_RunTask(void)
{
      
      SEG7_ShowString("%07.01f",((float)Count_T1)/10);
}
3.学习视频












32G12K128 发表于 2025-2-6 11:46:23

第十六集 DS18B20测温,已手敲代码,测试通过
任务1:数码管显示室温,捏住测温传感器,温度逐渐上升
1.编译截图:(晶振需要选24MHZ)

2.主要代码:
#include "18B20.h"
u8 MinusFlag=0;
u32Temp_18b20;
void Delay480us(void)      //@24.000MHz
{
      unsigned long edata i;
      _nop_();
      _nop_();
      _nop_();
      i = 2878UL;
      while (i) i--;
}
void Delay60us(void)      //@24.000MHz
{
      unsigned long edata i;
      _nop_();
      _nop_();
      _nop_();
      i = 358UL;
      while (i) i--;
}
void Delay1us(void)      //@24.000MHz
{
      unsigned long edata i;
      _nop_();
      _nop_();
      _nop_();
      i = 4UL;
      while (i) i--;
}
void DS18B20_Reset(void)
{
      u8 flag=1;
      while(flag)
      
      {
      DQ =0;
      Delay480us();
      DQ =1;
      Delay60us();
      flag=DQ;
    Delay480us();
      }
}
void DS18B20_Write_0(void)
{
      DQ =0;
      Delay60us();
      DQ =1;
      Delay1us();
      Delay1us();
}      
void DS18B20_Write_1(void)
{
      DQ =0;
      Delay1us();
      Delay1us();
      DQ =1;
      Delay60us();
}
bit DS18B20_Read(void)
{
      bit state=0;
    DQ =0;
      Delay1us();
      Delay1us();      
    DQ =1;
      Delay1us();
      Delay1us();      
      state=DQ;
      Delay60us();
      return state;
}      
void DS18B20_WriteByte( u8 dat)
{
      u8 i;
      for(i=0;i<8;i++)
      {
                if( dat& 0x01)
                {
                DS18B20_Write_1();
                        
                }
                else
      {
                DS18B20_Write_0();      
                }
                dat>>=1;
      }
}
u8 DS18B20_ReadByte( void)
{
      u8 i;
      u8 dat=0;
      for(i=0;i<8;i++)
      {
                dat>>=1;
                if( DS18B20_Read())
                {
                dat|=0x80;
                }
                else
      {
                }
               
      }
      return dat;
}
void DS18B20_ReadTemp(void)
{
      u8 TempH=0;
      u8 TempL=0;
      u16 Temp=0;
      
      DS18B20_Reset();
      DS18B20_WriteByte(0xcc);
      DS18B20_WriteByte(0x44);
      while(!DQ);
      
      DS18B20_Reset();
      DS18B20_WriteByte(0xcc);
      DS18B20_WriteByte(0xBE);
      TempL = DS18B20_ReadByte();
      TempH = DS18B20_ReadByte();
      if(TempH&0x80)
      {
                MinusFlag=1;
            Temp=(((u16)TempH<<8)|((u16)TempL<<0));
                Temp=(~Temp)+1;
                Temp_18b20=(u32)Temp*625;      
      }
      else
    {
                MinusFlag=0;
                Temp=(((u16)TempH<<8)|((u16)TempL<<0));
                Temp_18b20=(u32)Temp*625;      
      }
}
3.学习视频:










32G12K128 发表于 2025-2-14 13:53:13

第十六集 :串口的简单应用,已手敲代码,测试通过
1.发送OPEN\r\n打开数码管,数码管显示“----”
2.发送CLOSE\r\n打开数码管,数码管全部熄灭
1.编译图片:

2.主要程序代码:
#include "usart.h"
#include "io.h"
u8 Rec_Dat;//接收缓冲区
u8 Rec_Num=0;    //接收计数
bit B_TX2_Busy=0;
void Uart2_Isr(void) interrupt 8
{
      if (S2CON & 0x02)      //检测串口2发送中断
      {
                S2CON &= ~0x02;      //清除串口2发送中断请求位
                B_TX2_Busy=0;
      }
      if (S2CON & 0x01)      //检测串口2接收中断
      {
                S2CON &= ~0x01;      //清除串口2接收中断请求位
               
                //S2BUF
                Rec_Dat=S2BUF;
      }
}
void Uart2_Init(void)      //9600bps@24.000MHz
{
      
      P_SW2 |= 0x01;                                                //UART2/USART2: RxD2(P4.6), TxD2(P4.7)
      S2CON = 0x50;                //8位数据,可变波特率
      AUXR |= 0x04;                //定时器时钟1T模式
      T2L = 0x8F;                        //设置定时初始值
      T2H = 0xFD;                        //设置定时初始值
      AUXR |= 0x10;                //定时器2开始计时
      IE2 |= 0x01;                //使能串口2中断
      
      Rec_Num=0;
      B_TX2_Busy=0;
}
void Uart2_SendStr(u8 *puts)   //串口数据发送函数
{
      for(; *puts !=0;puts++)   //遇到停止符0结束
      {
                S2BUF = *puts;
                B_TX2_Busy=1;
                while(B_TX2_Busy);
      }
}
void Usart2_RunTask(void)
{
      if(Rec_Num>=6)   // 是否接收到了六位数据
      {
                if ((Rec_Dat=='\n') && (Rec_Dat=='\r'))//末尾判断
                {
                        if((Rec_Dat=='O') && (Rec_Dat=='P') && (Rec_Dat=='E') && (Rec_Dat=='N'))   
                        {
                              passward=16;
                              passward=16;
                              passward=16;
                              passward=16;
                              Uart2_SendStr("打开成功!\r\n");
                        }
                        else if((Rec_Dat=='C') && (Rec_Dat=='L') && (Rec_Dat=='O') && (Rec_Dat=='S')&& (Rec_Dat=='E'))
      {
                              passward=17;
                              passward=17;
                              passward=17;
                              passward=17;
                              Uart2_SendStr("关闭成功!\r\n");
                        }
                        Rec_Num=0;
                }
      }
}
3.学习效果图:












页: 1 [2]
查看完整版本: 《8051U深度入门到32位51大型实战教学视频》学习心路历程