微机原理(单片机)课程设计报告
本次试验使用的最小系统板上有6个按键,我们的课程设计要求能使电扇在高速、中速、低速、停止共4状态间切换,并能定时。
我们小组最初设计是2个按键用于调速(加速、减速)剩下4个按键用于定时(开始设置定时、确定定时的时间、增加时间、减少时间),但发现这样时间只能一秒一秒的增加和减少,很不方便。后来经过我们小组讨论,最终决定使用一键两功能的方案,即一个按键在不同的状态下是不同的功能。
这样的设计就需要一个状态切换键,比如设置Key5为状态切换键,当不按Key5时,Key1~4用于调速,按下Key5时,Key1~4用于设置定时。这个状态切换的设计给我的编程带来很大困难。由于Key5的按下只是一瞬间,我并不知道该如何保存这个状态。后来经过查阅资料,我在按键检测的函数中增加了一个检测上一次按键的功能,通过上一次按键和这一次按键的对比来判断是否按下了某个键,最终解决了这个问题。
刘思源:
1、设计中要求上位机和下位机进行串口通讯,我按照网上的Labview教程搭建完串口后发现程序并不能和单片机进行连接,后来经过询问同学后才知道是没有安装Visa驱动模块,在安装后解决了问题。
2、设计中要求把转速变化信息保存到txt文件中,如果之前没有设定保存的路径,在转速变化时会自动弹出一个保存窗口,如果此时不保存,而是关掉窗口,Labview就会崩溃。这个问题应该是Labview文件保存模块的本身的特性导致的,只要在文件保存路径中指定一个txt文件就能解决问题。
七、心得体会与建议
张雷:
本次课程设计是我第一次完成的一个完整的单片机项目。之前我也上过一些单片机的实验选修课,不过做的都是一些比较基础的东西,上学期的微机硬件实验综合性较强,但使用的是汇编语言。所以这次课程设计对我来说是一个全新的,很有挑战性的任务。
一开始我拿到题目时是毫无头绪的,根本不知道程序从何写起。但通过
8
微机原理(单片机)课程设计报告
班里同学的帮助,我渐渐地有了整个程序的设计思路,并通过查阅资料逐步完成了单片机初始化、按键控制、LED显示等模块的实现。
对于课程的建议是在微机原理的课时里留出更多的时间给单片机,因为班里的许多同学和我一样对于单片机的整体设计是非常缺乏经验的,课设最初的时候会遭遇很大的困难。希望老师在平时上课时增加单片机部分的内容和硬件设计。
刘思源:
本次课程设计上位机使用的Labview软件是我之前从未接触过的。面对这个全新的软件,我从网上查阅教程,并听从其他会使用Labview同学的指导,逐步学会了使用Labview制作一个上位机程序。Labview的功能非常强大,使用图形搭建程序比VCC++方便了许多。对于课程的建议是应该把所有的课程设计题目进行难度分级,并根据难度给不同的得分,比如难的题目完成的话给分从80分起,简单的题目完成了从60分起等等。这样可以让同学根据自己的水平进行选题,量力而行。
参考文献
[1]楚现知,吴吉祥,李锦忠.基于LabVIEW的监控界面设计与单片机的串行通信[J]《工业控制计算机》2005,18(7)
[2]陈诚,李言武,葛立峰.基于LabVIEW的单片机串口通信设计[J]现代计算机(专业版)2009,01
[3]焦玉朋.基于51单片机的PWM直流电机调速系统[D]内蒙古:内蒙古大学,2013
附录A.下位机程序
#include
#define TSETH 0x4C
sbit fan=P2^0;
//50ms
9
微机原理(单片机)课程设计报告
sbit dispc=P2^6; sbit dispd=P2^7;
bit key5=0;
unsigned int mcnt=0; unsigned char speed=0,scnt=19,tbsize,srem,sdig; //tbsize为发送数据位数,srem为闪烁时间,sdig计时功能的时间,speed为当前速度 unsigned char txbuf[4],inset[4];
unsigned char code duties[4]={0x00,0x80,0xc0,0xff};
void display (void);
void disp_send (unsigned char);
void speed_regulation (unsigned char);
void init() //初始化函数 {
TMOD=0x21; //T1方式2,T0方式1 TH0=TSETH; //T0为50ms TL0=0x00; TR0=1; TH1=0xfd;
TL1=0xfd; //baud rate: 9600 TR1=1;
SCON=0x50; //串口工作方式1 speed_regulation(1); ET0=1; //开T0中断 ES=1; //开串口中断 EA=1; //开所有中断 }
void main (void) {
unsigned char i,j; display(); init();
//根据电压生成PWM波 for(;;){
for(i=duties[speed];i<0xff;i++){ fan=0;
for(j=0;j<32;j++); }
for(i=duties[speed];i>0x00;i--){
10
微机原理(单片机)课程设计报告
fan=1;
for(j=0;j<32;j++); } } }
void speed_regulation (unsigned char newg) //调速 {
if(speed!=newg){ speed=newg; display();
txbuf[0]=0xff; txbuf[1]=speed; tbsize=2;
SBUF=txbuf[0]; } }
void display (void) //LED显示函数,数码管共6位,从右往左计数。前4位显示计时时间,第6位显示速度。 {
unsigned char code digit[10]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f}; //0~9编码 unsigned char i; unsigned int mcc; if(key5){
for(i=0;i<=3;i++){ //如果按下key5进入计时设置功能,被选中的LED闪烁,其他正常显示
if(sdig==i&&srem>4) disp_send(0x00); else disp_send(digit[inset[i]]); }
}else{ //如果没按下key5,则当前显示速度信息 mcc=mcnt;
for(i=1;i<=4;i++){
disp_send(digit[mcc]); mcc/=10; }
}
disp_send(0x00); //数码管第5位不亮 disp_send(digit[speed]); //第6位显示速度 }
11
微机原理(单片机)课程设计报告
void disp_send (unsigned char c) //显示传递函数,用于把已编码的要显示信息发送到LED {
unsigned char i; for(i=1;i<=8;i++){ dispc=0;
dispd=c&0x80; c<<=1; dispc=1; } }
void key () interrupt 1 //按键判断 {
static unsigned char keylast=0xff,keypast=0xff; unsigned char keynow,i; TH0=TSETH;
keynow=P3|0x03;
if(keynow==keylast){ //判断两次按键是否相同,若不同,则把本次按键的值(keynow)赋给上次按键的值(keylast) if(key5){//是否按下key5
switch((~keynow)&keypast){ //如果按下key5,进入计时设置功能,并检测下一个按了哪个键
case 0x80: //按key1则左移位选 if(sdig==3) sdig=0; else sdig++; srem=100; break;
case 0x40: //按key2则右移位选 if(sdig==0) sdig=3; else sdig--; srem=100; break;
case 0x20: //按key3则数值+1 if(inset[sdig]==9) inset[sdig]=0; else inset[sdig]++; srem=95; break;
case 0x10: //按key4则数值-1 if(inset[sdig]==0) inset[sdig]=9; else inset[sdig]--;
12
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库智能电扇(3)在线全文阅读。
相关推荐: