课程设计
课程名称:嵌入式课程设计
题目名称:基于 Ubuntu 的网络文件传输
学生学院:信息工程学院
专业班级:应用电子技术 3 班
学 号:
学生姓名:
指导教师:
20##年 12月 27 日
一、 课程设计目的
1.1 背景
嵌入式系统的教学可以分为课堂理论教学、实验教学和课程设计三个层面。这三个层面的目标有所不同。理论学习的主要目标是掌握嵌入式系统的一般原理,例如体系架构、指令系统、网络传输等;实验教学的主要目的是:掌握嵌入式系统的主要开发流程和基本方法,例如交叉编译工具链的使用、应用程序的开发等;课程设计的主要目的是通过实际的嵌入式应用开发实例,掌握嵌入式系统设计和开发的技术,积累实践和工程经验。
1.2 题目
文件操作、网络通信是目前应用极为广泛的软件模块,要求采用 Linux 文件 IO、Socket 等 API 编写网络文件传输程序,实现用网络传输文件,功能类似于用 QQ 传输文件。通过本课程设计掌握 Linux 应用程序开发的基本方法,练习 Linux 文件 IO 及 Socket 编程的方法,从而将所学的知识融会贯通。
二、 设计分析
本设计是在 Linux(Ubuntu12.04)环境下基于 Socket 进行开发的,传输协议选择提供可靠通信服务的 TCP 协议。 系统有一个服务器端和一客户端组成。先是运行服务器监听客户端的连接请求,然后客户端发出连接请求,待服务器作出应答以后,开始向服务器端发送文件。服务器端接收客户端请求后,创建一个空文档“dest_file” ,并将接收到的数据写入其中。由此便实现了客户端与服务器端之间的文件传送。
三、 系统设计
3.1 相关文件
其中 client.c 为客户端程序,server.c 为服务器端程序,src_file、sishen.mp3 为调试使用用的待发送源文件
3.2 程序基本流图
四、 调试结果
4.1 编译程序
在终端上输入命令:
gcc clinet.c -o client
gcc server.c -o server
得到结果如下:
系统中多了 clinet 和 server 两个可执行文件。
4.2 运行服务器端程序
在终端上输入命令:./server
服务器程序开始运行,并进入监听状态下,等待客户端请求。
4.3 运行客户端程序
开启另一个终端,并在该终端上输入命令:
./client cxh-virtual-machine src_file
服务器程序开始运行,并开始请求和发送 src_file 文件。
4.4 最终结果
服务器端收到文件,并完成接收后退出。
此时,查看文档中发现多了 dest_file 文件,其大小与 src_file 一致。
这说明文件确实被完整的从客户端发送到了服务器端。
以下是发送 sishen.mp3 的实验结果:
客户端:
服务器端:
五、 课设心得
自己动手 丰衣足食
六、 程序
6.1 客户端
/*client.c*/
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <netdb.h>
#include <netinet/in.h>
#define PORT 4321
#define BUFFER_SIZE 1024
int main(int argc, char *argv[])
{
int sockfd, sendbytes;
int i;
unsigned char buf[BUFFER_SIZE];
struct hostent *host;
struct sockaddr_in serv_addr;
FILE *src_file;
int real_read_len;
memset(buf, 0, sizeof(buf)); //清空发送缓冲器
if(argc < 3)
{
fprintf(stderr,"USAGE: ./client Hostname(or ip address)Text\n");
exit(1);
}
/*地址解析函数*/
if ((host = gethostbyname(argv[1])) == NULL)
{
perror("gethostbyname");
exit(1);
}
/*以只读方式打开源文件*/
src_file = fopen(argv[2], "r");
/* 将源文件的读写指针移到文件的起始位置*/
fseek(src_file, 0, SEEK_SET);
/*创建 socket*/
if ((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1)
{
perror("Socket failed!\n");
exit(1);
}
printf("Socket id = %d\n",sockfd);
/*设置 sockaddr_in 结构体中相关参数*/
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
serv_addr.sin_addr = *((struct in_addr *)host->h_addr);
bzero(&(serv_addr.sin_zero), 8);
/*调用 connect 函数主动发起对服务器端的连接*/
if(connect(sockfd,(struct sockaddr *)&serv_addr, sizeof(struct
sockaddr))== -1)
{
perror("Connect failed!\n");
exit(1);
}
/*发送文件给服务器端*/
while((real_read_len = fread(buf, 1, sizeof(buf), src_file)) > 0)
{
if ((sendbytes = send(sockfd, buf, real_read_len, 0)) < 0)
{
perror("Send error!\n");
exit(1);
}
bzero(buf, BUFFER_SIZE);
}
fclose(src_file);
printf("Finish send file\n");
close(sockfd);
exit(0);
return 0;
}
6.2 服务器端
/*server.c*/
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <netinet/in.h>
#define PORT 4321
#define BUFFER_SIZE 1024
#define MAX_QUE_CONN_NM 5
int main()
{
struct sockaddr_in server_sockaddr, client_sockaddr;
int sin_size, recvbytes;
int sockfd, client_fd;
unsigned char buf[BUFFER_SIZE];
int real_read_len;
FILE *dest_file;
dest_file = fopen("dest_file", "w");
/*建立 socket 连接*/
if ((sockfd = socket(AF_INET,SOCK_STREAM,0))== -1)
{
perror("Socket failed\n");
exit(1);
}
printf("Socket id = %d\n",sockfd);
/*设置 sockaddr_in 结构体中相关参数*/
server_sockaddr.sin_family = AF_INET;
server_sockaddr.sin_port = htons(PORT);
server_sockaddr.sin_addr.s_addr = INADDR_ANY;
bzero(&(server_sockaddr.sin_zero), 8);
int i = 1;/* 使得重复使用本地地址与套接字进行绑定 */
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &i, sizeof(i));
/*绑定函数 bind*/
if (bind(sockfd, (struct sockaddr *)&server_sockaddr, sizeof(struct
sockaddr))== -1)
{
perror("Bind failed!\n");
exit(1);
}
printf("Bind success!\n");
/*调用 listen 函数*/
if (listen(sockfd, MAX_QUE_CONN_NM) == -1)
{
perror("Listen error!\n");
exit(1);
}
printf("Listening....\n");
/*调用 accept 函数,等待客户端的连接*/
if ((client_fd = accept(sockfd, (struct sockaddr *)&client_sockaddr,
&sin_size)) == -1)
{
perror("Accept failed!\n");
exit(1);
}
/*调用 recv 函数接收客户端的请求*/
memset(buf , 0, sizeof(buf));
while (real_read_len = recv(client_fd, buf, BUFFER_SIZE, 0))
{
if(real_read_len < 0) {
printf("Recieve data from client failed!\n");
exit(1);
}
fwrite(buf, 1, real_read_len, dest_file);
bzero(buf, BUFFER_SIZE);
}
printf("Finish recieve\n");
fclose(dest_file);
close(client_fd);
close(sockfd);
return 0;
}
嵌入式系统及机电接口应用
键控直流电动机
小组成员:
赵保顺 081014104
程辉 081014103
黄宇哲 081014106
梁霄 081014102
指导老师: 郑嫦娥
实验日期:20##年11月23日
键控直流电机的正反转实验
1.1背景介绍
一、预备知识
1. 熟悉凌阳单片机的工作原理:
1)I/O口的使用原理和设置;
2)定时器或时基的设置、使用;
3)中断的设定。
2. 熟悉键盘扫描原理。
3. 熟悉汇编语言及 C 语言。
二、直流电机控制原理:
对于普通直流电机,其控制方法比较简单,只需给电机的两根控制线加上适当的电压即可使电机转动起来, 电压越高则电机转速越高。 对于直流电机的速度调节, 可以采用改变电压的方法, 也可采用 PWM调速方法。PWM 调速就是使加在直流电机两端的电压为方波形式,加在电机两端的电压就在 VLoad 和0V之间不停的跳变,对应的电机电压波形如图1所示:
图1
此时加在电机两端的平均电压 Uo=Th/(Th+Tl)*VLoad,可以通过调整 PWM 的占空比来改变 Th 和Tl 的比值。这样就可以通过 PWM 调节加在电机两端的平均电压,从而改变电机的转速。
三、使用芯片的介绍
特点:
(1) 低静态工作电流;
(2) 宽电源电压范围:2.5V-12V;
(3) 每通道具有800mA 连续电流输出能力;
(4) 较低的饱和压降;
(5) TTL/CMOS输出电平兼容,可直接连CPU;
(6) 输出内置钳位二极管,适用于感性负载;
(7) 控制和驱动集成于单片IC之中;
(8) 具备管脚高压保护功能;
(9) 工作温度:0℃-80℃。
描述:
LG9110 是为控制和驱动电机设计的两通道推挽式功率放大专用集成电路器件,将分立电路集成在单片 IC 之中,使外围器件成本降低,整机可靠性提高。该芯片有两个 TTL/CMOS 兼容电平的输入,具有良好的抗干扰性;两个输出端能直接驱动电机的正反向运动,它具有较大的电流驱动能力,每通道能通过 750~800mA 的持续电流,峰值电流能力可达1.5~2.0A;同时它具有较低的输出饱和压降;内置的钳位二极管能释放感性负载的反向冲击电流,使它在驱动继电器、直流电机、步进电机或开关功率管的使用上安全可靠。LG9110 被广泛应用于玩具汽车电机驱动、步进电机驱动和开关功率管等电路上。
LG9110的外观如图
管脚示意图
管脚的波形图
1.2 设计目的
本课程设计的基本要求是:
1. 熟悉凌阳十六位单片机系统板-61 板的基本构成和使用方法。
2. 了解直流电机的原理及控制方法。
3. 掌握 LG9110的 I/O、定时器等操作方法。
4. 掌握单片机的一般编程技巧。
5. 掌握 61 板系统调试的一般步骤及方法。
1.3 设计题目
利用 61 板的三个按键实现直流电机的转动和速度调节控制。具体要求如下:
1. 开机时电机处于停转状态。
2. 在电机停转状态下,按 KEY1 键使电机正向转动,按 KEY2 键使电机反向转动。
3. 按 KEY3 键使电机停止转动。
1.4设计说明
(1)系统设计
根据设计题目的要求分析,系统分成两个部分:
1. 直流电机驱动和控制;
2. 按键控制。
根据系统的功能现选择 61 板作为单片机控制处理部分,按键采用61 板上自带的三个按键;直流电机驱动则利用 LG9110 芯片实现.来实现控制电机。
(2)硬件连接
硬件连接如图所示:
芯片的2与3号引脚接电源,7与8号口和61板相连接,控制电机转动。8号与5号角接地。
1.5软件流程图
利用汇编语言程序可很容易的实现,电机的控制,其流程图如下:
程序代码:
.DEFINE P_Watchdog_Clear 0x7012
.DEFINE P_IOA_Data 0x7000
.DEFINE P_IOA_Buffer 0x7001
.DEFINE P_IOA_Dir 0x7002
.DEFINE P_IOA_Attrib 0x7003
.DEFINE P_IOB_Data 0x7005
.DEFINE P_IOB_Buffer 0x7006
.DEFINE P_IOB_Dir 0x7007
.DEFINE P_IOB_Attrib 0x7008
.RAM
.VAR Key //定义变量保存键值
.CODE //伪指令.CODE 代码段
.PUBLIC _main
_main:
r1=0x01FF //设置IOA8为同相高电平输出
[P_IOA_Dir]=r1 //设置IOA0~IOA7口为同相低电平输出
[P_IOA_Attrib]=r1 //保证初始时不转动
r1=0x0100
[P_IOA_Data]=r1
r1=0x0040
[P_IOB_Dir]=r1 //IOB8~IOB15为下拉输入
[P_IOB_Attrib]=r1
[P_IOB_Data]=r1
? Loop:
call F_KeyScan
R1=[Key]
cmp r1, 0x0000 //是否有按键按下
je? Loop_1 //若无则继续扫描键盘
r1=r1 Lsr 4 //键值右移8位,利用IOA低8位输出
r1=r1 Lsr 4
r1=r1|1fff // IOA3-IOA8输出高电平
[P_IOA_Data] = r1 //输出键值,控制相应的电机转动
? Loop_1:
r1= 0x0001
[P_Watchdog_Clear]=r1
jmp ? Loop
//进行扫键操作,返回键盘值
.PUBLIC F_KeyScan
F_KeyScan:
r1=[P_IOB_Date]
r1=r1&0x0007 //仅取IOB口低三位的输入值
jz ? Return //为零则代表按键没有按下,返回
call F_Delay //延时,消抖
r2=[P_IOB_Date]
r2=r2&0x0007 //仅取IOB口低三位的输入值
cmp r1, r2 //比较延时前后两次输入值读取的是否相等
je ? Return //相等则返回,r1中保存有按键值
r1=0x0000 //返回0
? Return
[Key]=r1 //返回键值
retf
//延时程序F_Delay
.PUBLIC F_Delay
F_Delay;
r3=0x2ff
? Loop:
r4=0x0001
[P_Watchdog_Clear]=r4
r3-=1
jz ? Exit
jmp ? Loop
? Exit
reft
1.5实验总结
本次实验作为嵌入式系统与机电接口应用的课程设计,我们组选择的是控制电机的正反转,这个看似简单的事情,实际做起来就不那么简单了,首先选择控制电机的芯片,以及原材料的购买,实验线路的设计以及程序的编制,这一切使我们小组每个成员学到了很多书本上没有的知识,真正体会到了什么是理论联系实际。同时也锻炼了我们的动手实践能力。
1.6小组分工
本次实验的材料为小组一起购买。电机与面包板,还有电源是借用实验室。
程序编制:赵保顺,程辉。
实验操作:小组全体赵保顺,程辉,黄宇哲,梁宵。
1.6实验照片剪辑
本学期为期一周的嵌入式课程设计在不知不觉中结束了,虽说这次课程设计时间不是很长,但是感觉自己收获颇丰,不仅学习到了一些新知识,回顾…
福建工程学院嵌入式系统课程设计报告书题目基于S3C2440设备驱动及其界面设计班级姓名学号指导老师陈靖张平均李光炀2目录一设计课题…
信息技术学院嵌入式操作系统课程综合设计报告书姓名班级B0905学号XXXX题目嵌入式文件锁应用时间20xx年6月指导教师摘要随着P…
中南大学嵌入式课程设计基于ARM平台的打地鼠游戏姓名董嘉伟学号0909103303班级物联网1002时间20xx913目录课程设计…
嵌入式系统课程设计报告基于ARM的楼宇对讲系统设计摘要采用模块化设计方法设计出一款基于ARM微控制芯片和Linux操作系统的楼宇对…
本学期为期一周的嵌入式课程设计在不知不觉中结束了,虽说这次课程设计时间不是很长,但是感觉自己收获颇丰,不仅学习到了一些新知识,回顾…
DSP作为嵌入式处理器家族的一大类其结构特点决定了它尤其适合做数字信号处理的应用而学好数字信号处理对日后的信息处理的深入学习和应用…
本科课程设计(论文)单片机控制流水灯的正常工作及外部中断控制灯的亮灭学院名称:汽车与交通工程学院专业:汽车服务工程班级:13汽服B…
福建工程学院嵌入式系统课程设计报告书题目基于S3C2440设备驱动及其界面设计班级姓名学号指导老师陈靖张平均李光炀2目录一设计课题…
嵌入式系统课程设计报告基于ARM的楼宇对讲系统设计摘要采用模块化设计方法设计出一款基于ARM微控制芯片和Linux操作系统的楼宇对…