当前位置 : 主页 > 编程语言 > c语言 >

学习报告

来源:互联网 收集:自由互联 发布时间:2023-09-06
自从开始学习单片机,就跟着学长的指导,看江协科技的网课学。可以说是没走弯路。 博主的教学让单片机的学习并不深奥。在前几章节中,只要紧跟视频中老师的节奏。就没有什么不

自从开始学习单片机,就跟着学长的指导,看江协科技的网课学。可以说是没走弯路。

博主的教学让单片机的学习并不深奥。在前几章节中,只要紧跟视频中老师的节奏。就没有什么不理解的内容。但直到学到定时器这一块,的确是要比延时函数用起来方便得多,不会遇到卡在某一阶段的情况。但在看视频过程中,弹幕的叫难的确有令我感到恐慌。在第一次观看视频中,我对于定时器的配置还算理解,但直到后面搭配中断函数使用时便叫我犯了难。

后面,我听从博主的建议,先去看了一遍参考手册,对知识点做了一些整理和记录,再次观看视频的时候就又加深了理解。最后请教了一下学长,才知道尽量不要在中断函数里面写控制函数。可以在主程序里面引用中断,加一个if判断。

if (delay_500ms_flag == 1)
		  {
			delay_500ms_flag = 0;
			if(LEDMode==1)
				P2=_crol_(P2,1);
			if(LEDMode==2)
				P2=_cror_(P2,2);

之后就开始接触到了,小车模型。首先让小车转动起来。在B站上搜了很多关于L289N芯片的介绍,并且学习芯片与电机、单片机的连线方法。光是接线就耗费了大半个星期的时间。最后将线连接好,就可以开始学习编写程序。

最开始让小车简单行驶,先定义管脚位点,在电机的两个引脚上,分别接一个高电平、一个低电平,形成一个电流,从而使电机转动。控制两个引脚的高低电频变化,可以使轮子进行正转和倒转。

sbit IN11=P0^5;//左
sbit IN12=P0^6;

sbit IN21=P2^6;//右
sbit IN22=P2^7;
void car_go()
{
	IN11=0;
	IN12=1;
	IN21=0;
	IN22=1;
}

后面就可以学习PWM控制小车的运动速度,进而能实现小车的转弯。PWM(脉冲宽度调制)就是改变脉冲宽度来实现不同的效果。首先要了解一个概念"占空比",占空比是指高电平的时间占整个周期的比例。PWM重要参数:频率=1/Ts,占空比=Ton(高电平在一个周期内所占的时间)/Ts(周期)。定频调速是在脉冲波形的频率不变的前提下(脉冲波形的周期不变),通过改变一个周期波形中高电平的时间从而改变波形的占空比,从而改变平均电压,调整电机的转速。在标准51单片机中没有专门的PWM模块,所以用定时器加中断的方式来产生PWM。

#include <REGX52.H>
sbit IN11=P0^5;//左
sbit IN12=P0^6;

sbit IN21=P2^6;//右
sbit IN22=P2^7;

sbit EN1A=P0^1;//定义引脚位点
sbit EN1B=P0^2;
sbit EN2A=P2^3;
sbit EN2B=P2^4;


unsigned char counter,compare;

void car_go()
{
	IN11=0;
	IN12=1;
	IN21=0;
	IN22=1;
}

void Timer0_Init(void)		//1毫秒@12.000MHz
{
	TMOD &= 0xF0;			//设置定时器模式
	TMOD |= 0x01;			//设置定时器模式
	TL0 = 0x18;				//设置定时初始值
	TH0 = 0xFC;				//设置定时初始值
	TF0 = 0;				//清除TF0标志
	TR0 = 1;				//定时器0开始计时
	ET0=1;
	EA=1;
	PT0=0;
	
}
void main()
{
	Timer0_Init();
	while(1)
	{
		car_go();
	}

}

void Timer0_Routine() interrupt 1
{
//	 static unsigned int T0Count;
	TL0 = 0x18;				//设置定时初始值
	TH0 = 0xFC;		//设置定时初始值
	compare=30;
	counter++;
	if(counter>=100)
	{
		counter=0;
	}
	if(counter<compare)
	{
		EN1A=1;
		EN1B=1;
		EN2A=1;
		EN2B=1;
	}
	else
	{
		EN1A=0;
		EN1B=0;
		EN2A=0;
		EN2B=0;
	}
}

在PWM调速后面,还有超声波测距避障模块、红外寻迹模块、舵机控制、蓝牙控制等。

在最近的一个C语言作业里,有一个十六进制转八进制的作业,困扰了我很久。我试着先将十六进制转十进制,再将十进制转为八进制,以十进制作为中间媒介。我单独将十六进制转十进制代码写出来,用FFFF来测试可以发现结果是正确的,然后再单独把十转八进制代码写出来。最后将他们两个结合起来,最后虽然可以运行起来,但是输入以数字加字母形式的十六进制数,得到的结果并不正确。我当时看了好久都没有发现是哪里有问题,最后发现在每次循环取数的时候,循环里的变量没有初始化,第二次循环的时候,应用的是第一次循环接着的数,因此我得到的结果总是偏大。最后我还发现可以直接输入十六进制(%x)数据类型,然后输出八进制(%o)数据类型。


学习报告_十六进制

最后在写作业的过程中发现C语言的知识还不够巩固,要适当的温习一下。

那么这两个月的学习总结就到这里。

上一篇:【C语言】分支与循环
下一篇:没有了
网友评论