keilc温度控制直流电机转速课程设计报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录
一、设计目的及要求 (2)
1.1 设计目的 (2)
1.2 设计要求 (3)
二、设计方案及论证之硬件电路设计 (3)
2.1芯片简介 (3)
2.2 电路原理图 (4)
2.21 电机测速即驱动部分: (4)
2.22电路供电系部分 (5)
2.23显示部分 (5)
三、设计方案及论证之软件设计 (6)
3.1 程序设计思路 (6)
四、器件清单 (13)
五、器件识别与检测 (14)
六、仿真结果: (15)
七、软件简述 (15)
7.1 keil 简介 (15)
7.2 keil与proteus联调与仿真实现 (16)
九、参考文献 (17)
课程设计任务书
一、设计目的及要求
1.1 设计目的
本设计主要是应用proteus软件和嵌入式C语言编程工具,结合单片机原理及应用。危机原理与接口技术等专业课程,强化和巩固专业理论基础,掌握
Proteus仿真的技巧和嵌入式C语言编程工具,提高单片机开发能力,并为嵌入式开发打下基础。
1.2 设计要求
(1) 使用 AT89C51单片机为核心,使用 4 位集成式数码管显示当前温度,温度传感器使用 DS18B20,使用 L298 驱动直流电动机。
(2)用 4 位集成式数码管显示当前温度, , 当温度在≥ 45 C 时, 直流电动机在 L298 0 0 驱动下加速正转,温度在≥ 75 C 全速正转;当温度≤ 10 C 时,直流电动机加速反转,温度≤ 0 C 时,直流电动机全速反转;温度 10 C ~ 45
C 之间时,直流电动机停止转动。
(3)控制程序在 Keil 软件中编写,编译,整个控制电路在 Proteus 仿真软件中连接调示。
二、设计方案及论证之硬件电路设计
2.1芯片简介
本设计选择采用AT89C51单片机为核心。AT89C51提供以下标准功能:4k字节Flash闪速存储器,128字节内部RAM,32个I/O口线,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内震荡器及时钟电路。同时,AT89C51可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。掉电方式保存RAM中的内容,但震荡器停止工作并禁止其他所有部件工作直到下一个硬件复位。
2.2 电路原理图
2.21 电机测速即驱动部分:
电机选用美国史普拉格公司生产的 3000 系列霍尔开关传感器 3013,它是一种硅单片集成电路,器件的内部有稳压电路,霍尔电视发生器,放大器,施密特触发器和集成开路输出电路,具有工作电压范围宽,可靠性高,外电路简单,输
出电平可与各种数字电路兼容等特点。
电动机测试部分原理图如下:
2.22电路供电系部分
电路通过 12V 电源供电,由霍尔元件及外围器件组成的测速电路将电动机转速转换成脉冲信号送到单片机 89C51 的 P3.5 脚,作为 T1 计数器计数使用,得到的计数值。与设定的值进行比较形成偏差.根据比较结果通过 Po 端口送给 DAC0832 进行数/模转换, 从而使得输出电压增大或者减少,得到模拟电压输出给功率放大电路放大,再去控制电机的转速。
2.23显示部分
采用 LM016L作为显示屏
下图为显示部分:
三、设计方案及论证之软件设计
3.1 程序设计思路
程序框图
开
始
初始化
3.2源程序
void dsreset(void) ;温度采集初始化{
uint i;
DS=1;
i++;
DS=0;
i=103;
while(i>0)i--;
DS=1;
i=4;
while(i>0)i--;
DS=1;
}
void tmpwritebyte(uchar dat);控制温度传感器
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb) //write 1
{
DS=0;
i++;i++;
DS=1;
i=8;while(i>0)i--;
}
else
{
DS=0;
i=8;while(i>0)i--;//write 0
DS=1;
i++;i++;
}
}
}
bit tmpreadbit(void) ;读数据赋值给dat
{
uint i;
bit dat;
DS=1;
DS=0;i++;i++;
DS=1;i++;
dat=DS;
i=8;while(i>0)i--;
return (dat);
}
uchar tmpread(void)
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tmpreadbit();
dat=(j<<7)|(dat>>1);
}
return(dat);
}