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

Ai8051U 实验箱 学习开始打卡

[复制链接]
  • 打卡等级:常住居民II
  • 打卡总天数:85
  • 最近打卡:2025-03-06 07:45:38

7

主题

49

回帖

534

积分

高级会员

积分
534
发表于 2025-1-25 15:03:45 | 显示全部楼层

第十四集 IO中断(所有普通IO都支持的“外部中断”)

void IO_ISR_Init(void){P4IM0=0X00;       //下降沿触发,想让P几作为io中断就配置P几
P4IM1=0X00;P4INTE=0X02;   //打开总中断0010,配置p41作为io中断}void P4_IO_ISR(void) interrupt 41
{
u8 intf;
intf=P4INTF;if(intf)
{
P4INTF=0;
	if(intf&0x02){

		P20=!P20;
	}

}
if(intf)
{
P4INTF=0;
	if(intf&0x02){

		P20=!P20;
	}

}
}

2.设置中断优先级

配置:PINIPL和PINIPH寄存器可设置中断优先级

微信截图_20250125150820.png

在中断初始化中增加:

PINIPL |= (1<<4);
PINIPH |= (1<<4);

upload 附件:demo.rar

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:85
  • 最近打卡:2025-03-06 07:45:38

7

主题

49

回帖

534

积分

高级会员

积分
534
发表于 2025-1-25 15:12:45 | 显示全部楼层

第十四集 IO中断 课后小练习 多路抢答器

微信截图_20250125151148.png

由于手头上暂时只有擎天柱,就用擎天柱上的P41-P43模拟三个抢答按键,序号为1,2,3,用虚拟数码管最左边一位显示抢答的序号,用外部中断1重置

代码如下:

u8 nu;void INT1_Init (void){
IT1=1;    //下降沿中断
EX1=1;     //打开中断允许
EA =1;     //打开总中断}void INT_ISR(void) interrupt 2
{
nu=0;
P4INTE=0X0E;   //打开总中断1110,P41,p42,p43}void IO_ISR_Init(void){P4IM0=0X00;       //下降沿触发
P4IM1=0X00;P4INTE=0X0E;   //打开总中断1110,P41,p42,p43}void P4_IO_ISR(void) interrupt 41
{
u8 intf;
intf=P4INTF;if(intf)
{
P4INTF=0;
	if(intf&0x02){

		nu=1;
		P4INTE=0X00;
	}
	if(intf&0x04){

		nu=2;
		P4INTE=0X00;
	}
	if(intf&0x08){

		nu=3;
		P4INTE=0X00;
	}
}
if(intf)
{
P4INTF=0;
	if(intf&0x02){

		nu=1;
		P4INTE=0X00;
	}
	if(intf&0x04){

		nu=2;
		P4INTE=0X00;
	}
	if(intf&0x08){

		nu=3;
		P4INTE=0X00;
	}
}
}void SEG_PC(void){u8 cod[8];
cod[0] = SEG_NUM[nu];     //小时的十位
cod[1] = SEG_NUM[16];
cod[2] = SEG_NUM[16];
cod[3] = SEG_NUM[16];
cod[4] = SEG_NUM[16];
cod[5] = SEG_NUM[16];
cod[6] = SEG_NUM[16];
cod[7] = SEG_NUM[16];
SEG7_ShowCode(cod);
}

upload 附件:demo.rar

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:85
  • 最近打卡:2025-03-06 07:45:38

7

主题

49

回帖

534

积分

高级会员

积分
534
发表于 2025-1-25 17:24:43 | 显示全部楼层

第十五集 定时器做计数器

任务1:编写定时器1计数的的程序
(为了方便计数,10个脉冲中断一次)


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;  //P35为time1计数的输入端口,设置为上拉



	TR1=1;
	ET1=1;
}


void Timer1_Isr(void) interrupt 3	
{
  
	Count_T1++;    ///T1引脚检测到10个脉冲就溢出一次
   
}



void T1_RunTask(void){

	u32 count_th_tl=0;
	count_th_tl=(u16)(TH1<<8)+(u16)(TL1);
	count_th_tl=count_th_tl-65526;
SEG7_ShowLong(Count_T1*Count_num+count_th_tl, 10);


}

upload 附件:demo.rar

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:85
  • 最近打卡:2025-03-06 07:45:38

7

主题

49

回帖

534

积分

高级会员

积分
534
发表于 2025-1-26 00:47:12 | 显示全部楼层

第十五集 定时器做计数器——课后小练

微信截图_20250126002003.png

1.使用定时器0每1ms对计时变量加1

extern u32 current_time;

void Timer0_Isr(void) interrupt 1 //1MS执行一次
{

current_time++;
Task_Marks_Handler_Callback(); //系统计时

}

2.判断P33按下,并计算两个按键之间的间隔

upload 附件:demo.rar

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:85
  • 最近打卡:2025-03-06 07:45:38

7

主题

49

回帖

534

积分

高级会员

积分
534
发表于 2025-2-1 11:23:42 | 显示全部楼层

第十六集 DS18B20测温

本集讲了ds18b20的c文件和.h文件,最终获取ds18b20的温度值。

upload 附件:18b20.hupload 附件:18b20.h

代码就在上边。

image.png

步骤如上

upload 附件:DS18B20.rar

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:85
  • 最近打卡:2025-03-06 07:45:38

7

主题

49

回帖

534

积分

高级会员

积分
534
发表于 2025-2-1 11:38:58 | 显示全部楼层

第十六集 DS18B20测温 课后小练

微信截图_20250201113839.png

虽然课后小练用的是之前学过的知识,但是还是踩了不少坑才完成。

注意事项:

1.main函数中需要把USB相关的中断关掉,不然会一直唤醒。

2.用普通io中断可以唤醒睡眠模式,睡眠模式用PD=1实现;用矩阵键盘的按键作为普通按键,需要将P06或P07设置额为低电平,然后检测P00-P04的按键,我用P01作为开机,P02作为温度切换按键。



void P0_IO_Init(void)
{
P0IM0 = 0X00;		//IO中断模式设置为了下降沿
P0IM1 = 0X00;P0INTE= 0Xff;		//打开中断
//P0INTE = 0x02;  
                                                          //使能P01中断功能

P0WKUE = 0x02;
P0INTE= 0Xff;		//打开中断
//P0INTE = 0x02;  
                                                          //使能P01中断功能

P0WKUE = 0x02;
//  PINIPH  |= (1<<1);	//写入最高优先级
//	PINIPL  |= (1<<1);
}void P0_IO_ISR(void)	interrupt 37
{
u8 intf;intf = P0INTF;

if( intf )			//判断也没有IO触发了中断
{
	P0INTF = 0;

	if( intf & 0x02 )//判断是否是P01按钮按下
	{
		run_state=!run_state;
		ms1_flag2=0;
		ms1_flag=0;
	}
	if( intf & 0x04 )//判断是否是P02按钮按下
	{
		stat_C=!stat_C;
		ms1_flag2=0;
	}
}
intf = P0INTF;

if( intf )			//判断也没有IO触发了中断
{
	P0INTF = 0;

	if( intf & 0x02 )//判断是否是P01按钮按下
	{
		run_state=!run_state;
		ms1_flag2=0;
		ms1_flag=0;
	}
	if( intf & 0x04 )//判断是否是P02按钮按下
	{
		stat_C=!stat_C;
		ms1_flag2=0;
	}
}
}

upload 附件:demo.rar

回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-5 09:05 , Processed in 0.131684 second(s), 83 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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