网站关键词掉的很快,数据做图网站,什么是网站什么是网页,个人网站源码下载今天的实验需要用到的材料有#xff1a;51单片机最小系统#xff0c;4X4的矩阵键盘#xff0c;DC直流6V-12V带编码器电机#xff0c;L298N模块#xff0c;一个led小灯。下面把产品截图展示一下#xff1a; 单片机就不展示了#xff0c;都一样#xff0c;下面是接线图51单片机最小系统4X4的矩阵键盘DC直流6V-12V带编码器电机L298N模块一个led小灯。下面把产品截图展示一下 单片机就不展示了都一样下面是接线图 下面是电机的脉冲信号接法4个脉冲1圈图中单片机处接到51单片机的P3.2口外部中断0 接下来就是我组装完了的一张图片了。 下面介绍一下程序的大体流程按A键正转按B键反转0停止1到9设置脉冲的高电平占用的百分比10%到90%也就是1最慢9最快了。还能再快没有写到100%就是最快了不管什么情况下转够十圈都会停止转动。
下面就是整个程序有注释程序测试没有问题特此记录
#includereg52.h
sbit IN1P3^5; //接L298N 7
sbit IN2P3^6; //接L298N 6
sbit EN1P3^7; //接L298N 5
sbit LEDP2^7; //接一个小led灯检测信号用#define uc unsigned char
#define uint unsigned intuint dat_H[2]; // 定时器初值的高位取值数组
uint dat_L[2]; // 定时器初值的低位取值数组
uint num1000; // 定时器的定时时间高电平时间为0.1毫秒uc flag0; //记录按键是否被按下的标志
uc count0; //用来记录电机转的圈数4个数为1圈//电动机停止函数
void motor_stop()
{IN11;IN21;EN11;EA0;
}//电动机正转函数
void motor_zheng()
{IN11;IN20;EA 1;
}//电动机反转函数
void motor_fan()
{IN10;IN21;EA 1;
}//数据初始化
void dat_init()
{dat_H[0](65536-(10000-num))/256;dat_L[0](65536-(10000-num))%256;dat_H[1](65536-num)/256;dat_L[1](65536-num)%256;}void key()
{uc temp0, temp10, temp20;P0 0x0F;if(P0 ! 0x0F flag 0){flag1; }if(P0 ! 0x0F flag 1){flag0; // temp1 P0;}P0 0xF0;if(P0 ! 0xF0 flag 0){flag 1;//temp2 P0;}if(P0 ! 0xF0 flag 1){flag 0;//temp2 P0;}temp temp1 temp2;//按键1按下 修改num值达到修改定时器定时时间的目的if(temp 0xEE){num 1000;}//按键2按下if(temp 0xDE){num 2000;}//按键3按下if(temp 0xBE){num 3000;}//按键A按下if(temp 0x7E){motor_zheng(); // 电机正转}//按键4按下if(temp 0xED){num 4000;}//按键5按下if(temp 0xDD){num 5000;}//按键6按下if(temp 0xBD){num 6000;}//按键B按下if(temp 0x7D){motor_fan(); // 电机反转}//按键7按下if(temp 0xEB){num 7000;}//按键8按下if(temp 0xDB){num 8000;}//按键9按下if(temp 0xBB){num 9000;}//按键C按下
// if(temp 0x7B)
// {
//
// }//按键*按下
// if(temp 0xE7)
// {
//
// }//按键0按下if(temp 0xD7){motor_stop(); //停止转动}//按键#按下
// if(temp 0xB7)
// {
//
// }
//
// //按键D按下
// if(temp 0x77)
// {
//
// }LED0;dat_init(); // 所有按键都检测完了就要重新设置一下初值好叫按键更改的num值起效
}//定时器初始化
void time_init()
{TMOD0x01;TH0dat_H[0];TL0dat_L[0];ET01;EA1;TR01;IN11;IN20;EN10;LED0; //P2的7口接了一个led小灯检测信号有没有用的。//下面是外部中断初始化IT01; // 外部中断设置成1边沿触发方式EX01; // 使用INT0的中断}// 主函数
int main()
{time_init(); //初始化定时器while(1){key(); // 检测按键}return 0;
}// 定时器中断入口函数
void zd() interrupt 1
{ EN1~EN1; // 电动机转动使能每次取反 得1时转动得0时停止if(EN10) // 如果是停止转动时就设置初值为(65536-(10000-num)num为定时时间1000为1毫秒{ TH0dat_H[0];TL0dat_L[0];}if(EN11) // 如果是转动时就设置初值为(65536-num)num为定时时间1000为1毫秒{TH0dat_H[1];TL0dat_L[1];}
}// 外部中断入口函数
void wbzd() interrupt 0
{count;if(count 40) //记录电机转10圈的时候就停止转动点亮led灯圈数置0.{LED1;count0;motor_stop();}
}