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

学习《32位8051单片机原理及应用》课程——32G12K128-实验箱-V9.6

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:161
  • 最近打卡:2025-06-18 21:08:43

8

主题

209

回帖

981

积分

高级会员

积分
981
发表于 2024-12-22 16:48:00 | 显示全部楼层

打卡第八集:蜂鸣器的应用

image.png

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:161
  • 最近打卡:2025-06-18 21:08:43

8

主题

209

回帖

981

积分

高级会员

积分
981
发表于 2024-12-22 16:52:32 | 显示全部楼层

image.png

image.png

#ifndef __TEST_H
#define __TEST_H

#include "COMM/stc.h" //调用头文件
#include "COMM/usb.h"

#define KEY1 P32 //定义一个按键 引脚选择P32
#define KEY2 P33 //定义一个按键 引脚选择P33

#define BEEP P54 //定义一个按键 引脚选择P33

#define MAIN_Fosc 24000000UL //定义主时钟

void delay_ms(u16 ms);
void Test(void);

#endif

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:161
  • 最近打卡:2025-06-18 21:08:43

8

主题

209

回帖

981

积分

高级会员

积分
981
发表于 2024-12-22 16:54:02 | 显示全部楼层

#include "test.h"

bit Run_Flag = 0; //0-1 开关机变量
u8 Run_Mode = 0; //0-8 模式几 0:没有模式

void Test(void) //电磁炉的功能
{
if( KEY1 == 0 ) //开关机键
{
delay_ms(10);
if( KEY1 == 0 )
{
while( KEY1 == 0 ); //按钮按下,并等待按钮松开

//----------------------还没有开机的时候,执行这个开机功能---------------------
if( Run_Flag==0 ) //还没有开机
{
Run_Flag = 1; //开机变量改为1,表示已经开机了
BEEP = 0; //打开蜂鸣
delay_ms(10); //延时10ms
BEEP = 1; //关闭蜂鸣
P40 = 0; //打开led的总电源
P6 = 0X00; //点亮全部LED
delay_ms(200); //延时200ms
P6 = 0XFF; //熄灭全部LED
}
//----------------------已经开机的时候,执行这个关机功能---------------------
else
{
Run_Flag = 0;
BEEP = 0; //打开蜂鸣
delay_ms(10); //延时10ms
BEEP = 1; //关闭蜂鸣
P6 = 0XFF; //熄灭全部LED
Run_Mode = 0; //模式清0
}
}
}

if( KEY2 == 0 )
{
	delay_ms( 10 );
	if( KEY2 == 0 )
	{
		while( KEY2 == 0);		//等待松开执行了
		BEEP = 0;				//打开蜂鸣
		delay_ms(10);			//延时10ms
		BEEP = 1;				//关闭蜂鸣		
		Run_Mode ++;			//模式选择
		if( Run_Mode>8 )		//如果模式>8
			Run_Mode = 1;		//回到模式1

		//P6 =	0XFE;   P6<<1+1 
	
	
		P6 = ~(1<< (Run_Mode-1));		//1<<1      0000 0001 -> 1111 1110  
	
	}
}

}

void delay_ms(u16 ms) //unsigned int
{
u16 i;
do
{
i = MAIN_Fosc/6000;
while(--i);
}while(--ms);
}

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:161
  • 最近打卡:2025-06-18 21:08:43

8

主题

209

回帖

981

积分

高级会员

积分
981
发表于 2024-12-22 17:52:13 | 显示全部楼层

打卡第九章:数码管的静态使用

image.png

image.png

数码管的结构
image.png

如何控制

image.png

对应P6口的驱动

image.png

P6 = SEG_Tab[num]; //这个数码管输出段码

	if( KEY1 ==0 )
	{
		delay_ms(10);
		if( KEY1 ==0 )
		{
			BEEP = 0;
			delay_ms(10);
			BEEP = 1;
			while( KEY1 ==0 );
			if( num<9 )
			{
				num++;
			}
		}
	}
	if( KEY2 ==0 )
	{
		delay_ms(10);
		if( KEY2 ==0 )
		{
			BEEP = 0;
			delay_ms(10);
			BEEP = 1;		
			while( KEY2 ==0 );
			if( num>0 )
				num--;
		}
	}
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:161
  • 最近打卡:2025-06-18 21:08:43

8

主题

209

回帖

981

积分

高级会员

积分
981
发表于 2024-12-22 17:59:57 | 显示全部楼层

打卡第十章:数码管的动态显示

image.png

image.png

image.png

void SEG_Fre( void )
{
//位码选择第一位,段码选择0
P7 = COM_Tab[num]; //位码的选择
P6 = SEG_Tab[Show_Tab[num]];//需要显示的数字的内码 赋给 P6 NUM =0 -> Show_Tab[num]] = 1 -> p6 = oxF9
delay_ms(SEG_Delay);

num++;
if( num >7 )
	num = 0;

}

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:161
  • 最近打卡:2025-06-18 21:08:43

8

主题

209

回帖

981

积分

高级会员

积分
981
发表于 2024-12-22 18:10:36 | 显示全部楼层

打卡第十一章:定时器的使用

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

#include "COMM/stc.h" //调用头文件
#include "COMM/usb.h"

#define KEY1 P32 //定义一个按键 引脚选择P32
#define KEY2 P33 //定义一个按键 引脚选择P33

#define BEEP P54 //定义一个按键 引脚选择P54

#define SEG_Delay 1 //延时多少ms

#define MAIN_Fosc 24000000UL //定义主时钟

char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";

u8 SEG_Tab[20] = { 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, 0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //0-9段码,0-9带小数点
u8 COM_Tab[8] = { 0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe }; //0-7的位码数组
u8 Show_Tab[8] = {3,0,0,0,0,10,0,0};

u32 TimCount = 0; //计数单位1ms
bit RUN_State = 0; //开始运行/结束运行
u8 num = 0;

void sys_init(); //函数声明
void delay_ms(u16 ms); //unsigned int

void SEG_Fre( void )
{
//位码选择第一位,段码选择0
P7 = COM_Tab[num]; //位码的选择
P6 = SEG_Tab[Show_Tab[num]];//需要显示的数字的内码 赋给 P6 NUM =0 -> Show_Tab[num]] = 1 -> p6 = oxF9
//delay_ms(SEG_Delay);

num++;
if( num >7 )
	num = 0;

}

void Timer0_Init(void) //1毫秒@24.000MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x30; //设置定时初始值
TH0 = 0xF8; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
}

void main() //程序开始运行的入口
{

sys_init();				//USB功能+IO口初始化
usb_init();				//usb库初始化

Timer0_Init();

EA = 1;					//CPU开放中断,打开总中断。

while(1)		//死循环
{
	if( DeviceState != DEVSTATE_CONFIGURED ) 	//
		continue;
	if( bUsbOutReady )							
	{
		usb_OUT_done();

	}

//------------------------------------------------P32按下一次,灯往右边边移动一个单位 -----------------------------------------------
Show_Tab[0] = 1; //选择 1
Show_Tab[1] = 10; //选择 0.
Show_Tab[2] = 0; //选择 0
Show_Tab[3] = 0; //选择 0

	if( KEY1 ==0 )
	{
		delay_ms(10);
		if( KEY1 ==0 )
		{
			BEEP = 0;
			delay_ms(10);
			BEEP = 1;
			while( KEY1 ==0 );

			if( RUN_State==0 )
				TimCount = 0;
		
			RUN_State = !RUN_State;
		}
	}	

}

}

void Timer0_Isr(void) interrupt 1
{
SEG_Fre(); //数码管刷新的

if( RUN_State==1 )		//如果开始运行
{
	TimCount++;			//每隔1ms+1
	Show_Tab[4] = TimCount/10000%10;
	Show_Tab[5] = TimCount/1000%10+10;
	Show_Tab[6] = TimCount/100%10;	
	Show_Tab[7] = TimCount/10%10;		//取10位 
}

}

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:161
  • 最近打卡:2025-06-18 21:08:43

8

主题

209

回帖

981

积分

高级会员

积分
981
发表于 2024-12-22 18:23:21 | 显示全部楼层

打卡第十二章:计数器的使用

image.png

image.png

image.png

image.png

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:161
  • 最近打卡:2025-06-18 21:08:43

8

主题

209

回帖

981

积分

高级会员

积分
981
发表于 2024-12-22 18:30:33 | 显示全部楼层

void main() //程序开始运行的入口
{

sys_init();				//USB功能+IO口初始化
usb_init();				//usb库初始化

TMOD = 0x40;			//设置计数器模式
TL1 = 0xFF;				//设置计数初始值
TH1 = 0xFF;				//设置计数初始值
TF1 = 0;				//清除TF1标志
TR1 = 1;				//定时器1开始计时
ET1 = 1;				//使能定时器1中断
  
P3PU = 0x20; 			//打开内部上拉4.1K

P40 = 0;				//led的电源控制三极管打开

EA = 1;					//CPU开放中断,打开总中断。

while(1)		//死循环
{
	if( DeviceState != DEVSTATE_CONFIGURED ) 	//
		continue;
	if( bUsbOutReady )							
	{
		usb_OUT_done();

	}



}

}

void Timer0_Isr(void) interrupt 3
{
P60 = !P60; //led取反
}

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:161
  • 最近打卡:2025-06-18 21:08:43

8

主题

209

回帖

981

积分

高级会员

积分
981
发表于 2024-12-22 18:43:23 | 显示全部楼层

打卡第十三章:简易多任务处理

模块化梳理了LED灯、按键、嗡鸣器、定时器使用的细节

#include "COMM/stc.h" //调用头文件
#include "COMM/usb.h"
#include "seg_led.h"
#include "key.h"
#include "beep.h"
#include "tim0.h"

#define MAIN_Fosc 24000000UL //定义主时钟

char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";

bit TIM_10MS_Flag; //10ms的标志位

void sys_init(); //函数声明
void delay_ms(u16 ms); //unsigned int

void main() //程序开始运行的入口
{
sys_init(); //USB功能+IO口初始化
usb_init(); //usb库初始化

Timer0_Init();
EA = 1;					//CPU开放中断,打开总中断。

SEG0 = 0;
SEG1 = 1;
SEG2 = 2;
SEG3 = 3;
SEG4 = 4;
SEG5 = 5;
SEG6 = 6;
SEG7 = 7;

LED = 0xff;

while(1)		//死循环
{
	if( DeviceState != DEVSTATE_CONFIGURED ) 	//
		continue;
	if( bUsbOutReady )					
	{
		usb_OUT_done();
	}

	if( TIM_10MS_Flag==1 )									//如果10ms到了
	{
		TIM_10MS_Flag = 0;									//清空标志位
		KEY_Deal();											//按键处理
		BEEP_RUN();											//蜂鸣运行

		if( KEY_ReadState( KEY1 ) == KEY_PRESS )			//判断K1按钮是否单击
		{
			BEEP_ON(2);										//蜂鸣50ms
			LED0 = 0;										//点亮LED0
		}
		else if( KEY_ReadState( KEY1 ) == KEY_LONGPRESS )	//判断K1按钮是否长按
		{
			LED1 = 0;										//点亮LED1
		}
		else if( KEY_ReadState( KEY1 ) == KEY_RELAX )		//判断K1按钮是否松开
		{
			BEEP_ON(2);										//蜂鸣50ms
			LED = 0xff;										//led全部熄灭
		}

		if( KEY_ReadState( KEY2 ) == KEY_PRESS )			//判断K2按钮是否单击
		{

		}
	}
}

}

void Timer0_Isr(void) interrupt 1
{
static timcount = 0;

SEG_LED_Show();			//数码管刷新的

timcount++;				//1ms+1
if( timcount>=10 )		//如果这个变量大于等于10,10ms计数到达
{
	timcount = 0;
	TIM_10MS_Flag = 1;	//10ms时间到了
}

}

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:161
  • 最近打卡:2025-06-18 21:08:43

8

主题

209

回帖

981

积分

高级会员

积分
981
发表于 2024-12-22 18:57:57 | 显示全部楼层

打卡第十四章:矩阵按键

image.png

image.png

image.png

image.png

image.png

image.png

#include "COMM/stc.h" //调用头文件
#include "COMM/usb.h"
#include "seg_led.h"
#include "key.h"
#include "beep.h"
#include "tim0.h"

#define MAIN_Fosc 24000000UL //定义主时钟

char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";

bit TIM_10MS_Flag; //10ms的标志位

void sys_init(); //函数声明
void delay_ms(u16 ms); //unsigned int

void main() //程序开始运行的入口
{
u8 KEY_NUM = 0; //保存矩阵按键的键码
u8 KEY_Str = 0; //表示当前输入了几个密码位

sys_init();				//USB功能+IO口初始化
usb_init();				//usb库初始化

Timer0_Init();
EA = 1;					//CPU开放中断,打开总中断。


LED = 0xff;				//初始状态熄灭所有LED

while(1)		//死循环
{
	if( DeviceState != DEVSTATE_CONFIGURED ) 	//
		continue;
	if( bUsbOutReady )			
	{
		usb_OUT_done();
	}

	if( TIM_10MS_Flag==1 )									//如果10ms到了
	{
		TIM_10MS_Flag = 0;									//清空标志位

		KEY_NUM = MateixKEY_Read();							//当前矩阵按键的键值
		if( KEY_NUM>0 )										//如果有按键拿下
		{
			BEEP_ON(2);										//蜂鸣20ms
			Show_Tab[KEY_Str] = KEY_NUM;					//将当前的按键的键值保存到数码管显示变量里
			KEY_Str ++;										//s输入的密码位数+1

			if( KEY_Str == 8 )								//如果密码已经输到了8位
			{
				KEY_Str = 0;								//清空当前密码的位数
				//for 
				if((Show_Tab[0]==1)&&(Show_Tab[1]==1)&&(Show_Tab[2]==1)&&(Show_Tab[3]==1)&&(Show_Tab[4]==1)&&(Show_Tab[5]==1)&&(Show_Tab[6]==1)&&(Show_Tab[7]==1))	//如果密码正确
				{
					LED0  = 0;								//点亮LED0
				}
				else
				{
					BEEP_ON(200);							//密码错误,蜂鸣2秒
				}
				SEG0 = SEG1 = SEG2 = SEG3 = SEG4 = SEG5 =SEG6 = SEG7 = 21; 	//将所有的数码管显示位 - 
			}
			KEY_NUM = 0;									//清空按键键值
		}

	}
}

}

void Timer0_Isr(void) interrupt 1
{
static timcount = 0;

SEG_LED_Show();			//数码管刷新的

timcount++;				//1ms+1
if( timcount>=10 )		//如果这个变量大于等于10,10ms计数到达
{
	timcount = 0;
	TIM_10MS_Flag = 1;	//10ms时间到了
}

}

void sys_init() //函数定义
{
WTST = 0; //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
EAXFR = 1; //扩展寄存器(XFR)访问使能
CKCON = 0; //提高访问XRAM速度

P0M1 = 0x00;   P0M0 = 0x00;   //设置为准双向口
P1M1 = 0x00;   P1M0 = 0x00;   //设置为准双向口
P2M1 = 0x00;   P2M0 = 0x00;   //设置为准双向口
P3M1 = 0x00;   P3M0 = 0x00;   //设置为准双向口
P4M1 = 0x00;   P4M0 = 0x00;   //设置为准双向口
P5M1 = 0x00;   P5M0 = 0x00;   //设置为准双向口
P6M1 = 0x00;   P6M0 = 0x00;   //设置为准双向口
P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口

P3M0 = 0x00;
P3M1 = 0x00;

P3M0 &= ~0x03;
P3M1 |= 0x03;

//设置USB使用的时钟源
IRC48MCR = 0x80;    //使能内部48M高速IRC
while (!(IRC48MCR & 0x01));  //等待时钟稳定

USBCLK = 0x00;	//使用CDC功能需要使用这两行,HID功能禁用这两行。
USBCON = 0x90;

}

void delay_ms(u16 ms) //unsigned int
{
u16 i;
do
{
i = MAIN_Fosc/6000;
while(--i);
}while(--ms);
}

回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-6-18 21:17 , Processed in 0.155181 second(s), 102 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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