正反转可控的直流电机(单片机)
实验名称
正反转可控的直流电机
实验时间
2021年12月2 日
学生姓名
实验地点
钉钉群线上
同组人员
专业班级
1、实验目的
1、能够在PROTEUS软件中掌握直流电机的驱动电路绘制方法;
2、掌握直流电动机的程序控制方法;
2、任务设计要求
设计采用单片机控制直流电机的正反转,按下K1按键正转,按下K2按键反转,
按下K3按键停止,执行相应的操作时,对应的LED被点亮。
3、总体设计方案
根据实验任务要求,通过功能分析,设计的系统总体方案如图所示。
并行接口
AT89C51单片机
电源
时钟电路
复位电路
实现转向灯的控制
4、硬件电路设计
5、软件程序设计
(1)、程序设计思路(流程图绘制)
其设计思路如图所示
结束
结束
结束
(2)程序清单
#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigne dintsbit K1=P3^0;sbit K2=P3^1;sbit K3=P3^2;sbit LED1=P0^0;sbit LED2=P0^1;sbit LED3=P0^2;sbit MA=P1^0;sbit MB=P1^1;void main (void){ LED1=1;LED2=1;LED3=0;while(1){if(K1==0){ while( K1==0); LED1=0;LED2=1;LED3=1; MA=0;MB=1;}if(K2==0){ while(K2==0); LED1=1;LED2=0;LED3=1; MA=1;MB=0; } if(K3==0){ while(K3==0); LED1=1;LED2=1;LED3=0; MA=0;MB=0; } }}
性能指标测试及结果分析在此实验设计过程中我们遇到了很多问题也发现了很多的缺陷,但通过我们的不断探索与钻研、向导师询问不懂知识、努力找寻解决方法,问题被一个个解决。我们也从这次设计过程中学到了很多的知识,领悟到了一些道理
8、项目设计报告成绩
指导教师签字:
年 月 日
单片机常用程序有哪些?高级工考核反复使用的三个程序
今天给大家分享高级工考核经常使用的三个单片机程序
1、按键扫描
#include<reg52.h>
#include<stdio.h>
#define uchar unsigned char //宏定义
#define uint unsigned int
sbit K1=P0^0;
sbit L1=P1^0;
void delay_ms(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void main(void)
{
while(1)
{
if(K1==0) //开关、按钮是否接通
{
delay_ms(10); //延时去抖动
{
if(K1==0) L1=0;// 开关接通,有输出
else
L1=1;//断开,没有输出
}
}
}
}
2、定时与中断
void init_interrupt()//The Init of interrupt
{TH0=88;
TL0=0;
TMOD=0x01;
ET0=0;
IT0=0;
EX0=0;
TR0=0;
EA=0;
}
void timer_0(void) interrupt 1 //中断服务函数
{
;
}
void int_0(void) interrupt 0 //中断服务函数
{
;
}
3、数码显示相关
#include <at89x51.h> //头文件
#define uchar unsigned char //宏定义
#define uint unsigned int
#define ulint unsigned long int
sbit Data=P3^7; //定义595数据管脚 14管脚
sbit sck=P3^6; //上升沿时数据寄存器的数据移位 11脚
sbit rck=P3^5; //上升沿时数据进入数据存储区12脚
//共阴数码光字形表,0 1 2 3 4 5 6 7 8 9
uchar table[10]={0x3F,0X06,0X5B,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar Date[6]={0,0,0,0,0,0};
ulint a; //全局变量
/*******************延时子函数*********************/
void delay_ms(uint z) //z=1,延时1毫秒
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/*******************结束*****************************/
/*******************595初始化函数*********************/
void initialization_595() //595初始化
{
Data=0;
sck=0;
rck=0;
}
/*******************结束*****************************/
/****************595时序及显示函数************************/
void display(uchar *n) //显示6位数据,根据后面display(Date),则uchar *n指针指向Date数组
{
uchar i,dat; //局部变量
char j;
for(j=5;j>-1;j--) //6位数据依次循环
{
dat=table[n[j]]; //6位数据分别赋值
for(i=0;i<8;i++) //依次写入8位数据
{
if(dat&0x80) Data=1; //按位与操作,判断是1还是0
else Data=0;
dat<<=1; //左移一位等待下次判断
sck=0; //上升沿有效(上升沿时数据寄存器的数据移位)
sck=1;
}
}
rck=0; //将6位数据发出数码管(上升沿时移位寄存器的数据进入数据存储器,更新显示数据)
rck=1;
}
/*******************结束*****************************/
/*******************变量运算函数**********************/
calculate()
{
Date[0]=a/100000;
Date[1]=(a/10000)%10;
Date[2]=(a/1000)%10;
Date[3]=(a/100)%10;
Date[4]=(a/10)%10;
Date[5]= a%10;
}
/*******************结束*****************************/
/*******************主函数****************************
void main()
{ a=80310; //08级1班10号
initialization_595(); //调用595初始化子函数
while(1) //进入循环体
{
calculate(); //调用计算函 数
display(Date); //调用数码管显示函数
}
}*******************结束*****************************/
相关问答
sbit K1 =P3^2;在 单片机 这表示什么意思?谢谢邀请,sbit是定义特殊功能寄存器的位变量在51系列的单片机,有这样的位操作,是可以直接定义对应引脚,在应用时候,可以直接进行赋值操作if(IsOK)K1=1;els...
if (! k1) x--;else if (k2)x=4;elsex=3;A:14B:4C:15D:3B_作业帮[最佳回答]k1=1;!k1==0,if(!k1)等价于if(k1==0)k2=2;if(k2)等价于if(k2!=0)if(!k1)x--;//k1!=0,条件不成立elseif(k2)x=4;//k...
单片机 按键程序 哪里错了 为何不能运行-ZOL问答第一条语句应该if(k1==0)吧,而不是if(k1==o),一个是字母一个是数字。AT89C52?你确定?这可能是清理插件的时候出现了问题。这个问题建议朋友你使用360急救箱...
单片机 怎么设置LED点阵亮的时间长度?要设置LED点阵亮的时间长度,可以通过控制单片机的IO口输出信号来实现。首先,需要确定所使用的单片机型号和开发环境,然后编写相应的程序代码。在程序中,可以...
C语言的 if (!k)是什么意思?解释:“if(a)b;”,a是真的就执行b,假的就不执行b,逻辑值为1就是真的,0就是假的,数字除了0其他的都是真的,0是假的,!就是非的意思,否定。比如0是假...解释:“...
prototypeerorrc231:'display#includesbitk0=P1^0;sbit k1 =...[最佳回答]警告:display函数没有原型.错误:dispaly被重定义.你改display()函数的实现试试display(void){}改成display(){}警告:display函数没有原型.错...
求解C语言编写的51 单片机 用按键实现 暂停 开启-ZOL问答再次按按键就唤醒单片机};4水位{当水位40)v++;//如果按...
如果k列的时间大于2007,则p列的备注填新聘,否则为空白,用 if ...[最佳回答]保证K列是日期格式在P1中输入=IF(YEAR(K1)>2007,"新聘","")下拉填充即可
(数字可能不再同一列)的行列D2到 K1 00是1-80间的随机数字,...[最佳回答]在搜索区域之外,比如在C列或者L列增加一个辅助列,在L1输入公式=COUNT(IF($D1:$K1=3,$D1:$K1,""))+COUNT(IF($D1:$K1=8,$D1:$K...
...家一下)Input每组输入数据占1行,每行数据的开始是2个整数n(0[回答]太乱了……其实你根本不需要把数组移来移去的,这样会影响自己的思路,只要再开一个数组,里面只存0和1,来表示这个数要不要输出即可.按照你的思路,我...