#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit P20=P0^1;
sbit P21=P0^2;
sbit PWM1=P0^3;
sbit P23=P0^4;
sbit P24=P0^5;
sbit PWM2=P0^6;
sbit KEY0=P3^4; //矩阵键盘
sbit KEY1=P3^5;
sbit KEY2=P3^6;
sbit KEY3=P3^7;
sbit SCAN1=P3^2;
sbit SCAN0=P3^3;
sbit LED0 = P0^0;//数码管
uint count1=1,Flag=0;
uchar num,temp=0;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0};
uchar drv1=0,drv2=0;//正转或者反转的控制;
bit pwm_al_1=1,pwm_al_2=1;
uint flg1=0,flg2=0;
uint speed1=15,speed2=15;//档位的控制变量;
/***********************************************************子程序部分***********************/
void Delay5Ms(void)
{
unsigned int TempCyc = 1000;
while(TempCyc--);
}
void L298_M1(uchar drv1,bit pwm_al)//一号电机
{
if(drv1==1) //正转
{
P20=1;
P21=0;
}
else //反转
{
P20=0;
P21=1;
}
PWM1=pwm_al;
}
void L298_M2(uchar drv2,bit pwm_al)//二号电机
{
if(drv2==1) //正转
{
P23=1;
P24=0;
}
else //反转
{
P23=0;
P24=1;
}
PWM2=pwm_al;
}
uchar keyscan()
{
switch(temp%2)
{
case 0:
SCAN1=0;
SCAN0=1;
if(!KEY0)
{
Delay5Ms();
if(!KEY0)
{
while(!KEY0);
num=1;
Flag = 1;
count1++;
}
}
if(!KEY1)
{
Delay5Ms();
if(!KEY1)
{
while(!KEY1);
num=2;
if(speed1<40)
speed1=speed1+4;
if(speed2<40)
speed2=speed2+4;
}
}
if(!KEY2)
{
Delay5Ms();
if(!KEY2)
{
while(!KEY2);
num=3;
if(speed1>=15)
speed1=speed1-4;
if(speed2>=15)
speed2=speed2-4;
}
}
if(!KEY3)
{
Delay5Ms();
if(!KEY3)
{
while(!KEY3);
num=4;
speed1=15;
speed2=35;
}
}
break;
case 1:
SCAN1=1;
SCAN0=0;
if(!KEY0)
{
Delay5Ms();
if(!KEY0)
{
while(!KEY0);
num=5;
speed1=35;
speed2=15;
}
}
if(!KEY1)
{
Delay5Ms();
if(!KEY1)
{
while(!KEY1);
num=6;
speed1=0;
speed2=0;
}
}
if(!KEY2)
{
Delay5Ms();
if(!KEY2)
{
while(!KEY2);
num=7;
speed1=15;
speed2=15;
}
}
if(!KEY3)
{
Delay5Ms();
if(!KEY3)
{
while(!KEY3);
num=8;
speed1=40;
speed2=40;
}
}
break;
}
return num;
}
/************************************************子程序完*********************************/
/**************************************************中断处理程序***************************/
void Time0(void) interrupt 1
{
TH0=0xff;
TL0=0x9c;
temp++;
flg1++;
flg2++;
if(temp>200)
temp=0;
if(flg1<speed1)
pwm_al_1=1;
else
pwm_al_1=0;
if(flg1>=40)
flg1=0;
if(flg2<speed2)
pwm_al_2=1;
else
pwm_al_2=0;
if(flg2>=40)
flg2=0;
LED0=0;
P2=table[num];
LED0=1;
}
/*************************************************中断处理程序结束*****************************/
/****************************************************初始化函数********************************/
void system_init()
{
TH0= 0xff;//100us;
TL0= 0x9c;
// TH1 = 0xff; // 100us;
// TL1 = 0x9c; //
TMOD = 0x01; //[GATE,C/~T,M1,M0,GATE,C/~T,M1,M0],启动T0的GATE,选择T0的工作方式为方式1;
TCON = 0x10; //[TF1,TR1,TF0,TR0,IE1,IT1,IE0,IT0],启动T0,T1;
IE = 0x02; //[EA,--,--,ES,ET1,EX1,ET0,EX0]; }
EA=1;
}
/*****************************************************初始化函数完******************************/
/**************************************************主函数*************************************/
void main()
{
system_init();
P0=0;
while(1)
{
keyscan();
if(speed1>40)
speed1=0;
if(speed2>40)
speed2=0;
if(Flag){
if(count1%2==0)
{
drv1=1;//正转
drv2=1;
}
else
{
drv1=0;//反转
drv2=0;
}
L298_M1(drv1,pwm_al_1);
L298_M2(drv2,pwm_al_2);
}
}
}
/***************************************************end*****************************************/
xiaoche.rar_单片机 模拟PWM_小车pwm
版权申诉
197 浏览量
2022-09-19
16:27:37
上传
评论
收藏 1KB RAR 举报
alvarocfc
- 粉丝: 109
- 资源: 1万+
最新资源
- python-leetcode面试题解之第198题打家劫舍-题解.zip
- python-leetcode面试题解之第191题位1的个数-题解.zip
- python-leetcode面试题解之第186题反转字符串中的单词II-题解.zip
- 一个基于python的web后端高性能开发框架,下载可用
- python-leetcode面试题解之第179题最大数-题解.zip
- python-leetcode面试题解之第170题两数之和III数据结构设计-题解.zip
- python-leetcode面试题解之第168题Excel表列名称-题解.zip
- python-leetcode面试题解之第167题两数之和II输入有序数组-题解.zip
- python-leetcode面试题解之第166题分数到小数-题解.zip
- python-leetcode面试题解之第165比较版本号-题解.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈