找回密码
 立即注册
楼主: 32G12K128

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

[复制链接]
  • 打卡等级:偶尔看看II
  • 打卡总天数:20
  • 最近打卡:2025-04-28 16:56:43

21

主题

376

回帖

2345

积分

超级版主

积分
2345
发表于 2025-1-23 14:14:38 | 显示全部楼层
第十四集 IO中断,已手敲代码,测试通过
任务1:IO中断程序,实现LED灯的亮灭
1.编译图片:
截图202501231358548808.jpg
2.IO口主要代码如下:
#include "io.h"
void P3_IO_Init(void)
{   P3IM0=0X00;
        P3IM1=0X00;
        P3INTE=0X08;
}
void  P3_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.png
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]=0;      
           }
}
void Timer0_Isr(void) interrupt 1                //1毫秒执行一次
{
    Task_Marks_Handler_Callback        ();    //系统计时

}
3.学习视频:

任务3:实现P33,P47口的I0中断 ,P47口中断优先P33口中断:
1.编译图片:
3.png
2.IO的主要程序:
#include "io.h"
void P3_IO_Init(void)
{   P3IM0=0X00;
        P3IM1=0Xff;
        P3INTE=0X08;      
}
void  P3_IO_ISR(void) interrupt 40        
{   u8 intf;
        intf=P3INTF;
        if(intf)
        {
          P3INTF=0;
                if(intf&0x08)
                {
                        passward[0]=1;
                }        
               
        }

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

AI8051U实验箱教学视频第14集IO口中断 手敲程序.zip (163.81 KB, 下载次数: 16)





电话:0513-55012946 QQ:2195591714  微信:  19952583740
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:20
  • 最近打卡:2025-04-28 16:56:43

21

主题

376

回帖

2345

积分

超级版主

积分
2345
发表于 2025-1-24 15:23:16 | 显示全部楼层
第十五集 定时器做计数器,已手敲代码,测试通过。
任务1:定时器1计数的程序:
          10个脉冲中断一次,按下P35实现计数
1、编译图片:
截图202501241519053640.jpg
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.编译图片:
截图202501241521389775.jpg
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.学习视频

AI8051U实验箱教学视频 第15.定时器 COUNT学习手敲程序.zip (385.46 KB, 下载次数: 12)










电话:0513-55012946 QQ:2195591714  微信:  19952583740
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:20
  • 最近打卡:2025-04-28 16:56:43

21

主题

376

回帖

2345

积分

超级版主

积分
2345
发表于 2025-2-6 11:46:23 | 显示全部楼层
第十六集 DS18B20测温,已手敲代码,测试通过
任务1:数码管显示室温,捏住测温传感器,温度逐渐上升
1.编译截图:(晶振需要选24MHZ)
截图202502061139516208.jpg
2.主要代码:
#include "18B20.h"
u8 MinusFlag=0;
u32  Temp_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.学习视频:

Ai8051U实验箱教学视频 第16集 :DS18B20测温学习手敲程序.zip (216.91 KB, 下载次数: 9)








电话:0513-55012946 QQ:2195591714  微信:  19952583740
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:20
  • 最近打卡:2025-04-28 16:56:43

21

主题

376

回帖

2345

积分

超级版主

积分
2345
发表于 2025-2-14 13:53:13 | 显示全部楼层
第十六集 :串口的简单应用,已手敲代码,测试通过
1.发送OPEN\r\n打开数码管,数码管显示“----”
2.发送CLOSE\r\n打开数码管,数码管全部熄灭

1.编译图片:
截图202502141346198812.jpg
2.主要程序代码:
#include "usart.h"
#include "io.h"
u8 Rec_Dat[50];  //接收缓冲区
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[Rec_Num++]=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[Rec_Num-1]=='\n') && (Rec_Dat[Rec_Num-2]=='\r'))  //末尾判断
                {
                        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'))   
                        {
                                passward[0]=16;
                                passward[1]=16;
                                passward[2]=16;
                                passward[3]=16;
                                Uart2_SendStr("打开成功!\r\n");
                        }
                        else if((Rec_Dat[Rec_Num-7]=='C') && (Rec_Dat[Rec_Num-6]=='L') && (Rec_Dat[Rec_Num-5]=='O') && (Rec_Dat[Rec_Num-4]=='S')&& (Rec_Dat[Rec_Num-3]=='E'))
      {
                                passward[0]=17;
                                passward[1]=17;
                                passward[2]=17;
                                passward[3]=17;
                                Uart2_SendStr("关闭成功!\r\n");
                        }
                        Rec_Num=0;
                }
        }
}
3.学习效果图:
截图202502141425529920.jpg

Ai8051U实验箱教学视频 第16集 :16.串口的简单应用手敲程序.zip (233.66 KB, 下载次数: 9)









电话:0513-55012946 QQ:2195591714  微信:  19952583740
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-1 19:47 , Processed in 0.114203 second(s), 65 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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