当前位置:文档之家› 单片机控制语音计算器总结报告

单片机控制语音计算器总结报告

单片机控制语音计算器总结报告
单片机控制语音计算器总结报告

电子技术综合设计

总结报告

姓名:学号:

专业与班级:

设计题目:单片机控制语音计算器

时间: 2013 ~ 2014 学年第(1)学期指导教师:成绩:日期:

目录

1.课题任务

1.1基础任务

1.2扩展任务

2. 方案比较与选择

2.1方案比较

2.1.1数码管显示计算器

2.1.2液晶屏显示计算器

2.2方案选择

3. 硬件设计

3.1电路设计

3.1.1最小系统电路模块

3.1.2稳压电路模块

3.1.3液晶屏显示电路模块

3.1.4语音芯片电路模块

3.1.5矩阵键盘电路模块

3.2矩阵键盘电路模块

3.3电路模块组装

4.软件设计

4.1主程序

4.2键盘扫描程序

4.3液晶屏显示程序

4.4延迟程序

5. 测试方案与系统调试

5.1 Protues软件仿真

5.2单片机开发板调试

6.实验总结

1.课题任务

本次电子设计我们选择一个自选课题——51单片机控制语音液晶屏计算器,设计的主要任务包括两个部分:基础任务与扩展任务。

1.1基础任务

基础部分实现的功能:加减乘除的初级预算。键盘部分采用4*4矩阵键盘包括0~9十个数字键,加减乘除四个运算键,一个等于,一个小数点。

1.3 扩展任务

该部分实现的功能有:语音报数,带有优先级的四则多级预算,三角函数与反三角函数的预算,开根号、阶乘运算与幂运算,此外还包括一个第二功能键,一个圆周率键,一个储存上次预算结果的Ans键。因此需扩展一个矩阵键盘,即使用两个4*4矩阵键盘作为计算器键盘。

2.方案设计

2.1方案比较

计算器的实现主要有两个方案,这两个方案的区别主要在于显示部分。目前计算器的显示主要有两种:数码管显示,液晶屏显示。

2.1.1数码管显示计算器

硬件主要由四部分组成,STC89C51单片机芯片作为控制中心,两个4*4的键盘作为输入端,一个排阻(10K)做为P0口的上拉电阻,采用八个共阳极的数码管作为计算器的显示模块,并且利用3-8译码器作为数码管的片选,一个P0口作为八段数码管位选。

2.1.2液晶屏显示计算器

与数码管显示计算器,硬件主要由四部分组成,STC89C51单片机芯片作为控制中心,两个4*4的键盘作为输入端,一个排阻(1K)做为P0口的上拉电阻,区别在于采用LCD1602液晶屏作为计算器的显示模块,P2.1、P2.2、P2.3分别作为液晶屏的读写控制与使能段,P0口作为液晶屏数据输入端。

2.2方案选择

经过小组的讨论,决定设计制作液晶屏计算器。理由如下:一、液晶屏显示,可以显示更多的位数,且可以进行两行同时显示,因此可以同时保留运算表达式及运算结果;二、采用液晶屏显示,控制起来更方便,程序更简练,减少了程序设计的复杂性。

我们要设计的计算器根据其选用硬件及功能可称为:51单片机控制语音液晶

屏计算器,该计算器除具有四则运算,三角函数运算等功能外,还可进行语音报数功能。

3.硬件设计

3.1电路设计

设计制作51单片机控制语音电子计算器的电路采用模块化的设计方法,电路主要由五部分组成:最小系统电路模块、稳压电路模块、液晶屏显示电路模块、语音芯片电路模块、矩阵键盘模块。原理框图如下:

3.1.1最小系统电路模块

最小系统为51单片机最小系统,包括STC89C51单片机芯片,复位电路,晶振电路。

STC89C51单片机芯片是一个40引脚8位处理芯片内部,内部有数据存储器和程序存储器,5个中断源,4个P口,其中P0口需接上拉电阻。

复位电路由电容串联电阻构成,系统一上电,RST脚将会出现高电平,并且,这

个高电平持续的时间由电路的RC值来决定。

晶振电路为单片机提供时钟信号,由晶振和电容组成,典型的晶振取11.0592MHz或12MHz。

最小系统电路图如下:

3.1.2稳压电路模块

稳压电路采用LM317三端稳压集成芯片结合一些电容、电阻和二极管设计而成,LM317是应用最为广泛的电源集成电路之一,它不仅具有固定式三端稳压电路的最简单形式,又具备输出电压可调的特点。此外,还具有调压范围宽、稳压性能好、噪声低、纹波抑制比高等优点。本电路采用8v电源供电,可稳定输出1.25~12V的直流电。

稳压模块电路图如下:

3.1.3液晶屏显示电路模块

液晶屏采用LCD1602A作为显示模块,加一些电容作为电压滤波,加一个电位器调节显示清晰度。

LCD1602采用标准的16脚接口,其中:

第1脚:VSS为地电源

第2脚:VDD接5V正电源

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

第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。

第5脚:RW为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。

第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。

第7~14脚:D0~D7为8位双向数据线。

第15~16脚:A,K为LCD背光电源正负极。

液晶屏显示电路电路图如下:

3.1.4语音芯片电路模块

采用YF017作为语音的输出芯片。

YF017系列语音芯片是具有PWM输出的OTP语音标准芯片。共有3个IO口,外围最低仅需要一个104电容就可以稳定的工作。YF017系列是特定的固定标准模块,可以通过单片机最少一个IO口控制多达32段声音任意调用和组合的语音标准芯片。通常最常用的控制方式是3个IO:BUSY、DATA和REST。BUSY:芯片工作时(播放声音),输出低电平,停止工作或者待机时,保持高电平;DATA:接受控制脉冲的脚位。收到几个脉冲,就播放第几个地址的内容;REST:任何时候,收到一个脉冲的时候,可以使芯片的播放指针归零同时即刻是芯片停止,进入待机状态。PWM引脚直接和扬声器相连。

YF017芯片基本脚位图:

语音芯片完整的电路图如下:

3.1.5矩阵键盘模块

计算器的输入端采用两个4*4矩阵键盘,分别与单片机芯片的P3口和P1口连接。电路图如下:

3.2电路模块焊接

根据电路图进行各个电路模块的焊接,焊接过程中注意焊接线路的布局,焊好后应立即利用万用表进行检查,是否有虚焊及短路情况。

3.3电路模块组装

各个电路模块焊接好后,进行计算器的组装,利用一个万用板作为主板,将各个模块固定在上面,固定过程中充分考虑布局的合理性。然后用排线将各个部件连接起来,至此硬件部分的设计就完成了。

4.软件设计

程序设计也采用模块化的设计方法,主要包括:运算程序,键盘扫描程序,液晶屏显示程序,延迟程序。使用Keil软件进行程序的编写与编译。程序流程图如下:

4.1主程序(运算程序)

主程序(运算程序)是软件设计的核心环节,主程序包括,各个模块程序的初始化以及运算程序。主程序的设计步骤为:模块初始化,键盘扫描,根据扫描结果判断是进行数据存储还是调用运算函数。主程序如下:

#include //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

#include

#include

#include

#include"1602.h"

#include"delay.h"

#include"keyboard.h"

/*------------------------------------------------

主程序

------------------------------------------------*/

main()

{

unsigned char num,i=0,j=0,m=0,n=0,k=0,sign[10]={0};

unsigned char temp[16],str1[8];

unsigned

char str2[9][6]={"cos","sin","tan","acos","asin","atan","sqrt","Ans","pi"};

//最大输入16个

bit firstflag,shift=0;

float a=0,b=0,c=0,d=0;

unsigned char s;

LCD_Init(); //初始化液晶屏

DelayMs(10); //延时用于稳定,可以去掉

LCD_Clear(); //清屏

LCD_Write_String(0,0,"LCD calculator"); //写入第一行信息

LCD_Write_String(0,1,"Good Luck"); //写入第二行信息

Music(32);

while (1) //主循环

{

num=KeyScan(); //扫描键盘

if(num!=0xff) //如果扫描是按键有效值则进行处理

{ if('e'==num)

{

shift=1;

LCD_Write_Char(0,0,'s');

}

else if(('c'==num)|| ('s'==num) || ('t'==num)|| ('g'==num)||'p'==num) {

if(shift==0)

{

switch(num)

{

case 'c':strcpy(str1,str2[0]);j=4;

break;

case 's':strcpy(str1,str2[1]);j=4;

break;

case 't':strcpy(str1,str2[2]);j=4;

break;

case 'g':strcpy(str1,str2[6]);j=4;Music(18);DelayMs(500);

break;

case 'p':strcpy(str1,str2[8]);j=2;a=3.1415926;

break;

default:break;

}

j=4;

}

if(shift==1)

{

switch(num)

{

case 'c':strcpy(str1,str2[3]);

break;

case 's':strcpy(str1,str2[4]);

break;

case 't':strcpy(str1,str2[5]);

break;

case 'g':strcpy(str1,str2[6]);

break;

case 'p':strcpy(str1,str2[8]);a=3.1415926;

break;

default:break;

}

j=5;

}

LCD_Write_String(0,0,str1);

sign[m]=num;

}

else if(('+'==num)|| (i==16) || ('-'==num) || ('x'==num)||

('/'==num)||('^'==num) ||('='==num)|| ('!'==num))//输入数字最大值16,输入符号表示输入结束

{

i=0; //计数器复位

if(firstflag==0) //如果是输入的第一个数据,赋值给a,并把标志位置1,到下一个数据输入时可以跳转赋值给b

{

sscanf(temp,"%f",&a);

firstflag=1;

}

else

sscanf(temp,"%f",&b);

for(s=0;s<16;s++) //赋值完成后把缓冲区清零,防止下次输入影响结果

temp[s]=0;

if(num!='=')

{

LCD_Write_Char(j,0,num);

j++;

m++;

sign[m]=num;

if(('+'==num)||('-'==num))

{

n++;

if(n==1)

{ k=0;

switch(sign[m-1])

{

case '+':a=a+b;

break;

case '-':a=a-b;

break;

case 'x':a=a*b;

break;

case '/':a=a/b;

case '^':d=a;while(--b) a=a*d;

break;

default:break;

}

c=a;

}

else

{

switch(sign[m-1])

{

case '+':a=a+b;

break;

case '-':a=a-b;

break;

case 'x':a=a*b;a=((sign[m-k-1]=='+')?(c+a):(c-a));k=0;

break;

case '/':a=a/b;a=((sign[m-k-1]=='+')?(c+a):(c-a));k=0;

break;

case '^':d=a;while(--b) a=a*d;a=((sign[m-k-1]=='+')?(c+a):(c-a));k=0;

break;

default:break;

}

c=a;

k=0;

}

}

else

{

k++;

switch(sign[m-1])

{

case 'x':b=a*b;

break;

case '/':b=a/b;

break;

case '^':d=a;while(--b) a=a*d;

break;

default:break;

}

if(m!=1)

a=b;

}

}

else

{

firstflag=0; //检测到输入=号,判断上次读入的符合

if(sign[m]=='c'||sign[m]=='s'||sign[m]=='t'||sign[m]=='g')

{

if(shift==0)

{

switch(sign[m])

{

case 'c':a=cos(a/180*3.1415926);

break;

case 's':a=sin(a/180*3.1415926);

break;

case 't':a=tan(a/180*3.1415926);

break;

case 'g':a=sqrt(a);

break;

default:break;

}

}

if(shift==1)

{

switch(sign[m])

{

case 'c':a=acos(a)/3.1415926*180;

break;

case 's':a=asin(a)/3.1415926*180;

break;

case 't':a=atan(a)/3.1415926*180;

break;

case 'g':a=sqrt(a);

break;

default:break;

}

}

}

else

if(m==1||sign[m-1]=='x'||sign[m-1]=='/'||sign[m-1]=='^'||sign[m]=='-'||sign[m]=='+ '||sign[m]=='!')

{

switch(sign[m])

{

case '+':a=a+b;

break;

case '-':a=a-b;

break;

case 'x':a=a*b;

break;

case '/':a=a/b;

break;

case '^':d=a;while(--b) a=a*d;

break;

case '!':b=1;while(--a) b=b*(++m);a=b;

break;

default:break;

}

}

else

{

switch(sign[m])

{

case '+':a=a+b;

break;

case '-':a=a-b;

break;

case 'x':a=a*b;a=((sign[m-k]=='+')?(c+a):(c-a));

break;

case '/':a=a/b;a=((sign[m-k]=='+')?(c+a):(c-a));

break;

case '^':d=a;while(--b) a=a*d;a=((sign[m-k]=='+')?(c+a):(c-a));

break;

default:break;

}

}

sprintf(temp,"%g",a); //输出浮点型,无用的0不输出

while(temp[i]!='\0')

i++;

j=15-i;

LCD_Write_Char(j,1,num);

LCD_Write_String(++j,1,temp);//显示到液晶屏

m=0;n=0;k=0;sign[0]=0;b=0;i=0;j=0; //用完后所有数据清零

for(s=0;s<16;s++)

temp[s]=0; firstflag=0;shift=0;

}

}

else if(num!='q'&&num!='a'&&i<16)

{

if((1==i)&& (temp[0]=='0') )//如果第一个字符是0,判读第二个字符

{

if(num=='.') //如果是小数点则正常输入,光标位置加1

{

temp[1]='.';

LCD_Write_Char(j,0,num);//输出数据

j++;

i++;

} //这里没有判断连续按小数点,如0.0.0

else

{

temp[0]=num; //如果是1-9数字,说明0没有用,则直接替换第一位0

LCD_Write_Char(j,0,num);//输出数据

}

}

else

{

temp[i]=num;

LCD_Write_Char(j,0,num);//输出数据

j++;

i++; //输入数值累加

}

}

if('a'==num)

{

strcpy(str1,str2[7]);

LCD_Clear();

LCD_Write_String(0,0,str1);j=3;

firstflag=1;

shift=0;

}

if('q'==num)

{

LCD_Clear();

Music(16);

DelayMs(500);

LCD_Write_Char(0,0,'0');

m=0;n=0;k=0;sign[0]=0;a=b=0;i=0;j=0; //用完后所有数据清零

for(s=0;s<16;s++)

temp[s]=0; firstflag=0;shift=0;

}

}

}

}

4.2液晶屏显示程序

LCD1602液晶屏显示程序主要是通过液晶屏的使能端和读写端控制数据输入

端来实现字符的显示,程序中包含许多子函数,作为主函数的调用函数使用。包括:判忙函数、写入命令函数、写入数据函数、清屏函数、写入字符函数、写入字符串函数、语音函数、初始化函数。

1602.h文件:

#include //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

#include

#ifndef __1602_H__

#define __1602_H__

bit LCD_Check_Busy(void) ;

void LCD_Write_Com(unsigned char com) ;

void LCD_Write_Data(unsigned char Data) ;

void LCD_Clear(void) ;

void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) ;

void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) ;

void LCD_Init(void) ;

void Music(int z);

#endif

1602.c文件:

#include "1602.h"

#include "delay.h"

#define CHECK_BUSY

sbit RST = P2^5; //定义端口

sbit DATA = P2^7;

sbit BUSY = P2^4;

sbit RS = P2^1; //定义端口

sbit RW = P2^2;

sbit EN = P2^3;

#define RS_CLR RS=0

#define RS_SET RS=1

#define RW_CLR RW=0

#define RW_SET RW=1

#define EN_CLR EN=0

#define EN_SET EN=1

#define DataPort P0

/*------------------------------------------------

判忙函数

------------------------------------------------*/

bit LCD_Check_Busy(void)

{

#ifdef CHECK_BUSY

DataPort= 0xFF;

RS_CLR;

RW_SET;

EN_CLR;

_nop_();

EN_SET;

return (bit)(DataPort & 0x80);

#else

return 0;

#endif

}

/*------------------------------------------------

写入命令函数

------------------------------------------------*/

void LCD_Write_Com(unsigned char com) {

// while(LCD_Check_Busy()); //忙则等待DelayMs(5);

RS_CLR;

RW_CLR;

EN_SET;

DataPort= com;

_nop_();

EN_CLR;

}

/*------------------------------------------------

写入数据函数

------------------------------------------------*/

void LCD_Write_Data(unsigned char Data) {

//while(LCD_Check_Busy()); //忙则等待DelayMs(5);

RS_SET;

RW_CLR;

EN_SET;

DataPort= Data;

_nop_();

EN_CLR;

}

/*------------------------------------------------

清屏函数

------------------------------------------------*/

void LCD_Clear(void)

{

LCD_Write_Com(0x01);

DelayMs(5);

}

/*------------------------------------------------

写入字符串函数

------------------------------------------------*/

void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) {

while (*s)

{

LCD_Write_Char(x,y,*s);

s ++; x++;

}

}

/*------------------------------------------------

写入字符函数

------------------------------------------------*/

void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) {

int z;

if (y == 0)

{

LCD_Write_Com(0x80 + x);

}

else

{

LCD_Write_Com(0xC0 + x);

}

LCD_Write_Data( Data);

switch(Data)

单片机实验报告

院系:计算机科学学院专业:智能科学与技术年级: 2012 学号:2012213865 姓名:冉靖 指导教师:王文涛 2014年 6月1日

一. 以下是端口的各个寄存器的使用方式: 1.方向寄存器:PxDIR:Bit=1,输出模式;Bit=0,输入模式。 2.输入寄存器:PxIN,Bit=1,输入高电平;Bit=0,输入低电平。 3.输出寄存器:PxOUT,Bit=1,输出高电平;Bit=0,输出低电平。 4.上下拉电阻使能寄存器:PxREN,Bit=1,使能;Bit=0,禁用。 5.功能选择寄存器:PxSEL,Bit=0,选择为I/O端口;Bit=1,选择为外设功能。6.驱动强度寄存器:PxDS,Bit=0,低驱动强度;Bit=1,高驱动强度。 7.中断使能寄存器:PxIE,Bit=1,允许中断;Bit=0,禁止中断。 8.中断触发沿寄存器:PxIES,Bit=1,下降沿置位,Bit=0:上升沿置位。 9.中断标志寄存器:PxIFG,Bit=0:没有中断请求;Bit=1:有中断请求。 二.实验相关电路图: 1 MSP430F6638 P4 口功能框图: 主板上右下角S1~S5按键与MSP430F6638 P4.0~P4.4口连接: 2按键模块原理图: 我们需要设置两个相关的寄存器:P4OUT和P4DIR。其中P4DIR为方向寄存器,P4OUT 为数据输出寄存器。 主板上右下角LED1~LED5指示灯与MSP430F6638 P4.5~P4.7、P5.7、P8.0连接:

3 LED指示灯模块原理图: P4IN和P4OUT分别是输入数据和输出数据寄存器,PDIR为方向寄存器,P4REN 为使能寄存器: #define P4IN (PBIN_H) /* Port 4 Input */ #define P4OUT (PBOUT_H) /* Port 4 Output */ #define P4DIR(PBDIR_H) /* Port 4 Direction */ #define P4REN (PBREN_H) /* Port 4 Resistor Enable */ 三实验分析 1 编程思路: 关闭看门狗定时器后,对P4.0 的输出方式、输出模式和使能方式初始化,然后进行查询判断,最后对P4.0 的电平高低分别作处理来控制LED 灯。 程序流程图: 2 关键代码分析: #include void main(void) { WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗 P4DIR |= BIT5; // 设置4.5口为输出模式 P4OUT |= BIT0; // 选中P4.0为输出方式 P4REN |= BIT0; // P4.0使能 while (1) // Test P1.4 { if (P4IN & BIT0) //如果P4.0为1则执行,这是查询方式按下去后是低,否则为高

单片机实验报告

单片机实验报告 班级:信科09-3 姓名:王艳辉 学号:08093581 指导老师:陈岱 完成时间:2012年1月8日

实验一 I/O接口P1、P3口实验 一,实验题目 1,用P1口做输出,接八只发光二极管,编写程序,使发光二极管循环点亮。 2,用P3口做输入口,接八个扭子开关,通过P1口在实验箱上LED 灯上输出,编写程序读取开关状态,将此状态,在发光二极管上显示出来。 二,实验目的 1.熟悉使用CPLD实验箱进行单片机实验的方法。 2.设计出符合实验要求的CPLD硬件电路。 3.学习单片机仿真开发软件Keil 51的使用方法。 4.学习MCS-51汇编语言编程方法。 5.学习Pl口的使用方法。 6.学习延时子程序的编写和使用。 三,实验准备 P1和P3口为准双向口,Pl、P3的每一位都能独立地定义为输出线或输入线,作为输入时,必须向锁存器相应位写入“l”,该位才能作为输入。803l中所有口锁存器在复位时均置为“1”,如果后来在口锁存器写入过“0”,在需要时应写入一个“l”使它再成为一个输入。再来看一下延时程序的实现。现常用的有两种方法:一是用定时器中断来实现,一是用指令循环来实现。在系统时间允许的情况下可以采用后一种方法。根据实验系统的工作主频,计算出延时0.1s的

时间常量,编制延时程序: MOV R7, #200 (1) DEl:MOy R6,#X (2) DE2:DJNZ R6,DE2 (3) DJNZ R7,DEl (4) 上面MOV、DJNZ指令均需两个机器周期,所以每执行一条指令需1÷0.256us现求出X值: (X*1/0.256+1/0.256+l/0.256)*200+l/0.256=0.1*10^6。解出X=l26。代入上式可知实际延时约0.100O04s,近似符合要求。 四,实验步骤 (1)打开MAX+PLUSⅡ CPLD实验开发系统。 (2)点击File菜单Project子菜单之Name项,出现Project Name 对话框。为当前的实验选择恰当的路径并创建项目名称”E:\AT8031”。(3)点击File菜单之New项,出现对话框,为选择输入方式,选择Graphic Editor File。出现图形编辑窗口。 (4)双击空白编辑区,出现Enter Symbol 对话框。 (5)从Symbol Libraries项中选择mf子目录(双击),在prim子目录中选择输入脚input 和输出引脚output。 (6)在图形编辑窗口中的左侧点击连线按钮,并完成对电路的连线。(7)在引脚的PIN_NAME处左键双击使之变黑,键入引脚名称。

微控制器实验报告

微控制器技术实验报告 班级: 姓名: 学号:

微控制器技术实验说明 一、实验目的及要求: 1、学习Keil C51集成开发工具的操作及调试程序的方法,包括:仿真调试 与脱机运行间的切换方法; 2、熟悉TD-51单片机系统板及实验系统的结构及使用; 3、进行MCS51单片机指令系统软件编程设计与硬件接口功能设计; 4、学习并掌握Keil C51与Proteus仿真软件联机进行单片机接口电路的设 计与编程调试; 5、完成指定MCS51单片机综合设计题 二、实验基本内容(TD-51单片机实验系统实现) 实验一清零程序与拆字程序设计 根据实验指导书之“第二章单片机原理实验”(P17~P23页)内容,熟悉实验环境及方法,完成思考题1、2(P23)基础实验项目。 实验二拼字程序与数据传送程序设计 汇编语言完成实验指导书P24思考题3、4题的基础实验项目。 实验三排序程序与散转程序设计 汇编语言完成实验指导书P24思考题5、6题的基础实验项目。 实验四静态存储器扩展实验 基本部分:阅读、验证C语言程序功能。使用汇编语言编程,完成实验指导书之“4.1 静态存储器扩展实验”基本实验项目(P57)。 提高部分:阅读、验证C语言程序功能。使用汇编语言编程,完成实验指导书之“4.2 FLASH存储器扩展实验”实验项目(P60)。 实验五数字量输入输出实验 基本部分:阅读、验证C语言程序功能。使用汇编语言编程,完成实验指导书之“3.1 数字量输入输出实验”基本实验项目(P36),。 提高部分:(任选一题) 题目一:LED交通灯控制(使用8255接口芯片) 要求:使用汇编语言编程,功能为:通过开关实现LED灯工作方式即时控 制,完成LED交通灯的开关控制显示功能和LED交通灯自动循环显示功能。 题目二:LED灯控制(使用8255接口芯片) 要求:使用汇编语言编程,功能为:通过KK1实现LED灯工作方式即时控 制,完成LED开关控制显示和LED灯左循环、右循环、间隔闪烁功能。 题目三:键盘扫描与数码管显示设计( 要求:阅读、验证P69上的C 语言参考程序功能。使用汇编语言完成编程与功能调试。

实验报告(单片机实验报告)

1 双字节无符号数加法 例1: 双字节无符号数加法(R0 R1)+(R2 R3) → (R4 R5), R0、 R2、 R4存放16位数的高字节, R1、 R3、 R5存放低字节。已知(R0 R1)=(93h,79h);(R2 R3)=(25h,a4h) 假设其和不超过16位。请编程。 org 0000h Ljmp start org 0050h start: mov R0,#93h mov R1, #79h mov R2,#25h mov R3, #0a4h mov A,R1 ADD A,R3 mov R5,A mov A,R0 ADDC A,R2 mov R4,A ss: jmp ss end 2双字节无符号数减法

例2: 双字节无符号数相减(R0 R1)-(R2 R3) → (R4 R5)。R0、 R2、R4存放16位数的高字节, R1、 R3、 R5存放低字节,已知(R0 R1)=(93h,79h);(R2 R3)=(25h,a4h);请编程。同学自己可以设置被减数与减数数值 org 0000h Ljmp start org 0050h start: mov R0,#93h mov R1,#79h mov R2,#25h mov R3,#0a4h mov A,R1 CLR C SUBB A,R3 mov R5,A mov A,R0 SUBB A,R2 mov R4,A ss: jmp ss end 3双字节数乘以单字节数

例3: 利用单字节乘法指令,进行双字节数乘以单字节数运算。若被乘数为16位无符号数, 地址为M1(30H) 和M1+1(31H)(低位先、高位后), 乘数为8位无符号数, 地址为M2(32H), 积由高位到低位存入R2、 R3和R4三个寄存器中。 30H,31H,32H内容 12H,34H,56H ; org 0000h Ljmp start org 0050h start: mov 30h,#12h mov 31h,#34h mov 32h,#56h mov a,(30h) mov b,(32h) mul ab mov R3,b mov R4,a mov a,(31h) mov b,(32h) mul ab add A,R3 mov R3,A

51单片机实验报告94890

《单片机与接口技术》实验报告 信息工程学院 2016年9月

辽东学院信息技术学院 《单片机与接口技术》实验报告 姓名:王瑛 学号: 0913140319 班级: B1403 专业:网络工程 层次:本科 2016年9月

目录 实验题目:实验环境的初识、使用及调试方法(第一章) 实验题目:单片机工程初步实验(第二章) 实验题目:基本指令实验(第三章)4 实验题目:定时器/计数器实验(第五章)4 实验题目:中断实验(第六章)4 实验题目:输入接口实验(第八章)4 实验题目:I/O口扩展实验(第九章)4 实验题目:串行通信实验(第十一章)4 实验题目:A/D,D/A转换实验(第十七章)4

实验题目:实验环境的初识、使用及调试方法实验 实验类型:验证性实验课时: 1 时间:2016年10月24日 一、实验内容和要求 了解单片机的基础知识 了解51单片机的组成和工作方法 掌握项目工程的建立、编辑、编译和下载的过程方法 熟练单片机开发调试工具和方法 二、实验结果及分析 单片机最小系统的构成: Keil集成开发环境:

STC-ISP:

实验题目:单片机工程初步实验 实验类型:验证性实验课时: 1 时间:2016 年10 月24 日一、实验内容和要求 点亮一个LED小灯 程序下载到单片机中 二、实验结果及分析 1、点亮一个LED小灯 点亮LED小灯的程序: #include //包含特殊功能寄存器定义的头文件 sbit LED = P0^0; sbit ADDR0 = P1^0; //sbit必须小写,P必须大写 sbit ADDR1 = P1^1; sbit ADDR2 = P1^2; sbit ADDR3 = P1^3; sbit ENLED = P1^4; void main() { ENLED = 0; ADDR3 = 1; ADDR2 = 1; ADDR1 = 1; ADDR0 = 0; LED = 0; //点亮小灯 while (1); //程序停止 } 2、程序下载 首先,我们要把硬件连接好,把板子插到我们的电脑上,打开设备管理器查看所使用的COM 口,如图所示:

单片机实验报告书

并行I/O接口实验 一、实验目的 熟悉掌握单片机并行I/O接口输入和输出的应用方法。 二、实验设备及器件 个人计算机1台,装载了Keil C51集成开发环境软件。https://www.doczj.com/doc/fb2740734.html,单片机仿真器、编程器、实验仪三合一综合开发平台1台。 三、实验内容 (1)P1口做输出口,接八只发光二极管,编写程序,使发光二极管延时(0.5-1秒)循环点亮。实验原理图如图3.2-1所示。 图3.2-1单片机并行输出原理图 实验程序及仿真 ORG 0000H LJMP START ORG 0100H START:MOV R2,#8 MOV A,#0FEH LOOP:MOV P1,A LCALL DELAY RL A

DJNZ R2,LOOP LJMP START DELAY:MOV R5,#20 D1:MOV R6,#20 D2:MOV R7,#248 D3:DJNZ R7,D3 DJNZ R6,D2 DJNZ R5,D1 RET END 中断实验 一、实验目的 熟悉并掌握单片机中断系统的使用方法,包括初始化方法和中断服务程序的编写方法。 二、实验设备及器件

个人计算机1台,装载了Keil C51集成开发环境软件。 https://www.doczj.com/doc/fb2740734.html,单片机仿真器、编程器、实验仪三合一综合开发平台1台。 三、实验内容 (2)用P1口输出控制8个发光二极管LED1~LED8,实现未中断前8个LED闪烁,响应中断时循环点亮。 实验程序及仿真 ORG 0000H LJMP MAIN ORG 0003H LJMP INT00 ORG 0010H MAIN: A1:MOV A,#00H MOV P1,A MOV A,#0FFH MOV P1,A SETB EX0 JB P3.2,B1 SETB IT0 SJMP C1 B1:CLR IT0 C1:SETB EA NOP SJMP A1 INT00:PUSH Acc PUSH PSW MOV R2,#8 MOV A,#0FEH LOOP: MOV P1,A LCALL DELAY RL A DJNZ R2,LOOP

单片机实验报告第四

单片机实验四 实验报告 课程名称:单片机原理及应用实验姓名:刘江 系别:信息系 专业:电气工程及其自动化年级:2012级 学号:120712039 指导教师:李莉 2015 年 6 月 30 日

一、实验目的和要求 1)熟悉Keil 软件界面,以及编辑、编译、运行程序的步骤; 2)熟悉Proteus软件界面,掌握用Proteus画仿真图的方法。 二、主要仪器设备 Keil 软件与Proteus仿真软件 三、实验设计要求 这次试验我通过Proteus仿真实现对流水灯功能的实现。受益匪浅,对80C51的功能和结构有了深层次的了解,我深刻的明白,要想完全了解C51还有一定距离,但我会一如既往的同困难作斗争。在实验中,我遇到了不少困难,比如不知道怎么将程序写进单片机中,写好程序的却总出错,不知道什么原因,原来没有生成hex文件。这些错误令我明白以后在试验中要步步细心,避免出错。 四、操作方法与实验步骤 1、Keil C51软件使用 在Keil C51集成开发环境下,建立一个工程并编辑以下源程序,熟悉Keil C51集成开发环境下各种菜单、命令的使用。 #include unsigned char code table[]={0x01,0x02,0x04,0x08, 0x10,0x20,0x40,0x80}; void delay(unsigned char delay_time) { unsigned char i,j; for(i=0;i<=delay_time;i++) { for(j=0;j<=200;j++); } } void init_tx() { EA=1; EX0=1; IP=0x00; } void main() { unsigned char i;

51单片机实验报告

51单片机实验报告

实验一 点亮流水灯 实验现象 Led灯交替亮,间隔大约10ms。实验代码 #include void Delay10ms(unsigned int c); void main() { while(1) { P0 = 0x00; Delay10ms(50); P0 = 0xff; Delay10ms(50); } }

void Delay10ms(unsigned int c) { unsigned char a, b; for (;c>0;c--) { for (b=38;b>0;b--) { for (a=130;a>0;a--); } } } 实验原理 While(1)表示一直循环。 循环体首先将P0的所有位都置于零,然后延时约50*10=500ms,接着P0位全置于1,于是LED全亮了。接着循环,直至关掉电源。延迟函数是通过多个for循环实现的。 实验2 流水灯(不运用库函数) 实验现象 起初led只有最右面的那一个不亮,半秒之后从右数第二个led

也不亮了,直到最后一个也熄灭,然后led除最后一个都亮,接着上述过程 #include #include void Delay10ms(unsigned int c); main() { unsigned char LED; LED = 0xfe; while (1) { P0 = LED; Delay10ms(50); LED = LED << 1; if (P0 == 0x00) { LED = 0xfe; } } } void Delay10ms(unsigned int c)

微控制器技术实验报告

《微控制器技术》 实验报告 指导老师: 专业: 班级: 姓名: 学号:

“微控制器技术”实验任务说明 实验目的与要求: 1、熟练掌握Keil C51集成开发工具的操作及调试程序的方法,包括:仿真调试与脱机运行间的切换方法; 2、熟练使用SST89C554RC单片机核心板及I/O扩展实验系统; 3、熟练掌握在Keil C51与Proteus仿真软件虚拟联机环境下,基于51单片机控制器数字接口电路的硬件、软件设计与功能调试; 4、完成MCS51单片机指令系统软件编程设计和硬件接口功能设计题;

实验一数字量输入输出实验 基本部分:阅读、验证C语言程序功能。使用汇编语言编程,完成实验指导书之“3.1 数字量输入输出实验”基本实验项目(P36)。 提高部分:(任选一题) 题目一:LED交通灯控制(使用8255接口芯片) 要求:使用汇编语言编程,功能为:通过开关实现LED灯工作方式即时控制,完成LED交通灯的开关控 制显示功能和LED交通灯自动循环显示功能。 题目二:LED灯控制(使用8255接口芯片) 要求:使用汇编语言编程,功能为:通过KK1实现LED灯工作方式即时控制,完成LED开关控制显示和LED灯左循环、右循环、间 隔闪烁功能。 题目三:键盘扫描与数码管显示设计(使用8255接口芯片)要求:阅读、验证C语言参考程序功能。使用汇编语言完成编程与功能调试(P69)。 1、实验目的 了解P1口作为输入输出方式使用时,CPU对P1口的操作方式。 2、实验内容: P1口是8位准双向口,每一位均可独立定义为输入输出。编 写实验程序,将P1口的低4位定义为输出,高4位定义为输 入,数字量从P1口的高4位输入,从P1口的低4位输出控 制发光二极管的亮灭。

单片机实验报告

南京晓庄学院电子工程学院 实验报告 课程名称:单片机系统设计与应用 姓名:森 专业:电子信息科学与技术 年级:14级 学号:05 2016年12 月1 日

实验项目列表 序号实验项目名称成绩指导教师 1 单片机仿真软件的使用 2 单片机I/O接口应用实验——流水灯 3 外部中断实验——工业顺序控制模拟 4 定时/计数器实验——矩形波 5 定时/计数器实验——计数器 6 综合实验 7 8 9 10 注: 1、实验箱端口为com6。 2、芯片选择切换到51 3、停止运行使用实验箱上的复位按钮

实验室号:___ 实验时间:成绩: 实验一仿真软件的使用 1.实验目的和要求 1)熟悉Keil C51软件界面,以及编辑、编译、运行程序的步骤; 2)掌握单片机仿真软件使用和调试的方法。 2.实验原理 Keil C51软件使用 在Keil C51集成开发环境下,建立一个工程并编辑源程序,熟悉Keil C51集成开发环境下各种菜单、命令的使用。 3.主要仪器设备(实验用的软硬件环境) 安装有Keil C51软件的PC机1台 4.操作方法与实验步骤 Keil C51软件使用 (1)建立用户文件夹 (2)建立工程 (3)建立文件并编码。输入以下源程序,并保存在项目所在的目录中 (4)把文件加入工程中 (5)编译工程。编译时观察在界面下方的“Build”页中的到编译错误信息和使用的系统资源情况等。 (6)调试。利用常用调试命令,如复位、运行、暂停、单步、单步跳过、执行完当前子程序、运行到当前行、下一状态、打开跟踪、观察跟踪、反汇编窗口、观察窗口、代码作用范围分析、1#串行窗口、内存窗口、性能分析、工具按钮等命令进行调试,观察并分析调试结果。 (7)目标代码文件的生成。运行生成相应的.HEX文件。 5.实验内容及程序 1)从DATA区地址起始地址为40H的连续10个内存单元的内容传送到XDATA区起始地址为2000H的10个内存单元中。 注意:DATA区地址起始地址为40H的连续10个内存单元必须先赋初值。 P83-5源程序 #include #define uchar unsigned char xdata unsigned char buffer1[10]_at_ 0x2000; //在xdata区定义数组变量BUF1,首地址为2000H data unsigned char buffer2[10]_at_ 0x40; //在data区定义数组变量BUF2,首地址为40H void main(void)

C51单片机实验报告

实验报告册 课程名称:单片机原理与应用B 指导老师:xxx 班级:xxx 姓名:xxx 学号:xxx 学期:20 —20 学年第学期南京农业大学工学院教务处印

实验目录实验一:指示灯/开关控制器 实验二:指示灯循环控制 实验三:指示灯/数码管的中断控制 实验四:电子秒表显示器 实验五:双机通信

姓名:学号:班级:成绩: 实验名称:指示灯/开关控制器 一、实验目的: 学习51单片机I/O口基本输入/输出功能,掌握C语言的编程与调试方法。 二、实验原理: 实验电路原理图如图所示,图中输入电路由外接在P1口的8只拨动开关组成;输入电路由外接在P2口的8只低电平驱动的发光二极管组成。此外,还包括时钟电路、复位电路和片选电路。 在编程软件的配合下,要求实现如下指示灯/开关控制功能:程序启动后,8只发光二极管先整体闪烁3次(即亮→暗→亮→暗→亮→暗,间隔时间以肉眼可观察到为准),然后根据开关状态控制对应发光二极管的亮灯状态,即开关闭合相应灯亮,开关断开相应灯灭,直至停止程序运行。 三、软件编程原理为; (1)8只发光二极管整体闪烁3次

亮灯:向P2口送入数值0; 灭灯:向P2口送入数值0FFH; 闪烁3次:循环3次; 闪烁快慢:由软件延时时间决定。 (2)根据开关状态控制灯亮或灯灭 开关控制灯:将P1口(即开关状态)内容送入P2口;无限持续:无条件循环。 四、实验结果图: 灯泡闪烁:

按下按键1、3、5、7:

经检验,其余按键按下时亦符合题目要求。 五、实验程序: #include"reg51.h" void delay(unsigned char time) { unsigned int j=15000; for(;time>0;time--) for(;j>0;j--); } void main(){ key,char i; for(i=0;i<3;i++) { P2=0x00; delay(500); P2=0xff; delay(500) } while(1) { P2=P3;

单片机实验报告一

单片机实验报告 1 姓名 陈奋裕 时间 2014/10/30 地点 机电实验大楼B526 实验题目 软件开发环境和简单程序设计 一、实验目的 1. 熟悉WAVE 软件使用 2. 学习简单程序的调试方法 二、实验主要仪器及环境 PC 机、WA VE 软件、仿真器+仿真头、实验板、电源等。 三、实验内容及步骤 1.启动PC 机,打开WAVE 软件,软件设置为模拟调试状态。在所建的项目文件中输入源程序,进行编译,编译无误后,执行程序,点击全速执行快捷按钮,点击暂停按钮,观察存储块数据变化情况,点击复位按钮,可再次运行程序。 2.打开CPU 窗口,选择单步或跟踪执行方式运行程序,观察CPU 窗口各寄存器的变化,可以看到程序执行的过程,加深对实验的了解。 四、流程图及参考程序 实验1 1)参考程序 2)流程图 ORG 0000H START EQU 30H MOV R0, #START MOV R2, #10 mov a,#01h Loop: MOV @R0,A NOP LJMP $ END

五、实验及程序的分析和讨论 (1)第一个程序是将地址为30H到39H的寄存器的内容全部置1。先在R0中存放内部存储器的起始地址30H,R2中存放内部存储器的长度10个,累加器置1,然后利用循环控制指令DJNZ R2,Loop控制10次循环给上述10个单元赋值1.最后,使单片机自身跳转。 (2)实验得到全速执行后相应的测试结果: (3)实验得到30H到39H寄存器执行后的内容: 从该表中也可以看出该程序的功能,即将30H到39H的寄存器内容置1,说明自己的分析是对的。 六、实验小结 1、汇编语言的结果在软件里面全部都是黑色字体,无法编译,在老师的 提醒下,知道了WAVE软件只能执行ASM文件,所以实验前要先将文件 的类型改为.ASM。 2、程序中的逗号要在英文的状态下面编写;若提示有空余符号,则是分 号后面直接写注释,不要添加空格 七、思考题 1、软件开发环境提供了哪些调试手段?各有何特点? 答: 1.伟福仿真器为我们的调试提供了多种方法,它可以编译,以便查 找语法错误; 2.单步执行,来检查每句程序的功能; 3.全速执行程序,来检查整段程序要完成的功能; 4.还可以设置断点进行调试,以便分段执行程序。 2、如何将存储器块的内容移动到另一位置? 答:借助指针和寄存器,利用转移类指令即可将存储器块的内容移动到 另一位置。

单片机实验报告

课程设计课程名称单片机原理及应用 课题名称基于1602电子时钟设计 专业电子信息工程 班级 学号 姓名 指导老师 2017年12月21日 电气信息学院

课程设计任务书 课题名称基于1602电子时钟设计 姓名专业电子信息工程班级学号 指导老师 课程设计时间2017年12月4日-2017年12月15日(14、15周) 教研室意见意见:审核人: 一、任务及要求 设计任务: 以单片机为核心设计一个电子时钟。能焊接开发板的同学,在开发板上进行调试。 (1)时间显示在1602液晶上,并且按秒实时更新。 (2)使用按键随时调节时钟的时、分、秒,按键可设计三个有效键,分别为功能选择键、数值增大键和数值减小键。 (3)每次有键按下时地,蜂鸣器都以短“滴”声报警。 (4)如何继续断电前的时间。 设计要求: (1)确定系统设计方案; (2)进行系统的硬件设计; (3)完成必要的参数计算与元器件选择; (4)开发板焊接及测试 (5)完成应用程序设计; (6)应用系统的硬件和软件的调试。

二、进度安排 第一周: 周一:集中布置课程设计相关事宜,并查阅、收集相关设计资料。 周二:系统方案设计。 周三~周五:实验室进行硬件设计,软件设计及调试。 第二周: 周一~周二:实验室系统仿真及硬件调试。 周三:实验室检查调试结果。 周四:撰写设计报告。 周五:进行答辩和上交设计说明书。 三、参考资料 1、周向红.51系列单片机应用与实践教程.北京航空航天大学出版社.2008.5 2、周向红.51单片机课程设计.华中科技大学出版社.2011.1 3、王迎旭.单片机原理及应用(第2版).机械工业出版社.2012.2 4、郭天祥.51单片机C语言教程(入门提高开发拓展全攻略).电子工业出版社.2012.1 5、樊思奇.80C51单片机C语言程序设计完全手册.电子工业出版社.2014.5 6、彭伟.单片机C语言程序设计实训100例基于8051+Proteus仿真.电子工业出版社.2009.6 7、孙安青.MCS-51单片机C语言编程100例(第二版).中国电力出版社.2017.6 8、赵建领.零基础学单片机C语言程序设计.机械工业出版社.2012.9

单片机实验报告

实 验 报 告 实验课程:单片机原理及应用 班级: 12自动化2班 学号: 姓名: 教师:张玲 成绩: 实验日期:年月日 实验名称:实验1——计数显示器 一、实验目的: 学习Proteus 软件的使用,掌握单片机原理图的绘图方法。 二、实验内容: 1、绘制“计数显示器”电路原理图; 2、利用提供的hex文件验证此电路的运行效果。 三、实验要求: 提交的实验报告中应包括:1、绘图方法简述,要求说明元件与电源的选取、摆放及属性编辑,总线与标签的画法等内容;2、电路原理图; 3、仿真运行效果展示,要求就仿真文件加载方法及3~4幅运行截图进行简要说明;4、实验小结,说明遇到的主要问题或实验

1体会等。 参考电路原理图如下: 元件类别电路符号元件名称 Microproces sor ICs “U1”80C51 Miscellaneo us “X1”/12MHz CRYSTAL Capacitors“C1”~“C2” /1nF CAP Capacitors“C3”/22μF CAP-ELEC Resistors Packs “RP1”/7-100ΩRESPACK-7 Resistors“R1”/100ΩRES Optoelectro nics “LED1”~ “LED2” 7SEG-COM-CAT-G RN Switches & Relays “BUT”BUTTON 1、编程思路及C51源程序:

2、电路原理图: 3、仿真运行效果展示:

4、实验小结: 熟悉Proteus软件,了解软件的结构组成与功能;学习ISIS模块的使用方法, 学会设置图纸、选元件、线画总线、修改属性等基本操作;学会可执行文件 加载及程序仿法;理解Proteus在单片机开发中的作用,完成单片机电路原 理图的绘制。

单片机实验报告

本科生实验报告 实验课程单片机原理及应用 学院名称核技术与自动化工程学院 专业名称电气工程及其自动化 学生姓名 学生学号 指导教师任家富 实验地点6C902 实验成绩 二〇一五年三月二〇一五年六月 单片机最小系统设计及应用 摘要 目前,单片机以其高可靠性,在工业控制系统、数据采集系统、智能化仪器仪表等领域得到极其广泛的应用。因此对于在校的大学生熟练的掌握和使用单片机是具有深远的意义。通过本次课程设计掌握单片机硬件和软件方面的知识,更深入的了解单片机的实际应用,本次设计课程采用STC89C52单片机和ADC0804,LED显示,键盘,RS232等设计一个单片机开发板系统。进行了LED显示程序设计,键盘程序设计,RS232通信程序设计等。实现了单片机的各个程序的各个功能。对仿真软件keil的应用提升了一个新的高度。单片机体积小、成本低、使用方便,所以被广

泛地应用于仪器仪表、现场数据的采集和控制。通过本实验的学习,可以让学生掌握单片机原理、接口技术及自动控制技术,并能设计一些小型的、综合性的控制系统,以达到真正对单片机应用的理解。 关键词:单片机;智能;最小系统;ADC;RS232;显示;STC89C52 第1章概述 单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。相当于一个微型的计算机,和计算机相比,单片机只缺少了I/O设备。单片机采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统。概括的讲:一块芯片就成了一台计算机。它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。同时,学习使用单片机是了解计算机原理与结构的最佳选择。 它最早是被用在工业控制领域,由于单片机在工业控制领域的广泛应用,单片机由芯片内仅有CPU的专用处理器发展而来。最早的设计理念是通过将大量外围设备和CPU集成在一个芯片中,使计算机系统更小,更容易集成进复杂的而对体积要求严格的控制设备当中。 现代人类生活中所用的几乎每件电子和机械产品中都会集成有单片机。手机、电话、计算器、家用电器、电子玩具、掌上电脑以及鼠标等电脑配件中都配有1-2部单片机。汽车上一般配备40多部单片机,复杂的工业控制系统上甚至可能有数百台单片机在同时工作!单片机的数量不仅远超过PC机和其他计算的总和,甚至比人类的数量还要多。单片机的使用领域已十分广泛,如智能仪表、实时工控、通讯设备、导航系统、家用电器等。各种产品一旦用上了单片机,就能起到使产品升级换代的功效,常在产品名称前冠以形容词——“智能型”,如智能型洗衣机等。 第2章实验内容 2.1单片机集成开发环境应用

单片机串行通信实验报告(实验要求、原理、仿真图及例程)

《嵌入式系统原理与实验》实验指导 实验三调度器设计基础 一、实验目的和要求 1.熟练使用Keil C51 IDE集成开发环境,熟练使用Proteus软件。 2.掌握Keil与Proteus的联调技巧。 3.掌握串行通信在单片机系统中的使用。 4.掌握调度器设计的基础知识:函数指针。 二、实验设备 1.PC机一套 2.Keil C51开发系统一套 3.Proteus 仿真系统一套 三、实验内容 1.甲机通过串口控制乙机LED闪烁 (1)要求 a.甲单片机的K1按键可通过串口分别控制乙单片机的LED1闪烁,LED2闪烁,LED1和LED2同时 闪烁,关闭所有的LED。 b.两片8051的串口都工作在模式1,甲机对乙机完成以下4项控制。 i.甲机发送“A”,控制乙机LED1闪烁。 ii.甲机发送“B”,控制乙机LED2闪烁。 iii.甲机发送“C”,控制乙机LED1,LED2闪烁。 iv.甲机发送“C”,控制乙机LED1,LED2停止闪烁。 c.甲机负责发送和停止控制命令,乙机负责接收控制命令并完成控制LED的动作。两机的程序要 分别编写。 d.两个单片机都工作在串口模式1下,程序要先进行初始化,具体步骤如下: i.设置串口模式(SCON) ii.设置定时器1的工作模式(TMOD) iii.计算定时器1的初值 iv.启动定时器 v.如果串口工作在中断方式,还必须设置IE和ES,并编写中断服务程序。

(2)电路原理图 Figure 1 甲机通过串口控制乙机LED闪烁的原理图 (3)程序设计提示 a.模式1下波特率由定时器控制,波特率计算公式参考: b.可以不用使用中断方式,使用查询方式实现发送与接收,通过查询TI和RI标志位完成。 2.单片机与PC串口通讯及函数指针的使用 (1)要求: a.编写用单片机求取整数平方的函数。 b.单片机把计算结果向PC机发送字符串。 c.PC机接收计算结果并显示出来。 d.可以调用Keil C51 中的printf来实现字符串的发送。 e.单片机的数码港显示发送的次数,每9次清零。

单片机实验报告

哈尔滨师范大学计算机科学与信息工程学院 实验报告手册 课程名称:嵌入式系统原理与应用指导教师:王洪侠 专业:计算机科学与技术20 18 年—20 19 年第 1 学期姓名:吴晗学号:2016040860 年级:2016级班级: 2 班

实验报告内容 实验题目:P1口输出实验 实验目的:通过实验了解P1口做为输入输出方式使用时,CPU对P1口的操作方式 实验要求:控制8个LED灯,完成从左到右然后从右到左再从左到右依次的循序流水实验器材:计算机和普中科技STC89C52单片机电路板 实验步骤/程序流程分析: 1.单片机由P2口控制流水灯 2.根据题目要求实现每点亮一盏灯就熄灭前一盏 3.套用循环实现从左到右的动态流水式亮灯 4.完成从左到右再从右到左再从左刀右流水亮灯 程序源代码: #include "reg52.h" #include typedef unsigned int u16; typedef unsigned char u8; #define led P2 void delay(u16 i) { while(i--); } void main() { u8 i; led=0xfe; delay(50000); // while(1) { /* for(i=0;i<8;i++) { P2=~(0x01<

单片机实验报告(学期全部实验)

单片机程序设计 实 验 报 告 姓名: 学号: 专业班级:

第二节课: 实验一:1357,2468位置的灯交替闪烁 一实验要求 1357,2468位置的灯交替闪烁。 二硬件连接图与结果 三原理简述 程序直接控制LED各位置的灯亮灭,时间间隔简单的用了一个延时的语句。四程序 #include main () { int i; P0=0XAA; //1357四个灯亮 for (i=0;i<=25000;i++); //延时程序 P0=0X55; //2468四个灯亮 for (i=0;i<=25000;i++); //延时程序 }

五所遇问题与解决方式 程序比较简单,没有遇到问题。 实验二:流水灯 一实验要求 流水灯,一个接一个的灯亮,亮到最后一个后,全部的灯亮,然后重头开始。二硬件连接图与结果 三原理简述 程序定义第一个位置的灯亮,通过一个时间间隔,运用一个循环移位程序转

移到下一个灯,移位7次后全部的灯亮,最后定义整个循环。时间间隔简单的用了一个延时的语句。 因为移位时是直接补0,发送低电平不亮,所以直接移位达到要求。 四程序 //流水灯 #include main () { int i,j; while(1) { P0=0X01; //第1个灯亮 for (i=0;i<=30000;i++); //延时程序 for(j=0;j<=7;j++) //移位循环程序 { P0=P0<<1; //移位 for (i=0;i<=30000;i++); //延时程序 } P0=0xff; //全亮 for (i=0;i<=30000;i++); //延时程序 } }

单片机实验报告

成绩:计算机原理实验室实验报告 课程:单片机原理及接口技术 姓名:聂建建 专业:计算机科学与技术 学号:112054206 日期:2014年6月10日 太原工业学院 计算机工程系

实验一:循环程序实验(排序) 实验日期2014.04.22实验环境PC机+Win2003+8051单片机与接口+MedWin中 文版 一.实验内容 1.熟悉51仿真系统 2.设计并单步调试实现将R5中一字节数拆分成两位独立的数据分别存于R6,R7中 3.将R6,R7中的一位HEX数据转换为输出ASCII编码 二.理论分析或算法分析 取高四位时将累加器A中的值与0F0H相与(保留高四位,低四位清零),并将结果保存在R6中;取低四位时将累加器A中的值与0FH相与(保留第四位,高四位清零),并将结果保存在R7中。 将R6、R7中的内容分别取出来存放在累加器A中,把A中的内容与9H比较大小,如果小于则加30H,等于则保持不变,大于则加37H,转换成ASCII码,并将结果保存到R6、R7中。

实验二:分支程序实验 实验日期2014.05.09实验环境PC机+Win2003+8051单片机与接口+MedWin中 文版 一.实验内容 1.掌握51汇编语言调试技巧 2.实现三个数(R5,R6,R7)中找出最大和最小值,最大值存到R3,最小值存到R4 3.将数据从R5,R6,R7改为内部数据存储器30H开始的连续多个数据 二.理论分析或算法分析 文字描述以及算法流程图(文字主要描述基本要求和扩展要求的算法流程区别)首先将R3清零,然后进行(R5)与(R3)减法,若(R5)-(R3)>0,则(R5)>(R3),把(R5)送(R3);否则(R3)保持不变。再将(R3)分别于(R6)和(R7)比较,比较处理的方法与(R5)与(R3)的比较方法相同,这样比较3次后,R3中的数即为最大值。 其次将R4赋值为FFH,然后进行(R4)与(R5)减法,若(R4)-(R5)>0,则(R4)>(R5),把(R5)送(R4);否则(R4)保持不变。再将(R4)分别于(R6)和(R7)比较,比较处理的方法与(R5)与(R4)的比较方法相同,这样比较3次后,R4中的数即为最小值。

单片机io口实验报告

实验一 以下所有KEIL工程、程序均命名为自己姓名的拼音 一、实验目的: 熟悉KEIL软件的开发,掌握程序下载流程 二、实验环境: 1.硬件:PC微机、单片机开发板 2.软件:KEIL 三、实验步骤: 1.在KEIL中新建工程文件,在工程文件下新建C文件“姓名首字母.c”并加入到工程 中(注意C语言编程时,工程中要保留STARTUP.A51汇编文件)。 2.编写程序,初始化内部数据寄存器0x40开始的100个地址单元,写入0x55,然后复 制到0x60开始的存储器中,使用软件仿真的方式调试程序,观察程序模拟运行的结果: #include "reg52.h" unsigned char *p,*q; unsigned char i; int main(){ p=0x40; for(i=0;i<10;i++) { *p=0x55; p++; } for(i=0;i<10;i++) { *p=*q;

q++; p++; while(1); } } 调试时,在调试界面中依次找到 a) 变量观察窗口 b) 存储器窗口 c) 单步运行 d) 全速运行 程序运行结果(存储器窗口截图): 3.编写程序,控制实验板上的LED灯:D1-D3点亮,D4-D7熄灭,D8点亮#include”reg52.h” sbit P1_4=P1^4; int main() { P1_4=0; P0=0x1E;

While(1); } 4.编写C语言程序,实现LED灯循环点亮 #include "reg52.h" void delay (unsigned z) { while(z--); } int main() { unsigned char i; P1&=~(0x01<<4); P0=0xff; i=0x01; while (1) { P0=~i; i=i<<1; if(i==0x0) i=0x01; delay(10000); } } 四、实验总结

相关主题
文本预览
相关文档 最新文档