跑步机控制器.docx

上传人:b****8 文档编号:24018596 上传时间:2023-05-23 格式:DOCX 页数:30 大小:6.53MB
下载 相关 举报
跑步机控制器.docx_第1页
第1页 / 共30页
跑步机控制器.docx_第2页
第2页 / 共30页
跑步机控制器.docx_第3页
第3页 / 共30页
跑步机控制器.docx_第4页
第4页 / 共30页
跑步机控制器.docx_第5页
第5页 / 共30页
点击查看更多>>
下载资源
资源描述

跑步机控制器.docx

《跑步机控制器.docx》由会员分享,可在线阅读,更多相关《跑步机控制器.docx(30页珍藏版)》请在冰豆网上搜索。

跑步机控制器.docx

跑步机控制器

跑步机控制器

 

通达学院

2016/2017学年第一学期

课程设计实验报告

 

模块名称51单片机课程设计

专业通信工程

学生班级130006

学生学号13000624

学生姓名陈扬

指导教师林建中

 

设计题目

跑步机控制器设计

任务要求

基本要求:

●观察和了解一台实际跑步机的功能和状态,设计一模拟跑步机

●用键设定跑步速度(用两位LED/LCD)

●设计启动,停止,加速/减速,升高/降底,紧急停止等键

●用LED/LCD合理安排数据显示

●具有倒计时运行功能

发挥部分:

●速度变化编成运行模式

●高度变化编成运行模式

●速度+高度混合编程运行模式

●计数热量消耗参数

实验设备及软件

1.微型计算机

2.Proteus;Keil

3.德飞莱51单片机实验板

同组人员学号及姓名

13000623沈烨

参考文献

《Proteus教程》

《Proteus电子电路设计及仿真》

 

报告内容

一、实验目的:

本课程设计是在理论课程学习和软件设计的基础上,对51单片机硬件系统进行了解和研究,使学生更深入的掌握51单片机开发技术,培养学生面对实际课题,发现问题、分析问题和解决问题,提高学生的实验动手能力。

设计根据实验大纲提供的题目要求,选择适当的课题,并通过课题资料收集、原理分析、理论计算、实际编程、系统调试、测试和故障排除,解决在实际设计中的问题,使设计系统能正常工作,有能力的同学可以超出题目要求任意发挥设计。

二、实验要求:

基本要求:

●观察和了解一台实际跑步机的功能和状态,设计一模拟跑步机

●用键设定跑步速度(用两位LED/LCD)

●跑步启动后计算和显示跑步时间和距离

●设计启动,停止,加速/减速,升高/降底,紧急停止等键

●用LED/LCD合理安排数据显示

●具有倒计时运行功能

发挥部分:

●速度变化编成运行模式

●高度变化编成运行模式

●速度+高度混合编程运行模式

●计数热量消耗参数

显示格式:

8LED数码管显示格式见下图

LCD屏显示方法自定

口相同。

第二功能是作控制和特殊功能口使用,这时八条端口线所定义的功能各不相同,如表1所示。

 

表1P3口各位的第二功能

 

5.I/O口的读写

P0~P3口都可作为普通I/O口来使用。

当作为输入口使用时,必须先向该口的锁存器中写入“1”,然后再从读引脚缓冲器中读入引脚状态,这样的读入结果才正确。

2.2控制线

AT89C51单片机的控制线有以下几种:

(1)RST:

复位输入端,高电平有效。

(2)ALE/:

地址锁存允许/编程线。

(3):

外部程序存储器的读选通线。

(4)/VPP:

片外ROM允许访问端/编程电源端

2.LCD管脚说明

LCD通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线

VCC(15脚)和地线GND(16脚),其控制原理与14脚的LCD完全一样,其中:

引脚

符号

功能说明

1

VSS

一般接地

2

VDD

接电源(+5V)

3

V0

液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。

4

RS

RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。

5

R/W

R/W为读写信号线,高电平

(1)时进行读操作,低电平(0)时进行写操作。

+6

E

E(或EN)端为使能(enable)端,

写操作时,下降沿使能。

读操作时,E高电平有效

7

DB0

低4位三态、双向数据总线0位(最低位)

8

DB1

低4位三态、双向数据总线1位

9

DB2

低4位三态、双向数据总线2位

10

DB3

低4位三态、双向数据总线3位

11

DB4

高4位三态、双向数据总线4位

12

DB5

高4位三态、双向数据总线5位

13

DB6

高4位三态、双向数据总线6位

14

DB7

高4位三态、双向数据总线7位(最高位)(也是busyflag)

15

BLA

背光电源正极

16

BLK

背光电源负极

实验原理框图:

五、程序代码:

#include

#include"lcd.h"

sbitkey_1=P1^0;//开始按键

sbitkey_2=P1^1;//停止按键

sbitkey_3=P1^2;//加速

sbitkey_4=P1^3;//减速

sbitkey_5=P1^4;//升高

sbitkey_6=P1^5;//降低

sbitkey_7=P1^6;//紧急停止

sbitkey_8=P1^7;//倒计时

unsignedintcount_1=0;//计数标量

unsignedinttime_1=0;//按键1的计数时间

charstart=0;//开始

charsudu_flag=0;//速度变量

charhigh_flag=0;//速度变量

voiddelay10us(charc)//误差0us

{

unsignedchara,b;

for(b=c;b>0;b--)

for(a=2;a>0;a--);

}

voiddelay10ms(chard)//误差0us

{

unsignedchara,b,c;

for(c=d;c>0;c--)

for(b=38;b>0;b--)

for(a=130;a>0;a--);

}

 

voidmain()

{

TMOD=0X01;//设置定时器T016位

EA=1;//打开中断

ET0=1;//打开TO定时器

TR0=1;//关闭中断

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

LcdInit();//初始化液晶显示屏

while

(1)

{

if(key_1==0)//按键1按下

{

while(key_1==0);//等待K1抬起

start=1;

}

if(key_2==0)//按键2按下

{

while(key_2==0);//等待K2抬起

start=0;

time_1=0;

}

if(key_3==0)//按键3按下

{

while(key_3==0);//等待K3抬起

sudu_flag++;

if(sudu_flag>=4)

sudu_flag=4;

}

if(key_4==0)//按键4按下

{

while(key_4==0);//等待K4抬起

sudu_flag--;

if(sudu_flag<=0)

sudu_flag=0;

}

if(key_5==0)//按键5按下

{

while(key_5==0);//等待K5抬起

high_flag++;

if(high_flag>=4)

high_flag=4;

}

if(key_6==0)//按键6按下

{

while(key_6==0);//等待K6抬起

high_flag--;

if(high_flag<=0)

high_flag=0;

}

if(key_7==0)//按键2按下

{

while(key_7==0);//等待K2抬起

start=0;

time_1=0;

}

if(key_8==0)//按键2按下

{

while(key_8==0);//等待K2抬起

time_1+=60;

}

//显示开始

if(start==1)

{

LcdWriteCom(0x80);//显示坐标

LcdWriteData('S');//在lcd1602进行显示

LcdWriteData('T');//在lcd1602进行显示

LcdWriteData('A');//在lcd1602进行显示

LcdWriteData('R');//在lcd1602进行显示

LcdWriteData('T');//在lcd1602进行显示

LcdWriteData('');//在lcd1602进行显示

}

else

{

LcdWriteCom(0x80);//显示坐标

LcdWriteData('S');//在lcd1602进行显示

LcdWriteData('T');//在lcd1602进行显示

LcdWriteData('O');//在lcd1602进行显示

LcdWriteData('P');//在lcd1602进行显示

LcdWriteData('');//在lcd1602进行显示

LcdWriteData('');//在lcd1602进行显示

}

//显示速度

switch(sudu_flag)

{

case0:

LcdWriteCom(0x87);//显示坐标

LcdWriteData('0');//在lcd1602进行显示

LcdWriteData('m');//在lcd1602进行显示

LcdWriteData('/');//在lcd1602进行显示

LcdWriteData('s');//在lcd1602进行显示

break;

case1:

LcdWriteCom(0x87);//显示坐标

LcdWriteData('1');//在lcd1602进行显示

LcdWriteData('m');//在lcd1602进行显示

LcdWriteData('/');//在lcd1602进行显示

LcdWriteData('s');//在lcd1602进行显示

break;

case2:

LcdWriteCom(0x87);//显示坐标

LcdWriteData('2');//在lcd1602进行显示

LcdWriteData('m');//在lcd1602进行显示

LcdWriteData('/');//在lcd1602进行显示

LcdWriteData('s');//在lcd1602进行显示

break;

case3:

LcdWriteCom(0x87);//显示坐标

LcdWriteData('3');//在lcd1602进行显示

LcdWriteData('m');//在lcd1602进行显示

LcdWriteData('/');//在lcd1602进行显示

LcdWriteData('s');//在lcd1602进行显示

break;

case4:

LcdWriteCom(0x87);//显示坐标

LcdWriteData('4');//在lcd1602进行显示

LcdWriteData('m');//在lcd1602进行显示

LcdWriteData('/');//在lcd1602进行显示

LcdWriteData('s');//在lcd1602进行显示

break;

}

//高度显示

switch(high_flag)

{

case0:

LcdWriteCom(0x8c);//显示坐标

LcdWriteData('1');//在lcd1602进行显示

LcdWriteData('0');//在lcd1602进行显示

LcdWriteData('c');//在lcd1602进行显示

LcdWriteData('m');//在lcd1602进行显示

break;

case1:

LcdWriteCom(0x8c);//显示坐标

LcdWriteData('2');//在lcd1602进行显示

LcdWriteData('0');//在lcd1602进行显示

LcdWriteData('c');//在lcd1602进行显示

LcdWriteData('m');//在lcd1602进行显示

break;

case2:

LcdWriteCom(0x8c);//显示坐标

LcdWriteData('3');//在lcd1602进行显示

LcdWriteData('0');//在lcd1602进行显示

LcdWriteData('c');//在lcd1602进行显示

LcdWriteData('m');//在lcd1602进行显示

break;

case3:

LcdWriteCom(0x8c);//显示坐标

LcdWriteData('4');//在lcd1602进行显示

LcdWriteData('0');//在lcd1602进行显示

LcdWriteData('c');//在lcd1602进行显示

LcdWriteData('m');//在lcd1602进行显示

break;

case4:

LcdWriteCom(0x8c);//显示坐标

LcdWriteData('5');//在lcd1602进行显示

LcdWriteData('0');//在lcd1602进行显示

LcdWriteData('c');//在lcd1602进行显示

LcdWriteData('m');//在lcd1602进行显示

break;

}

LcdWriteCom(0xc0);//显示坐标

LcdWriteData('T');//在lcd1602进行显示

LcdWriteData('I');//在lcd1602进行显示

LcdWriteData('M');

LcdWriteData('E');

LcdWriteData(':

');

LcdWriteData('');

LcdWriteData('0'+(time_1/60)/10);//分钟十位

LcdWriteData('0'+(time_1/60)%10);//分钟个位

LcdWriteData(':

');

LcdWriteData('0'+(time_1%60)/10);//秒十位

LcdWriteData('0'+(time_1%60)%10);//秒个位

LcdWriteData('');

delay10ms(10);

}

}

//中断函数

voiddelay1s(void)interrupt1

{

TH0=(65536-50000)/256;//10ms产生一次中断用于数码管动态扫描

TL0=(65536-50000)%256;//10ms产生一次中断用于数码管动态扫描

count_1++;

if((time_1>0)&&(start==1))

{

if(count_1>=20)//1s时间

{

count_1=0;

time_1--;//时间倒计时

if(time_1==0)

{

start=0;//倒计时结束,时间停止

}

}

}

}

 

#include"lcd.h"

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

*函数名:

Lcd1602_Delay1ms

*函数功能:

延时函数,延时1ms

*输入:

c

*输出:

*说名:

该函数是在12MHZ晶振下,12分频单片机的延时。

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

voidLcd1602_Delay1ms(uintc)//误差0us

{

uchara,b;

for(;c>0;c--)

{

for(b=199;b>0;b--)

{

for(a=1;a>0;a--);

}

}

}

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

*函数名:

LcdWriteCom

*函数功能:

向LCD写入一个字节的命令

*输入:

com

*输出:

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

#ifndefLCD1602_4PINS//当没有定义这个LCD1602_4PINS时

voidLcdWriteCom(ucharcom)//写入命令

{

LCD1602_E=0;//使能

LCD1602_RS=0;//选择发送命令

LCD1602_RW=0;//选择写入

LCD1602_DATAPINS=com;//放入命令

Lcd1602_Delay1ms

(1);//等待数据稳定

LCD1602_E=1;//写入时序

Lcd1602_Delay1ms(5);//保持时间

LCD1602_E=0;

}

#else

voidLcdWriteCom(ucharcom)//写入命令

{

LCD1602_E=0;//使能清零

LCD1602_RS=0;//选择写入命令

LCD1602_RW=0;//选择写入

LCD1602_DATAPINS=com;//由于4位的接线是接到P0口的高四位,所以传送高四位不用改

Lcd1602_Delay1ms

(1);

LCD1602_E=1;//写入时序

Lcd1602_Delay1ms(5);

LCD1602_E=0;

//Lcd1602_Delay1ms

(1);

LCD1602_DATAPINS=com<<4;//发送低四位

Lcd1602_Delay1ms

(1);

LCD1602_E=1;//写入时序

Lcd1602_Delay1ms(5);

LCD1602_E=0;

}

#endif

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

*函数名:

LcdWriteData

*函数功能:

向LCD写入一个字节的数据

*输入:

dat

*输出:

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

#ifndefLCD1602_4PINS

voidLcdWriteData(uchardat)//写入数据

{

LCD1602_E=0;//使能清零

LCD1602_RS=1;//选择输入数据

LCD1602_RW=0;//选择写入

LCD1602_DATAPINS=dat;//写入数据

Lcd1602_Delay1ms

(1);

LCD1602_E=1;//写入时序

Lcd1602_Delay1ms(5);//保持时间

LCD1602_E=0;

}

#else

voidLcdWriteData(uchardat)//写入数据

{

LCD1602_E=0;//使能清零

LCD1602_RS=1;//选择写入数据

LCD1602_RW=0;//选择写入

LCD1602_DATAPINS=dat;//由于4位的接线是接到P0口的高四位,所以传送高四位不用改

Lcd1602_Delay1ms

(1);

LCD1602_E=1;//写入时序

Lcd1602_Delay1ms(5);

LCD1602_E=0;

LCD1602_DATAPINS=dat<<4;//写入低四位

Lcd1602_Delay1ms

(1);

LCD1602_E=1;//写入时序

Lcd1602_Delay1ms(5);

LCD1602_E=0;

}

#endif

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

*函数名:

LcdInit()

*函数功能:

初始化LCD屏

*输入:

*输出:

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

#ifndefLCD1602_4PINS

voidLcdInit()//LCD初始化子程序

{

LcdWriteCom(0x38);//开显示

LcdWriteCom(0x0c);//开显示不显示光标

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > 财会金融考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1