首页 > 精品范文库 > 1号文库
单片机实训(精选5篇)
编辑:落霞与孤鹜齐 识别码:10-1066878 1号文库 发布时间: 2024-07-15 21:46:43 来源:网络

第一篇:单片机实训

#include //用AT89C51时就用这个头文件

//#include //用华邦W78E58B时必须用这个头文件 #include /*Intrins.h文件包含只是编译器产生嵌入原有代码的程序的原型*/

//注意那个LCD_Wait()函数,它是判“忙”标志的,在实际硬件要把注掉的那种打开

//Port Definitions********************************************************** sbitLcdRs = P2^0;sbit:特殊功能寄存器,位寻址,位变量名=特殊功能寄存器名^位位置

sbitLcdRw = P2^1;sbitLcdEn = P2^2;sfrDBPort = 0x80;//P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口

sfr特殊功能寄存器名=特殊功能寄存器地址常数

sfr16: 16位特殊功能寄存器,字寻址,低位在低字节,高

位在高字节

//内部等待函************************************************************************** unsigned char LCD_Wait(void){ LcdRs=0;LcdRw=1;_nop_();LcdEn=1;_nop_();

数 //while(DBPort&0x80);//在用Proteus仿真时,注意用屏蔽此语句,在调用GotoXY()时,会进入死循环,//可能在写该控制字时,该模块没有返回写入完备命令,即DBPort&0x80==0x80

//实际硬件时打开此语句

LcdEn=0;returnDBPort;} //向LCD写入命令或数据************************************************************ #define LCD_COMMAND

0

// Command #define LCD_DATA

// Data #define LCD_CLEAR_SCREEN 0x01

// 清屏 #define LCD_HOMING

0x02

// 光标返回原点 voidLCD_Write(bit style, unsigned char input){ LcdEn=0;LcdRs=style;LcdRw=0;_nop_();

} DBPort=input;_nop_();//注意顺序 LcdEn=1;_nop_();//注意顺序 LcdEn=0;_nop_();LCD_Wait();

//设置显示模式************************************************************ #define LCD_SHOW

0x04

//显示开 #define LCD_HIDE

0x00

//显示关

#define LCD_CURSOR

0x02 //显示光标 #define LCD_NO_CURSOR 0x00

//无光标

#define LCD_FLASH

0x01

//光标闪动 #define LCD_NO_FLASH 0x00

//光标不闪动

voidLCD_SetDisplay(unsigned char DisplayMode){ LCD_Write(LCD_COMMAND, 0x08|DisplayMode);}

//设置输入模式************************************************************ #define LCD_AC_UP

0x02 #define LCD_AC_DOWN 0x00

// default

#define LCD_MOVE

0x01

// 画面可平移 #define LCD_NO_MOVE 0x00

//default

voidLCD_SetInput(unsigned char InputMode){ LCD_Write(LCD_COMMAND, 0x04|InputMode);}

//初始化LCD************************************************************ voidLCD_Initial(){ LcdEn=0;LCD_Write(LCD_COMMAND,0x38);

//8位数据端口,2行显示,5*7点阵

LCD_Write(LCD_COMMAND,0x38);LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);

//开启显示, 无光标

LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);

//清屏

LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE);

//AC递增, 画面不动 } //************************************************************************ voidGotoXY(unsigned char x, unsigned char y){ if(y==0)

LCD_Write(LCD_COMMAND,0x80|x);if(y==1)

LCD_Write(LCD_COMMAND,0x80|(x-0x40));}

void Print(unsigned char *str){ while(*str!=''){

LCD_Write(LCD_DATA,*str);

str++;} } voidLCD_Print(unsigned char x, unsigned char y, unsigned char *str){ GotoXY(x,y);Print(str);}

#include //用AT89C51时就用这个头文件

//#include //用华邦W78E58B时必须用这个头文件 sbit DQ = P3^4;

//定义DQ引脚为P3.4 /***********ds18b20延迟子函数(晶振12MHz)*******/ /***********DS18B20对时间要求很严,但只能长不能短 ************在11.0592M下也行,因为时间长些********/ void delay_18B20(unsigned int i){ while(i--);

/**********ds18b20初始化函数**********************/

void Init_DS18B20(void){ unsigned char x=0;

DQ = 1;

//DQ复位

delay_18B20(8);//稍做延时

DQ = 0;

//单片机将DQ拉低

delay_18B20(80);//精确延时大于 480us

DQ = 1;

//拉高总线

delay_18B20(14);

x=DQ;

//稍做延时后如果x=0则初始化成功 x=1则初始化失败

delay_18B20(20);}

/***********ds18b20读一个字节**************/

unsigned char ReadOneChar(void){ unsigned char i=0;unsigned char dat = 0;for(i=8;i>0;i--)

{

DQ = 0;// 给脉冲信号

dat>>=1;

DQ = 1;// 给脉冲信号

if(DQ)

dat|=0x80;

delay_18B20(4);

} return(dat);}

/*************ds18b20写一个字节****************/

voidWriteOneChar(unsigned char dat){ unsigned char i=0;for(i=8;i>0;i--)

} } { DQ = 0;DQ = dat&0x01;delay_18B20(5);DQ = 1;dat>>=1;/**************读取ds18b20当前温度************/ unsigned char *ReadTemperature(char TH,charTL,unsigned char RS){ unsigned char tt[2];Init_DS18B20();

} WriteOneChar(0xCC);

// 跳过读序号列号的操作

WriteOneChar(0x4E);// //写入“写暂存器”命令,修改TH和TL和分辩率配置寄存器

//先写TH,再写TL,最后写配置寄存器 WriteOneChar(TH);//写入想设定的温度报警上限 WriteOneChar(TL);//写入想设定的温度报警下限 WriteOneChar(RS);//写配置寄存器,格式为0 R1 R0 1,1 1 1 1

//R1R0=00分辨率娄9位,R1R0=11分辨率为12位 delay_18B20(80);

// this message is wery important Init_DS18B20();WriteOneChar(0xCC);

// 跳过读序号列号的操作 WriteOneChar(0x44);// 启动温度转换

delay_18B20(80);

// this message is wery important Init_DS18B20();WriteOneChar(0xCC);//跳过读序号列号的操作

WriteOneChar(0xBE);//读取温度寄存器等(共可读9个寄存器)前两个就是温度 delay_18B20(80);tt[0]=ReadOneChar();

tt[1]=ReadOneChar();

return(tt);

//读取温度值低位

//读取温度值高位

#include //用AT89C51时就用这个头文件

//#include //用华邦W78E58B时必须用这个头文件 #include #include #include #include #include

//sbit DQ = P3^4;

//定义DQ引脚为P3.4 unsigned char t[2],*pt;

//用来存放温度值,测温程序就是通过这个数组与主函数通信的

unsigned char TempBuffer1[9]={0x2b,0x31,0x32,0x32,0x2e,0x30,0x30,0x43,''};

//显示实时温度,上电时显示+125.00C unsigned char TempBuffer0[17]={0x54,0x48,0x3a,0x2b,0x31,0x32,0x35,0x20,0x54,0x4c,0x3a,0x2b,0x31,0x32,0x34,0x43,''};

//显示温度上下限,上电时显示TH:+125 TL:+124C

unsigned char code dotcode[4]={0,25,50,75};/***因显示分辨率为0.25,但小数运算比较麻烦,故采用查表的方法******* 再将表值分离出十位和个位后送到十分位和百分位********************/

void covert0(unsigned char TH, unsigned char TL)//将温度上下限转换为LCD显示的数据 {

if(TH>0x7F)

//判断正负,如果为负温,将其转化为其绝对值

{

TempBuffer0[3]=0x2d;

//0x2d为“-”的ASCII码

TH=~TH;TH++;

}

else TempBuffer0[3]=0x2b;//0x2B为“+”的ASCII码

if(TL>0x7f)

{

TempBuffer0[11]=0x2d;

//0x2d为“-”的ASCII码

TL=~TL+1;

}

else TempBuffer0[11]=0x2b;//0x2B为“+”的ASCII码

TempBuffer0[4]=TH/100+0x30;

//分离出TH的百十个位

if(TempBuffer0[4]==0x30)TempBuffer0[4]=0xfe;//百位数消隐

TempBuffer0[5]=(TH%100)/10+0x30;

//分离出十位

TempBuffer0[6]=(TH%100)%10+0x30;

//分离出个位

TempBuffer0[12]=TL/100+0x30;

//分离出TL的百十个位

if(TempBuffer0[12]==0x30)TempBuffer0[12]=0xfe;//百位数消隐

TempBuffer0[13]=(TL%100)/10+0x30;

//分离出十位

TempBuffer0[14]=(TL%100)%10+0x30;

//分离出个位 }

void covert1(void)//将温度转换为LCD显示的数据 { unsigned char x=0x00,y=0x00;t[0]=*pt;pt++;t[1]=*pt;

if(t[1]>0x07)

//判断正负温度

{

TempBuffer1[0]=0x2d;

//0x2d为“-”的ASCII码

t[1]=~t[1];

/*下面几句把负数的补码*/ t[0]=~t[0];

/* 换算成绝对值*********/ x=t[0]+1;

/***********************/ t[0]=x;

/***********************/ if(x>255)

/**********************/ t[1]++;

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

}

else TempBuffer1[0]=0x2b;//0xfe为变“+”的ASCII码

t[1]<<=4;//将高字节左移4位

t[1]=t[1]&0x70;//取出高字节的3个有效数字位

x=t[0];

//将t[0]暂存到X,因为取小数部分还要用到它

x>>=4;

//右移4位

x=x&0x0f;

//和前面两句就是取出t[0]的高四位

t[1]=t[1]|x;

//将高低字节的有效值的整数部分拼成一个字节

TempBuffer1[1]=t[1]/100+0x30;

//+0x30 为变 0~9 ASCII码

if(TempBuffer1[1]==0x30)TempBuffer1[1]=0xfe;//百位数消隐

TempBuffer1[2]=(t[1]%100)/10+0x30;

//分离出十位

TempBuffer1[3]=(t[1]%100)%10+0x30;

//分离出个位

t[0]=t[0]&0x0c;

//取有效的两位小数

t[0]>>=2;

//左移两位,以便查表

x=t[0];

y=dotcode[x];

//查表换算成实际的小数

TempBuffer1[5]=y/10+0x30;

//分离出十分位

TempBuffer1[6]=y%10+0x30;

//分离出百分位 }

void delay(unsigned char i){ while(i--);}

main(){ unsigned char TH=110,TL=-20;

//下一步扩展时可能通过这两个变量,调节上下限

//测温函数返回这个数组的头地址 while(1){

pt=ReadTemperature(TH,TL,0x3f);//上限温度-22,下限-24,分辨率10位,也就是0.25C

} }

delay(100);covert1();covert0(TH,TL);

//读取温度,温度值存放在一个两个字节的数组中, LCD_Initial();

//第一个参数列号,第二个为行号,为0表示第一行

//为1表示第二行,第三个参数为显示数据的首地址 LCD_Print(0,0,TempBuffer0);LCD_Print(0,1,TempBuffer1);

第二篇:单片机实训

单片机应用课程设计教学大纲

开课学院:机电工程学院 适用专业:电子科学与技术 课程编号:2009404 课程英文名称:Single-chip Microcomputer Application System Design 实验课程总学时:36 实验课程总学分:1

一、课程性质和目的:

单片机原理及应用是一门技术性、应用性很强的学科,实验教学是它的一个极为重要的教学环节,除实验教学环节,单片机课程设计也是重要的实践教学环节,通过这一环节可使学生不但能够将课堂上学到的理论知识与实践应用结合起来,而且能够对电子电路、电子元器件、印制电路板等方面的知识进一步加深认识,同时在软件编程、排错调试、相关仪器设备的使用技能等方面得到较全面的锻炼和提高,为今后能独立进行单片机应用系统的开发设计工作打良好的基础。

二、本课程与其它课程的联系与分工

先修课程:电路分析、模拟电路、数字电路、微机原理、单片机、电子线路常用软件 后续课程:传感器技术、数字信号处理等

三、单片机课程设计的基本要求

1、原则上每生一项设计,不能重复设计。

2、项目大的可多人从事,但每人必须承担足够的设计任务。

3、项目结题需要提供电路图、程序清单、设计说明书等资料,还要提供实物作品,运行照片等。

4、参加科技节展出及评奖的作品,要给与适量的加分。优秀的设计人员优先推荐参加省机电大赛或电子大赛。

5、整个课程设计过程中,严格执行考核制度,对于无故旷课、扰乱课堂秩序、玩游戏、玩手机、不从事设计和制作的行为给予严肃处理。

6、对于课堂表现好的同学,进行加分奖励。

四、课程设计的实施过程

1、基本开发工具的使用

电路设计及仿真运行工具Proteus软件、编程及编译环境Keil uVision软件、程序烧写器的使用及驱动程序的安装。

2、单片机应用系统的搭建方法

电源的设计、振荡电路参数的选择、复位电路的设计、内置及外置程序程序存储器的选择,各端口的驱动能力及接口方法。

3、学生实践能力的摸底测试

通过简单的单片机应用设计,如:流水灯、数码显示、键盘控制等,进行软环境编程测试及硬环境测试。

软环境测试:利用Proteus、Keil C51 进行仿真测试。硬环境测试:搭建具体电路,利用编程器烧写程序,进行调试。

4、选择设计题目

学生可根据自身能力和爱好,选择或自拟设计题目,并进行系统的分析和调研、可行性分析、性价比分析,形成设计任务书。指导教师处备案。

5、确定实施方案

经过方案论证,找出最优化的实施方案。以此评价开发思路。

6、加强指导

指导教师对学生的共性问题进行集中指导,对零散问题进行分别指导。

7、硬件电路设计

根据实施方案,利用Proteus软件设计原理图。原理图的质量作为考核依据。

8、软件设计

根据系统工作过程画出各部分流程图,根据流程图编写程序并进行整合,程序和流程图的质量作为考核依据。

9、仿真调试

编译后的程序加载到原理图上进行仿真,调试,调试成功后的仿真图片作为考核的依据。

10、电路搭建

根据电路原理图设计,进行布线图设计。购买电子元件,焊接线路板,线路板的焊接质量作为考核依据。

11、系统调试

系统调试成功之后,考察功能实现情况,作为考核依据。

12、撰写课程设计论文

要求从选题、论证、设计、仿真、调试、形成作品到感想写入论文内,要符合正规论文格式。

五、考核方案

1、考核分四部分进行:实物作品、课程设计论文、平时成绩、课堂表现

2、实物作品从实现功能和焊接质量进行评分,占总成绩的40%。

3、课程设计论文从论文的规格、要求进行评分,占总成绩的30%。

4、平时成绩就是平时阶段性的检查成绩,占总成绩的20%。

5、课堂表现指出勤、课堂纪律,占总成绩的10%。

6、科技节加分:一等奖5分、二等奖4分、三等奖3分、参展2分。

六、单片机课程设计题目(备选)

1、基于单片机的智能电压表设计

2、基于单片机的LED流水灯系统设计

3、基于单片机的智能船模设计

4、基于单片机的电梯控制模型设计

5、基于单片机的水位控制系统设计

6、基于单片机的多路数据采集系统设计

7、基于单片机的抢答器设计

8、基于单片机的数字温度计设计

9、基于单片机的智能小车设计

10、基于单片机的遥控器设计

11、基于单片机的串行通信发射机设计

12、基于单片机的简易智能电动车设计

13、基于单片机的太阳能热水器控制器设计

14、MCS-51单片机温度控制系统的设计

15、直流电动机的转速检测与脉宽调速

16、基于单片机的智能机器人的设计

17、基于单片机的简易无线竞赛系统的设计

18、基于单片机的车辆闯红灯监控系统设计

19、基于单片机控制的井下瓦斯监控系统设计 20、基于单片机的煤气泄漏检测报警装置设计

21、基于单片机的井式渗碳炉控制系统设计

22、基于单片机的蔬菜大棚温湿度智能控制系统设计

23、基于单片机的电子钟设计

24、基于单片机的液位控制器设计(8051)

25、基于单片机的点阵电子显示屏设计

26、基于单片机的智能寻迹避障小车设计

27、基于单片机的热敏电阻测温系统设计

28、基于单片机的智能型电话远程遥控器设计

29、基于单片机的数控直流电源设计 30、基于单片机的电子万年历设计

31、基于单片机的红外防盗报警器设计

32、基于单片机的花卉温室控温系统设计

33、基于单片机的焊机温度控制系统设计

34、基于单片机的路灯控制器设计

35、基于单片机的车床刀架控制系统设计

36、基于单片机的电机智能综合保护装置设计

37、基于单片机的太阳能热水器控制器设计

38、基于单片机的智能型矿用磁力启动器设计

39、基于单片机的无氧退火炉温控系统设计

40、基于单片机的电厂锅炉过热蒸汽温度监测系统设计

41、基于单片机的摩托车里程表研制

42、基于单片机的自动车库门的设计

43、基于单片机的自动滴灌控制系统的设计

44、基于单片机的预付费电度表设计

45、基于单片机的智能电子秤设计

46、基于单片机的油井巡视定位系统设计

47、基于单片机的照明控制系统

48、基于单片机的锅炉液位控制系统设计

49、基于单片机的洗衣机设计

50、基于单片机的锅炉汽包水位控制系统设计

51、基于单片机的多功能秒表设计

52、基于单片机的无线监护系统的设计

53、基于串行通信的红外线智能家电控制系统

54、基于单片机的智能遥控器设计

56、基于单片机的公用电话网远程控制器的设计

57、基于单片机的多功能节能微波炉控制器设计

58、基于单片机的多功能数显表设计(气压、冲击频率)

59、基于单片机的仓库温湿度测量仪设计 60、基于单片机的自动加料系统 62、基于单片机的远程温度显示系统

63、基于89C51单片机的传感器水位测量系统 64、基于51单片机的广告灯设计 65、基于单片机的水箱水位控制系统设计 66、动态电子秤设计

67、基于单片机的非接触式热量测量系统设计 68、基于单片机的非接触式位移传感器设计 69、基于单片机的非接触式温度测试仪设计 70、基于单片机的工业电加热炉的微机控制系统设计 71、基于单片机的户用超声波热量表设计 72、基于单片机的火灾自动探测报警系统设计 73、基于单片机的住宅智能化险情报警系统设计 74、基于单片机的数字温度测量及显示系统设计 75、火灾自动报警系统设计

76、基于GSM短信模块的家庭防盗报警系统 77、基于GSM模块的车载防盗系统设计 78、基于单片机的16×16点阵(滚动显示)79、基于单片机的仓库温湿度的监测系统 80、基于单片机的点阵电子显示屏设计 81、基于单片机的电子密码锁设计 82、基于单片机的温度远程显示实现 83、基于单片机的直流电机控制系统 84、基于单片机的自动加料机控制系统 85、数控直流稳压电源设计

86、智能型充电器的电源和显示的设计 87、基于CPLD的出租车计价器设计 88、基于IC卡的楼宇门禁系统的设计 89、基于SPCE061A的语音遥控小车设计 90、基于单片机的短信收发系统设计

91、智能机器人的研究与设计(自动循轨和语音控制的实现)92、PC机与单片机的串口通信 93、基于单片机的红外线防盗报警系统 94、基于单片机的转速测量系统设计 95、基于单片机的电梯控制模型设计与仿真

学习参考资料:

1、谢维成 杨加国:《单片机原理与应用及C51程序设计》,清华大学出版社,202_年7月第2版

2、彭伟主编:《单片机C语言程序设计实训100例——基于8051+Proteus仿真》,电子工业出版社,202_年6月第1版

3、周兴华主编:《手把手教你学单片机C程序设计》,北京航空航天大学出版社,202_年10月 第1版

学习参考网站:

http://xxgcxy.qdbhu.edu.cn/jsjdlzzsx/index.html http://www.teniu.cc

执笔人:陈振军

编写日期:202_年3月5日 审核人:

第三篇:单片机实训报告范文

四川电子机械职业技术学院

单片机原理及应用

实 训报告1

班级:应电14.2班 姓名:刘华利 学号:140302058 指导教师:向兵

四川电子机械职业技术学院

摘要:

《单片机应用系统设计项目化教程》这本书根据教育部新的教学改革要求和企业岗位技能需求,以高技能应用型人才专业能力培养为目标,结合作者多年的教学经验与课程改革成果进行编写。全书通过6个典型项目任务,着重介绍单片机基本原理及应用系统的设计方法与技巧,包括流水灯控制系统设计、简易数字时钟设计、数字电压表设计、低频信号发生器设计、数据存储及回放系统设计和窗帘智能控制系统设计等。本书采用“理实一体、项目化教学”模式进行内容编排,将单片机原理及应用系统设计的相关知识点融入项目中进行讲解,易教易学,效果良好。

目录

摘要········································ 2 目录········································ 2 实训名称···································· 3 实训地点···································· 3 实训时间···································· 3 实训目的···································· 3 实训项目···································· 3 项目1·······································3 项目2·······································4 项目3·······································5 项目4·······································6 实训总结····································· 7

四川电子机械职业技术学院

实训名称:单片机原理及应用 实训地点:行政楼523 实训时间:202_.6.27—6.30 实训目的:1、2、3、4、5、6、7、掌握结构化程序设计的基本方法,基本掌握面向对象程序设计的基本思路和方法。

掌握C的基本概念和基础知识。

通过训练能够读懂较为复杂的C语言源程序并具备基本C语言程序设计的能力。

熟练掌握各种常用类的定义继承文件的应用,为更好的理解面向对象打下更好的基础。

掌握面向对象的基本原理,提高学生综合程序设计的能力。

培养自己独立解决问题,找资料的能力。同学之间相互帮助、相互交流、相互合作的团队精神。

通过实训检查自己学习上的不足,达到熟练掌握C语言的基本知识和技能。

实训项目: 项目1 点亮一个LED,每隔一定时间循环熄灭、点亮…

设计思路:端口送高电平,led熄灭,延时1s,端口送低电平,led点亮,延时1s,就这样一直循环。

程序

#include } typedef unsigned char UINT8;void main(void)typedef unsigned int UINT16;{ void DelayMs(UINT16 Ms)while(1){ { UINT8 i;

L2 = 1;

while(Ms--)

DelayMs(1000);

{

L2 = 0;

for(i = 0;i < 114;i+

DelayMs(1000);+);} } }

四川电子机械职业技术学院

原理图

项目2 点亮一个LED,让它每隔一定时间循环左移(课使用delay函数进行延时)

设计思路:在项目1的的基础上,用dalay函数进行延时,用<<来表示左移,添加一个左移的函数。通俗一点的讲的话,就如天天天同一些人排队领东西,领完了返回队位继续排(当然一只是这几个人排)。

程序

#include void delay(unsigned int z){ unsigned intj,i;for(i=0;i

}

while(1){

for(i=0;i<7;i++){

delay(100);

LED=(LED<<1)|0x01;P3=LED;} }

四川电子机械职业技术学院

原理图

项目3 将任务二中delay延时改用定时器延时,且延时一秒

设计思路:在项目2的的基础上,用定时器来进行延时,首先设置定时器工作方式 也就是TMOD,在设置TH0/1,TL0/1的初值,也就是定时时间的设置,然后设置中断允许,并开中断。用中断来控制。

程序

#include char j=0,i=0;void main(){ TMOD=0X01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;while(1);} void T0_time()interrupt 1

{ TH0=(65536-50000)/256;TL0=(65536-50000)%256;j++;if(j==5){

j=0;

P1=~(0x01<

if(++i==8)i=0;

} }

四川电子机械职业技术学院

原理图

项目4 四位数码管并排显示,从左到右依次为分、秒十位、秒各位、0.1秒,相当于移动可计时9分59.9秒,使用一个按键,当按键第一次按下,启动秒表,第二次按下,停止,第三次按下,清零。(数码管可选共阴极、共阳极,至于对应数字的段选可参考教材)

设计思路:用delay函数来进行延时,用内部中断来控制T1,用外部中断来实现计数、暂停、清零这三个功能。

程序

#include #define uint unsigned int #define uchar unsigned char sbitdp=P0^7;uchar code Tab[]={0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8,0x80,0x90};ucharxiao,miao,fen;uchart,swnum=0;void delay(uint z){

uintx,y;

for(x=100;x>0;x--)

for(y=z;y>0;y--);}

void dihplay(){

P1=0xfd;

四川电子机械职业技术学院

P0=Tab[xiao%10];

delay(1);

} void display(){

P1=0xfb;P0=Tab[miao/10];delay(1);

P1=0xfe;P0=Tab[miao%10];dp=0;delay(1);}

void dimplay(){

P1=0xf7;P0=Tab[fen%10];dp=0;delay(1);}

void main(){

EA = 1;EX0 = 1;IT0 = 1;

ET0=1;TMOD=0x01;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

TR0=0;xiao=0;miao=0;fen=0;

while(1)

{

display();delay(1);dimplay();delay(1);dihplay();delay(1);

} }

void timer0()interrupt 1 {

xiao++;

if(xiao==10)

{

xiao=0;miao++;

if(miao==59)

{ miao=0;

fen++;

if(fen==10)

{ fen=0;

}

}

} }

void ex0_int0()interrupt 0 { swnum++;if(swnum == 1){

TR0= 1;} if(swnum == 2){

TR0 = 0;} if(swnum == 3){

xiao = 0;

miao = 0;

fen = 0;

swnum=0;} }

四川电子机械职业技术学院

原理图

实训总结:

通过今次单片机实训,使我对单片机的认识有了更深刻的理解。系统以51单片机为核心部件,利用C语言编程,通过对led灯控制到用数码管实现秒表功能、中断控制功能,能实现本设计题目的基本要求和发挥部分。由于时间有限和本身知识水平的限制,本系统还存在一些不够完善的地方,要作为实际应用还有一些具体细节问题需要解决。

踉踉跄跄地忙碌了一周,我的程序终于编译成功。当看着自己的程序,自己成天相伴的系统能够健康的运行,真是莫大的幸福和欣慰。我相信其中的酸甜苦辣最终都会化为甜美的甘泉。

但在这次实训中同时使我对C语言有了更深的认识。当我第一次接触C语言就感觉很难,特别是今次实训要用到C语言,尽管困难重重,可我们还是克服了。这次的实训使培养了我们严肃认真的做事作风,增强了我们之间的团队合作能力,使我们认识到了团队合作精神的重要性。

这次实训的经历也会使我终身受益,我感受到这次实训是要真真正正用心去做的一件事情,是真正的自己学习的过程和研究的过程,没有学习就不可能有研究的能力,没有自己的研究,就不会有所突破。希望这次的经历能让我在以后学习中激励我继续进步。

第四篇:单片机实训总结

一、任务与目的

 本课程的实训是使我们综合应用所学习的理论知识,使用STAR-MT51实验板完成单片机控制下的实时温度测量及显示的软件编程。

本课程实训涉及的知识包括:单片机的最小系统、单片机人机接口电路(独立式键盘、LED显示)、8位数码管的驱动电路、18B20温度芯片的应用等。

二、原理(条件)

1. LED发光二极管

一般的发光二极管的导通压降为1.7V~1.9V,工作电流为5mA~10mA 2.LED数码管显示接口

LED数码管是利用多个LED组合而成的显示设备,可以显示0-9等10个数字和某些字母,在许多的数字系统中作为显示输出设备,使用非常广泛。数码管内部字段LED和引脚分布图。它的结构是由发光二极管构成的a、b、c、d、e、f和g七段

LED内部的所有发光二极管有共阴极接法和共阳极接法两种:一种是将LED内部所有二极管阳极接在一起并通过com引脚引出,将每一个发光二极管的另一端分别引出到对应的引脚,称之为共阳极LED显示器

另一种是将LED内部所有发光二极管的阴极都连在一起的,称之为共阴极LED显示器

LED用于显示数字、字母或符号时,必须将要显示的内容转换为LED对应七段码的信息,共阴和共阳结构的LED显示器各笔划段名和安排位置是相同的。当发光二极管导通时,相应的笔划段发亮,即通过点亮不同的LED字段,可显示数字0,1,┅,9和A,b,C,d,E,F等不同的字符及自定义的一些简单符号。8个笔划段dp g f e d c b a对应于一个字节(8位)的D7 D6 D5 D4 D3 D2 D1 D0,于是用8位二进制码就可以表示要显示字符的字形代码。

3. 独立式键盘接口

(1)监测有无键按下;键的闭合与否,反映在电压上就是呈现出高电平或低电平,所以通过电平的高低状态的检测,便可确认按键按下与否。

(2)判断是哪个键按下。(3)完成键处理任务。

需注意事项:

① 电路或软件的角度应解决的问题-----------消除抖动影响

键盘按键所用开关为机械弹性开关,利用了机械触点的闭合、断开作用。为了确保CPU对一次按键动作只确认一次,必须消除抖动的影响。按键的消抖,通常有软件、硬件两种消除方法。

软件消抖:在第一次检测到有键按下时,执行一段延时10ms的子程序后,再确认电平是否仍保持闭合状态电平,如果保持闭合状态电平,则确认有键按下,进行相应处理工作。

②键盘电路结构

独立式按键就是各按键相互独立,每个按键单独占用一根I/O口线,每根I/O口线的按键工作状态不会影响其他I/O口线上的工作状态。因此,通过检测输入线的电平状态可以很容易判断哪个按键被按下了。优点:电路配置灵活,软件结构简单。

缺点:每个按键需占用一根I/O口线,在按键数量较多时,I/O口浪费大,电路结构显得复杂。因此,此键盘是用于按键较少或操作速度较高的场合。

4.定时器中断

定时/计数器是单片机的重要部件,其工作方式灵活,编程简单,使用方便。89C51单片机内有2个16位可编程的定时器/计数器,分别为T0和T1。定时器/计数器T0、T1核心组成部分为16位的加1计数器,它们的工作状态和工作方式分别由两个特殊功能寄存器TCON和TMOD来决定。

定时器/计数器T0、T1可以有四种不同的工作方式:方式0、方式

1、方式

2、方式3。

方式1 当TMOD中M1M0 = 01时,定时器/计数器选定方式1进行工作。下图是T0工作在方式1下的逻辑结构图(T1与其完全一致)。两个8位寄存器TH0和TL0构成了一个16位的定时器/计数器。

在该工作方式下,当作为定时器使用时,按定时时间计算计数初值。方式2 工作方式2,其逻辑结构如下图所示。该方式下,16位计数器被分为两个8位寄存器:TL0和TH0,其中TL0作为计数器,TH0作为计数器TL0的初值预置寄存器,并始终保持为初值常数。TH0的内容重新装入TL0后,其自身保持不变。这样计数器具有重复加载、循环工作的特点,可用于产生固定脉宽的脉冲信号。

这样省掉了工作方式0、方式1一定要通过软件给计数器重新赋初值的麻烦,并提高了计数精度。该工作方式下,当作为定时器使用时,按定时时间计算计数初值

三、内容与步骤

本实训采用STAR-MT51实验板,编写程序完成指导教师指定的项目内容。

1、LED指示灯闪烁。2、8位数码管的指定显示内容。

3、数字时钟显示。

(一)熟悉STAR-MT51结构,复习单片机接口电路内容 编写第一个程序,控制LED指示灯闪烁

1、建立项目文件,掌握头文件的使用

2、熟悉单片机C文件编写规范,变量定义,程序注释写法等

3、熟练掌握KEIL C51调试环境,熟悉编译,设置,在线观察参数

4、编写LED指示灯亮灭的程序控制

5、添加延时子函数,掌握无传递参数的子函数编写

6、实现LED指示灯闪烁

程序:

#include unsigned char k;void delayms(unsigned char ms);main(){ while(1){

P0 = 0x01;

P0 = 0x01;

for(k=0;k<8;k++)

{

P0 = << 1;

delayms(1000);

}

for(k=0;k<8;k++)

{

P0 = << 1;

delayms(1000);

}

if(P0!=0xBF)

{

P0 = ~(0xfe << 1)+ 1;

P0 = 0xaa;

}

else

{ P0 = 0xFF;

P1 = ~(0x01 << k);

}

}} void delayms(unsigned char ms)// 延时子程序

{

unsigned char i;while(ms--){

for(i = 0;i < 120;i++);} }

(二)熟悉按键的电路及软件编程,编写对应程序,结合程序一实现按键控制LED指示灯闪烁

编写第二个程序,控制8位数码管的显示

1、建立项目文件,掌握头文件的使用

2、熟悉单片机C文件编写规范,变量定义,程序注释写法等

3、熟练掌握KEIL C51调试环境,熟悉编译,设置,在线观察参数

4、编写8位数码管的静态显示

5、添加显示子函数,掌握带传递参数的子函数编写

6、结合延时子程序,实现8位数码管的指定显示内容 程序:

#include unsigned char a[8]={0xf9,0xa4,0xb0,0X99,0X92,0X82,0XF8,0X80};unsigned char b[8]={0xfe,0xfd,0xfb,0XF7,0XEF,0XDF,0XBF,0X7F};unsigned char k;void delayms(unsigned char ms);void main(){ while(1){ for(k=0;k<8;k++){P0=a[k];P2=b[k];P2 = 0xff;}} } void delayms(unsigned char ms)

// 延时子程序

{

unsigned char i;while(ms--){

(三)熟悉单片机定时器中断的相关内容,设计软件编写方案,实现时钟显示 编写第三个程序,控制8位数码管的显示时间

1、建立项目文件,掌握头文件的使用

2、熟悉单片机C文件编写规范,变量定义,程序注释写法等

3、熟练掌握KEIL C51调试环境,熟悉编译,设置,在线观察参数

4、编写8位数码管时钟显示软件

5、结合蜂鸣器的控制,编写带闹钟功能的时钟控制软件。

程序:

/*P1.4小时调整 P1.5分种调整*/ #include #include unsigned char data dis_digit;unsigned char key_s, key_v;unsigned char code dis_code[11]={0xc0,0xf9,0xa4,0xb0, // 0, 1, 2, 3 0x99,0x92,0x82,0xf8,0x80,0x90, 0xff};// 4, 5, 6, 7, 8, 9, off unsigned char data dis_buf[8];unsigned char data dis_index;unsigned char hour,min,sec;unsigned char sec100;

sbit k1 = P1^4;sbit k2 = P1^5;bit scan_key();//sao miao void proc_key();//chu li void inc_sec();void inc_min();void inc_hour();void display();void delayms(unsigned char ms);void main(void){ P0 = 0xff;P2 = 0xff;TMOD = 0x11;// 定时器0, 1工作模式1, 16位定时方式

TH1 = 0xdc;TL1 = 0;

TH0 = 0xFC;TL0 = 0x17;hour = 12;min = 00;sec = 00;

sec100 = 0;dis_buf[0] = dis_code[hour / 10];// 时十位

dis_buf[1] = dis_code[hour % 10];// 时个位

dis_buf[3] = dis_code[min / 10];// 分十位

dis_buf[4] = dis_code[min % 10];// 分个位

dis_buf[6] = dis_code[sec / 10];// 秒十位

dis_buf[7] = dis_code[sec % 10];// 秒个位

dis_buf[2] = 0xbf;

// 显示“-” dis_buf[5] = 0xbf;

// 显示“-”

dis_digit = 0xfe;dis_index = 0;

TCON = 0x01;IE = 0x8a;

// 使能timer0,1 中断

TR0 = 1;TR1 = 1;key_v = 0x03;

while(1){ if(scan_key()){

delayms(20);

if(scan_key())

proc_key();

} } } bit scan_key(){ if((k1 == 1)&(k2==1))return(0);else return(1);} void proc_key(){ EA = 0;if(k2 == 0){

inc_hour();

while(k2 == 0);

} if(k1 == 0){//inc_min();while(k2 == 0);

min++;

if(min > 59)

min = 0;dis_buf[3] = dis_code[min / 10];// 分十位

dis_buf[4] = dis_code[min % 10];// 分个位

while(k1 == 0);} EA = 1;} void timer0()interrupt 1 // 定时器0中断服务程序, 用于数码管的动态扫描

// dis_index---显示索引, 用于标识当前显示的数码管和缓冲区的偏移量

// dis_digit---位选通值, 传送到P2口用于选通当前数码管的数值, 如等于0xfe时, //

选通P2.0口数码管 // dis_buf---显于缓冲区基地址

{ TH0 = 0xFC;TL0 = 0x17;

P2 = 0xff;

// 先关闭所有数码管

P0 = dis_buf[dis_index];

// 显示代码传送到P0口

P2 = dis_digit;

// dis_digit = _crol_(dis_digit,1);// 位选通值左移, 下次中断时选通下一位数码管

dis_index++;

// dis_index &= 0x07;// 8个数码管全部扫描完一遍之后,再回到第一

个开始下一次扫描

} void timer1()interrupt 3 { TH1 = 0xdc;sec100++;

if(sec100 >= 100){

sec100 = 0;

inc_sec();} } void inc_sec(){ sec++;if(sec > 59){

sec = 0;

inc_min();} dis_buf[6] = dis_code[sec / 10];// 秒十位

dis_buf[7] = dis_code[sec % 10];// 秒个位

} void inc_min(){ min++;if(min > 59){

min = 0;

inc_hour();} dis_buf[3] = dis_code[min / 10];// 分十位

dis_buf[4] = dis_code[min % 10];// 分个位 } void inc_hour(){ hour++;if(hour > 23){

hour = 0;} if(hour > 9)

dis_buf[0] = dis_code[hour / 10];// 时十位

else

dis_buf[0] = 0xff;// 当小时的十位为0时不 显示

dis_buf[1] = dis_code[hour % 10];} void delayms(unsigned char ms)// 延时子程序

{

unsigned char i;while(ms--){

for(i = 0;i < 120;i++);}}

// 时个位

四、数据处理(现象分析)

五、结论

六、参考资料

《单片机原理应用》、《单片机原理及连接口技术》、《单片机微型计算机原理接口及应用》、《单片机原理及系统设计》、《单片机应用新技术教程》。

七、评语

第五篇:单片机实训报告

单片机原理及应用

实训报告

班级: 学号: 姓名: 指导教师: 实训总成绩:

一、节日彩灯设计

题目:8位逻辑电平模块上的LED小灯从左向右呈现“鞭甩”的实验现象,状态间隔为0.25秒;按键1开始,按键2结束。

原理图

程序代码:

#include #define uchar unsigned char uchar tab[]={0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00};sbit S1=P1^4;sbit S2=P1^7;unsigned char i,j;delay(unsigned int x){ for(j=0;j

单片机原理及应用实训报告

管及驱动电路的连接,从而构成一个完整的硬件电路。然后通过对单片机的ROM进行编程,实现对彩灯闪烁的控制。

二、定时器实现流水灯

题目:利用定时器/计数器T0产生2秒钟的定时,每当2秒定时到来时,更换指示灯点亮,依次循环点亮。

原理图

程序代码

#include #include int lamp = 0xfe;int cnt = 0;main(){P2 = 0xfe;TMOD = 0x01;TL0 =(6553650000)/ 256;TR0 = 1;ET0 = 1;

50000)% 256;TH0 =(65536

单片机原理及应用实训报告

程序代码

#include unsigned char seg[]={0xf9,0xa4,0xb0,0x99,0x92};unsigned char i,j;sbit P1_7=P1^7;delay(unsigned int x){ for(j=0;j

单片机原理及应用实训报告

实训总结

通过本次单片机实训使得我更深层次的学习单片机原理与应用技术这门专业课程,同时对KEIL软件进行复习。这次实训是我看到了我最薄弱的一点那就是编程,对于编程有很大的困难。对以往学习过的编程知识没有好好掌握,特别是编程这方便的知识很薄弱。学习过的知识在实际应用中仿佛是冰山一角,完全不够用,需要通过查阅很多资料才能解决到碰到的相关问题。而且实训中出现的问题都是实际应用出比较典型的问题。这次实训还让我深刻的体会了结构化程序设计的优势,让我懂得当我们要进行一个复杂的程序设计时应该先将其分解为多个不同的功能模块再分别编程实现,这样做不仅降低了编程的难度,也容易让编程者思路更加清晰,避免出现不必要的错误。在做仿真时,仿真图正确也不一定就是说明一定正确。

单片机实训(精选5篇)
TOP