嵌入式51实验程序2

13.实验名称:直流电机实验

接线说明:

实验现象:下载程序后,直流电机旋转5S后停止

注意事项:将直流电机两根线分别连接到“步进电机模块”输出端子J47的5V和O1上。   

*******************************************************************************

#include "reg52.h"

 

typedef unsigned int u16; //对系统默认数据类型进行重定义

typedef unsigned char u8;

 

//定义直流电机控制管脚

sbit DC_Motor=P1^0;

 

#define DC_MOTOR_RUN_TIME 5000 //定义直流电机运行时间为5000ms

 

/******************************************************************************

* 函 数 名       : delay_ms

* 函数功能  : ms延时函数,ms=1时,大约延时1ms

* 输    入       : ms:ms延时时间

* 输    出      : 无

*******************************************************************************/

void delay_ms(u16 ms)

{

u16 i,j;

for(i=ms;i>0;i--)

for(j=110;j>0;j--);

}

/******************************************************************************

* 函 数 名       : main

* 函数功能  : 主函数

* 输    入       : 无

* 输    出      : 无

*******************************************************************************/

void main()

{

DC_Motor=1;//开启电机

delay_ms(DC_MOTOR_RUN_TIME);

DC_Motor=0;//关闭电机

while(1)

{

 

}

}

14.实验名称:步进电机实验

接线说明:

实验现象:下载程序后,当按下KEY1键可调节电机旋转方向;当按下KEY2键,电机加速;

  当按下KEY3键,电机减速

注意事项:将步进电机红色线对接到“步进电机模块”输出端子J47的5V上,其它相序依次接入。   

***************************************************************************************/

#include "reg52.h"

 

typedef unsigned int u16; //对系统默认数据类型进行重定义

typedef unsigned char u8;

 

//定义ULN2003控制步进电机管脚

sbit IN1_A=P1^0;

sbit IN2_B=P1^1;

sbit IN3_C=P1^2;

sbit IN4_D=P1^3;

 

//定义独立按键控制脚

sbit KEY1=P3^1;

sbit KEY2=P3^0;

sbit KEY3=P3^2;

sbit KEY4=P3^3;

 

//使用宏定义独立按键按下的键值

#define KEY1_PRESS 1

#define KEY2_PRESS 2

#define KEY3_PRESS 3

#define KEY4_PRESS 4

#define KEY_UNPRESS 0

 

// 定义步进电机速度,值越小,速度越快

// 最小不能小于1

#define STEPMOTOR_MAXSPEED        1  

#define STEPMOTOR_MINSPEED        5  

 

 

/*******************************************************************************

* 函 数 名       : delay_10us

* 函数功能  : 延时函数,ten_us=1时,大约延时10us

* 输    入       : ten_us

* 输    出      : 无

*******************************************************************************/

void delay_10us(u16 ten_us)

{

while(ten_us--);

}

/******************************************************************************

* 函 数 名       : delay_ms

* 函数功能  : ms延时函数,ms=1时,大约延时1ms

* 输    入       : ten_us

* 输    出      : 无

*******************************************************************************/

void delay_ms(u16 ms)

{

u16 i,j;

for(i=ms;i>0;i--)

for(j=110;j>0;j--);

}

/******************************************************************************

* 函 数 名       : step_motor_28BYJ48_send_pulse

* 函数功能  : 输出一个数据给ULN2003从而实现向步进电机发送一个脉冲

* 输    入       : step:指定步进序号,可选值0~7

   dir:方向选择,1:顺时针,0:逆时针

* 输    出      : 无

*******************************************************************************/

void step_motor_28BYJ48_send_pulse(u8 step,u8 dir)

{

u8 temp=step;

 

if(dir==0) //如果为逆时针旋转

temp=7-step;//调换节拍信号

switch(temp)//8个节拍控制:A->AB->B->BC->C->CD->D->DA

{

case 0: IN1_A=1;IN2_B=0;IN3_C=0;IN4_D=0;break;

case 1: IN1_A=1;IN2_B=1;IN3_C=0;IN4_D=0;break;

case 2: IN1_A=0;IN2_B=1;IN3_C=0;IN4_D=0;break;

case 3: IN1_A=0;IN2_B=1;IN3_C=1;IN4_D=0;break;

case 4: IN1_A=0;IN2_B=0;IN3_C=1;IN4_D=0;break;

case 5: IN1_A=0;IN2_B=0;IN3_C=1;IN4_D=1;break;

case 6: IN1_A=0;IN2_B=0;IN3_C=0;IN4_D=1;break;

case 7: IN1_A=1;IN2_B=0;IN3_C=0;IN4_D=1;break;

default: IN1_A=0;IN2_B=0;IN3_C=0;IN4_D=0;break;//停止相序

}

}

/******************************************************************************

* 函 数 名       : key_scan

* 函数功能  : 检测独立按键是否按下,按下则返回对应键值

* 输    入       : mode=0:单次扫描按键

   mode=1:连续扫描按键

* 输    出      : KEY1_PRESS:K1按下

   KEY2_PRESS:K2按下

   KEY3_PRESS:K3按下

   KEY4_PRESS:K4按下

   KEY_UNPRESS:未有按键按下

*******************************************************************************/

u8 key_scan(u8 mode)

{

static u8 key=1;

 

if(mode)key=1;//连续扫描按键

if(key==1&&(KEY1==0||KEY2==0||KEY3==0||KEY4==0))//任意按键按下

{

delay_10us(1000);//消抖

key=0;

if(KEY1==0)

return KEY1_PRESS;

else if(KEY2==0)

return KEY2_PRESS;

else if(KEY3==0)

return KEY3_PRESS;

else if(KEY4==0)

return KEY4_PRESS;

}

else if(KEY1==1&&KEY2==1&&KEY3==1&&KEY4==1) //无按键按下

{

key=1;

}

return KEY_UNPRESS;

}

/******************************************************************************

* 函 数 名       : main

* 函数功能  : 主函数

* 输    入       : 无

* 输    出      : 无

*******************************************************************************/

void main()

{

u8 key=0;

u8 dir=0;//默认逆时针方向

u8 speed=STEPMOTOR_MAXSPEED;//默认最大速度旋转

u8 step=0;

 

while(1)

{

key=key_scan(0);

if(key==KEY1_PRESS)//换向

{

dir=!dir;    

}

else if(key==KEY2_PRESS)//加速

{

if(speed>STEPMOTOR_MAXSPEED)

speed-=1;

}

else if(key==KEY3_PRESS)//减速

{

if(speed<STEPMOTOR_MINSPEED)

speed+=1;

}

step_motor_28BYJ48_send_pulse(step++,dir);

if(step==8)step=0;

delay_ms(speed);

}

}

15.1实验名称:外部中断0实验

接线说明:

实验现象:下载程序后,当按下K3键可控制D1指示灯亮灭

注意事项:将红外接收传感器取下,防止对P3.2口干扰   

*******************************************************************************

#include "reg52.h"

 

typedef unsigned int u16; //对系统默认数据类型进行重定义

typedef unsigned char u8;

 

//定义LED1管脚

sbit LED1=P2^0;

 

//定义独立按键K3控制脚

sbit KEY3=P3^2;

/******************************************************************************

* 函 数 名       : delay_10us

* 函数功能  : 延时函数,ten_us=1时,大约延时10us

* 输    入       : ten_us

* 输    出      : 无

*******************************************************************************/

void delay_10us(u16 ten_us)

{

while(ten_us--);

}

/******************************************************************************

* 函 数 名       : exti0_init

* 函数功能  : 外部中断0配置函数

* 输    入       : 无

* 输    出      : 无

*******************************************************************************/

void exti0_init(void)

{

IT0=1;//跳变沿触发方式(下降沿)

EX0=1;//打开INT0的中断允许

EA=1;//打开总中断

}

/******************************************************************************

* 函 数 名       : main

* 函数功能  : 主函数

* 输    入       : 无

* 输    出      : 无

*******************************************************************************/

void main()

{

exti0_init();//外部中断0配置

 

while(1)

{

 

}

}

void exti0() interrupt 0 //外部中断0中断函数

{

delay_10us(1000);//消斗

if(KEY3==0)//再次判断K3键是否按下

LED1=!LED1;//LED1状态翻转

}

15.2实验名称:外部中断1实验

接线说明:

实验现象:下载程序后,当按下K4键可控制D1指示灯亮灭

注意事项:   

******************************************************************************/

#include "reg52.h"

 

typedef unsigned int u16; //对系统默认数据类型进行重定义

typedef unsigned char u8;

 

//定义LED1管脚

sbit LED1=P2^0;

 

//定义独立按键K4控制脚

sbit KEY4=P3^3;

/******************************************************************************

* 函 数 名       : delay_10us

* 函数功能  : 延时函数,ten_us=1时,大约延时10us

* 输    入       : ten_us

* 输    出      : 无

*******************************************************************************/

void delay_10us(u16 ten_us)

{

while(ten_us--);

}

/******************************************************************************

* 函 数 名       : exti1_init

* 函数功能  : 外部中断1配置函数

* 输    入       : 无

* 输    出      : 无

*******************************************************************************/

void exti1_init(void)

{

IT1=1;//跳变沿触发方式(下降沿)

EX1=1;//打开INT1的中断允许

EA=1;//打开总中断

}

/******************************************************************************

* 函 数 名       : main

* 函数功能  : 主函数

* 输    入       : 无

* 输    出      : 无

*******************************************************************************/

void main()

{

exti1_init();//外部中断1配置

 

while(1)

{

 

}

}

void exti1() interrupt 2 //外部中断1中断函数

{

delay_10us(1000);//消斗

if(KEY4==0)//再次判断K4键是否按下

LED1=!LED1;//LED1状态翻转

}

16.1实验名称:定时器0实验

接线说明:

实验现象:下载程序后,D1指示灯间隔1s闪烁

注意事项:   

***************************************************************************************/

#include "reg52.h"

 

typedef unsigned int u16; //对系统默认数据类型进行重定义

typedef unsigned char u8;

 

//定义LED1管脚

sbit LED1=P2^0;

/******************************************************************************

* 函 数 名       : delay_10us

* 函数功能  : 延时函数,ten_us=1时,大约延时10us

* 输    入       : ten_us

* 输    出      : 无

*******************************************************************************/

void delay_10us(u16 ten_us)

{

while(ten_us--);

}

/******************************************************************************

* 函 数 名       : time0_init

* 函数功能  : 定时器0中断配置函数,通过设置TH和TL即可确定定时时间

* 输    入       : 无

* 输    出      : 无

*******************************************************************************/

void time0_init(void)

{

TMOD|=0X01;//选择为定时器0模式,工作方式1

TH0=0XFC; //给定时器赋初值,定时1ms

TL0=0X18;

ET0=1;//打开定时器0中断允许

EA=1;//打开总中断

TR0=1;//打开定时器

}

/******************************************************************************

* 函 数 名       : main

* 函数功能  : 主函数

* 输    入       : 无

* 输    出      : 无

*******************************************************************************/

void main()

{

time0_init();//定时器0中断配置

 

while(1)

{

 

}

}

 

void time0() interrupt 1 //定时器0中断函数

{

static u16 i;//定义静态变量i

TH0=0XFC; //给定时器赋初值,定时1ms

TL0=0X18;

i++;

if(i==1000)

{

i=0;

LED1=!LED1;

}

}

16.2实验名称:定时器1实验

接线说明:

实验现象:下载程序后,D1指示灯间隔1s闪烁

注意事项:   

***************************************************************************************/

#include "reg52.h"

 

typedef unsigned int u16; //对系统默认数据类型进行重定义

typedef unsigned char u8;

 

//定义LED1管脚

sbit LED1=P2^0;

/*******************************************************************************

* 函 数 名       : delay_10us

* 函数功能  : 延时函数,ten_us=1时,大约延时10us

* 输    入       : ten_us

* 输    出      : 无

*******************************************************************************/

void delay_10us(u16 ten_us)

{

while(ten_us--);

}

/******************************************************************************

* 函 数 名       : time1_init

* 函数功能  : 定时器1中断配置函数,通过设置TH和TL即可确定定时时间

* 输    入       : 无

* 输    出      : 无

*******************************************************************************/

void time1_init(void)

{

TMOD|=0X10;//选择为定时器0模式,工作方式1

TH1=0XFC; //给定时器赋初值,定时1ms

TL1=0X18;

ET1=1;//打开定时器1中断允许

EA=1;//打开总中断

TR1=1;//打开定时器

}

 

/******************************************************************************

* 函 数 名       : main

* 函数功能  : 主函数

* 输    入       : 无

* 输    出      : 无

*******************************************************************************/

void main()

{

time1_init();//定时器1中断配置

 

while(1)

{

 

}

}

void time1() interrupt 3 //定时器1中断函数

{

static u16 i;//定义静态变量i

TH1=0XFC; //给定时器赋初值,定时1ms

TL1=0X18;

i++;

if(i==1000)

{

i=0;

LED1=!LED1;

}

}

17.实验名称:串口通信实验

接线说明:

实验现象:下载程序后,当串口助手发送数据给单片机,单片机原封不动转发给串口助手显示

注意事项:使用黄色跳线帽将CH340旁的P5端子的UTX和P30短接,URX和P31短接,出厂默认已短接好   

***************************************************************************************/

#include "reg52.h"

 

typedef unsigned int u16; //对系统默认数据类型进行重定义

typedef unsigned char u8;

/******************************************************************************

* 函 数 名       : uart_init

* 函数功能  : 串口通信中断配置函数,通过设置TH和TL即可确定定时时间

* 输    入       : baud:波特率对应的TH、TL装载值

* 输    出      : 无

*******************************************************************************/

void uart_init(u8 baud)

{

TMOD|=0X20; //设置计数器工作方式2

SCON=0X50; //设置为工作方式1

PCON=0X80; //波特率加倍

TH1=baud; //计数器初始值设置

TL1=baud;

ES=1; //打开接收中断

EA=1; //打开总中断

TR1=1; //打开计数器

}

/******************************************************************************

* 函 数 名       : main

* 函数功能  : 主函数

* 输    入       : 无

* 输    出      : 无

*******************************************************************************/

void main()

{

uart_init(0XFA);//波特率为9600

 

while(1)

{

 

}

}

 

void uart() interrupt 4 //串口通信中断函数

{

u8 rec_data;

 

RI = 0; //清除接收中断标志位

rec_data=SBUF; //存储接收到的数据

SBUF=rec_data; //将接收到的数据放入到发送寄存器

while(!TI); //等待发送数据完成

TI=0; //清除发送完成标志位

}

posted on 2022-06-04 16:29  丰sir  阅读(217)  评论(0)    收藏  举报