5单片机实验程序

5单片机实验程序
5单片机实验程序

用查表方式编写y=x13+x23+x33。(x为0~9的整数)

#include

void main()

{

int code a[10]={0,1,8,27,64,125,216,343,512,729};//将0~9对应的每位数字的三次方的值存入code中,code为程序存储器,当所存的值在0~255或-128~+127之间的话就用char,而现在的值明显超过这个范围,用int较合适。int的范围是0~65535或-32768~32767。

int y,x1,x2,x3;//此处定义根据习惯,也可写成char x1,x2,x3但是变量y一定要用int 来定义。

x1=2;

x2=4;

x3=9;//x1,x2,x3三个的值是自定的,只要是0~9当中的数值皆可,也可重复。

y=a[x1]+a[x2]+a[x3];

while(1);//单片机的程序不能停,这步就相当于无限循环的指令,循环的内容为空白。}

//结果的查询在Keilvision软件内部,在仿真界面点击右下角(一般初始位置是右下角)的watch的框架内双击“double-click or F2 to add”文字输入y后按回车,右侧会显示其16进制数值如0x34,鼠标右键该十六进制,选择第一行的decimal,可查看对应的10进制数。

1、有10个8位二进制数据,要求对这些数据进行奇偶校验,凡是满足偶校验

的数据(1的个数为偶数)都要存到内RAM50H开始的数据区中。试编写有关程序。

#include

void main()

{

int a[10]={0,1,5,20,24,54,64,88,101,105};//将所要处理的值存入RAM中,这些可以根据个人随意设定,但建议不要超过0~255的范围。

char i; //定义一个变量

char *q=0x50; //定义一个指针*q指向内部0x50这个地址。

for(i=9;i>=0;i--)//9~0循环,共十次,也可以用for(i=0;i<10;i++)

{

ACC=a[i];//将a[i]的值赋给累加器ACC

if (P==0)//PSW0位上的奇偶校验位,如果累加器ACC内数值1的个数为偶数那么P为0,若为奇数,P为1。这里的P是大写的。

{

*q=a[i];

q++;//每赋一个值,指针挪一个位置指向下一个。

}

}

while(1);//同实验一,程序不能停。

}

3.有10个8位带符号二进制数,请将10个数按从小到大的顺序排列,并存到内RAM50H开始的单元中。

#include

void main()

{

char data a[10]={-50,-36,0,-128,1,99,127,89,-89,40} ;//将所有值存入RAM中,因为有负数,所以不能用unsigned char。因为是char所以假设的数值不要超过-128~+127之外

unsigned char *q=0x50; //定义指针*q指向0x50

unsigned char i,j;

char t; //定义三个变量,用于循环及换位。在换位时有赋值,所以t要用char不能用unsigned char。

for(i=0;i<10;i++)

for(j=0;j<10-i;j++)//冒泡法,具体可以参考C语言程序设计的书。

{

if(a[j]>a[j+1])

{

t=a[j];

a[j]=a[j+1];

a[j+1]=t;

}

}

for(i=0;i<10;i++) //将已经排好序的数组存入*q指向的地址。

{

*q=a[i];

q++;

}

while(1);

}

1、基本部分:

(1)P1口做输出口,接八只发光二极管,编写程序,使发光二极管循环点亮。

#include

void delay(unsigned char x) //定义延迟函数,用于后面LED灯亮的持续时间。

{

unsigned char i,j,k;

do

{

for(i=10;i>0;i--)

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

for(k=249;k>0;k--);

}

while(--x);}

main()

{

P1=0xfe;//11111110第一个灯亮

while(1)

{

delay(1);//延时500ms

P1=P1<<1|1;//P1左移一个位即11111101 具体crol跟<<的区别与具体细节可联系我与你讲解

if(P1==0XFF)

{

P1=0XFE;

}

}

}

(2)P1.0、P1.1作输入口接两个拨动开关,P1.2、P1.3作输出口,接两个发光二极管,编写程序读取开关状态,将此状态,在发光二极管上显示出来。编程时应注意P1.0、P1.1作为输入口时应先置1,才能正确读入值。

#include

sbit p1_0=P1^0;

sbit p1_1=P1^1;

sbit p1_2=P1^2;

sbit p1_3=P1^3;//程序不能对单个引脚进行编程,需要用sbit定义才可用。main()

{

p1_0=1;p1_1=1;p1_2=1;p1_3=1;//前两个引脚置一是为了让其能获取输入信号,后两个引脚是赋初值,方便后面取反工作。

while(1)

{

if(!p1_0)//判断P1.0的引脚是否有变化。

{

p1_2=!p1_2; //如果P1.0引脚变化,P1.2引脚也跟随变化。

}

if(!p1_1)//判断P1.1的引脚是否有变化。

{

p1_3=!p1_3;//如果P1.1引脚变化,P1.3引脚也跟随变化。

}

}

}

2、扩展部分:

(1)利用P1口控制发光二极管LED灯按照下面方式工作:

a)LED灯从左到右依次点亮;

b)LED灯从右到左依次点亮;

c)按照以上步骤重复运行,其中要求灯亮的时间为500ms。

#include

void delay(unsigned char x)

{

unsigned char i,j,k;

do

{

for(i=10;i>0;i--)

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

for(k=249;k>0;k--);

}while(--x);

}

main()

{

while(1) //无限循环里面的内容

{

P1=0XFE;//右移完毕后赋初值,为左移做准备

delay(1);

while(1)

{

P1=P1<<1;//如果左移右移是单个灯移动的话,那么这句改为LED=LED<<1|1;就可以了。

delay(1);

if(P1==0x00) //判断左移是否完毕,完毕break跳出此次的while

break;

}

P1=0x7f; //左移完毕后给P1赋初值,准备右移

delay(1);

while(1)

{

P1=P1>>1;//如果左移右移是单个灯移动的话,那么这句改为LED=LED>>1|0x80;就可以了。

delay(1);

if(P1==0x00)//判断右移是否完毕,完毕后break跳出

break;

}

}

}

(2)利用P1口控制发光二极管LED灯按照下面方式工作:

a)从左到右奇数LED灯依次点亮;

b)从右到左偶数LED灯依次点亮;

c)按照以上步骤重复运行,其中要求灯亮的时间为500ms。

#include //此程序也可以用<<和>>来实现,具体细节可以来问我

#include//当程序中有涉及到_crol_或者_nop_等库函数时,必须添加此头文件。

void delay(unsigned char x)

{

unsigned char i,j,k;

do

{

for(i=10;i>0;i--)

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

for(k=249;k>0;k--);

}while(--x);

}

main()

{

while(1) //无限循环括号里的内容

{

P1=0xfe; //第一个灯亮,

while(1)

{

delay(1);

P1=_crol_(P1,2); //P1左移两个位置

if(P1==0xfe) //判断左移结束

break;

}

P1=0X7f;

while(1)

{

delay(1);

P1=_cror_(P1,2); //P1右移两个位置

if(P1==0x7f) //判断右移结束

break;

}

}

}

#include

void delay(unsigned char x)//延时函数500ms

{

unsigned char i,j,k;

do

{

for(i=10;i>0;i--)

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

for(k=249;k>0;k--);

}while(--x);

}

main()

{

while(1) //无限循环括号里的内容

{

P1=0xfe;//赋值,为左移做准备

delay(1);

while(1)

{

P1=(P1<<1)|0x01;//P1左移一个位置,补位补的是1。此处不明白可以找我。

P1=P1<<1; //P1左移一个位置,补位补的是0。

delay(1);

if(P1==0xaa) //左移结束,跳出循环

break;

}

P1=0X7f; //P1赋值,为右移做准备

delay(1);

while(1)

{

P1=(P1>>1)|0x80; //P1右移一个位,补位补的是1,同样的,不明白来找我

P1=P1>>1; //P1右移一个位

delay(1);

if(P1==0x55) //判断右移是否完毕,退出此次循环。

break;

}

}

}

本实验模拟交通信号灯控制,一般情况下正常显示,有急救车到达时,两个方向交通信号灯全红,以便让急救车通过。设急救车通过路口时间为5秒,急救车通过后,交通恢复正常,本实验用单次脉冲申请外部中断,表示有急救车通过。

#include

unsigned char x,y,i,j,k; //设置

unsigned char d0,d1,d2,d3; //定义四个变量用于记录中断时的现场,以便恢复现场。

void delay(x)//延时函数

{

do

{

for(i=10;i>0;i--)

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

for(k=249;k>0;k--);

}

while(--x);

}

zd() interrupt 0 //定义中断函数,无需声明。interrupt 0表示外部中断0的中断函数

{

y=P1;

d0=x;

d1=i;

d2=j;

d3=k; //记录中断时P1的值,延时函数的x,i,j,k也要记录。

P1=0xf6; //P1应为东西红南北红,所以设为F6。

delay(5);

x=d0;

i=d1;

j=d2;

k=d3;

P1=y; //现场恢复,包括延时函数中的x,i,j,k。

}

main()

{

P1=0xf6; //P1设定初始状态,两路皆为红灯,此步骤可以忽略。

delay(1);

EA=1; //开总中断

EX0=1; //开外部中断0中断。

IT0=1; //设置外部中断0为下降沿触发有效方式。IT0=0为低电平有效

while(1) //下列四种灯亮的状态循环。

{

P1=0xf3;//东西绿,南北红

delay(10);

P1=0xf5; //东西黄,南北红

delay(3);

P1=0xde;//东西红,南北绿

delay(10);

P1=0xee; //东西红,南北黄

delay(3);

}

}

1、基本部分:

用CPU内部定时器中断方式计时,实现每一秒钟输出状态发生一次反转.

#include

sbit p1_0=P1^0; //要使用单个引脚应先定义

unsigned char i;

void main()

{

TMOD=0X01;//t0工作在定时器,工作方式1

TL0=0XB0;

TH0=0X3C;//设定定时器初值,初值的计算可查看书本P143,此处定时器定时时间为100ms

IE=0X82; //开EA总中断,开t0中断

TR0=1; //定时器工作开关开启

i=10; //设定i作为后面定时一秒的使用

while(1);

}

t_0() interrupt 1//T0定时/计数器的中断

{

i--; //进入一次中断,i的值减一

if(i==0) //当进入10次中断,即i=0的时候,定时时间为1S。

{

i=10; //重新让i=10,使得后面继续定时1S。

p1_0=~p1_0; //P1.0取反。

}

TL0=0XB0;

TH0=0X3C;//赋定时初值,定时器或计数器必要步骤,除工作方式2外。

}

2、扩展部分:

利用P1口控制发光二极管LED灯按照下面方式工作:

1)从左到右奇数LED灯依次点亮;

2)从右到左偶数LED灯依次点亮;

3)按照以上步骤重复运行,其中要求灯亮的时间为500ms,由定时器T1实现。

#include

#include

unsigned char i,j,k;

void main()

{

TMOD=0X10; //设定T1工作在定时器T1,方式1。同时也会设定T0工作在定时器T0,方式0,但是我们后面没有interrupt 1的子函数,所以T0没发挥作用。

IE=0X88; //开总中断,开T1中断

TL1=0XB0;

TH1=0X3C;//定时器初值,时间为100ms

TR1=1; //开定时器T1的开关

i=5;

j=0;

k=0; //用三个变量来判断时长,循环阶段。

P1=0xfe; //赋P1初值,第一个灯亮

while(1); //等待定时工作完成

}

t_1() interrupt 3 //T1的中断子函数

{

i--; //进入一次,i就减1

TL1=0xB0;

TH1=0x3C; //每次进入中断定时器的初值就为0,所以需要重装

if(i==0) //500ms后

{

i=5; //让i=5,继续定时500ms。

j++; //j一开始为0,j加一

if(j==4)//如果j等于4,代表P1口左移了四次

{

j=0;

k=!k; //k取反,用于后面左移右移的执行

}

if(k==0) //P1口左移

{

if(P1==0xfd) //左移到头了,要右移需要把灯亮的位置变化下

{

P1=0xbf;

}

P1=_crol_(P1,2);

}

if(k!=0)//P1口右移

{

if(P1==0xbf)//右移到头了,要右移需要把灯亮的位置变化下

{

P1=0xfd;

}

P1=_cror_(P1,2);

}

}

}

#include

unsigned char i,j;

void main()

{

i=5;

j=0;

P1=0xfe;//只亮第一个灯

TMOD=0X10; //设置T1的工作方式为1,定时器工作

IE=0X88; //中断EA开,ET1开

TL1=0XB0;

TH1=0X3C; //初值设定为100ms

TR1=1; //开启工作开关

while(1); //等待定时工作完成

}

t_1() interrupt 3 //T1中断子函数

{

i--;

TL1=0XB0;

TH1=0X3C; //赋初值

if(i==0)//时间为500ms

{

i=5;

j++; //利用j来判断左移或右移是否结束

if(j<4)

{

P1=P1<<1|0x01;

P1=P1<<1|0x01; //P1口左移两位,且补位是补1。也可以用P1=P1<<2|0X03代替

}

if(j==4) //左移结束,赋P1值准备右移

{

P1=0x7f;

}

if(j>4) //右移阶段

{

P1=P1>>1|0X80;

P1=P1>>1|0X80;//P1口右移两位,且补位是补1。也可以用P1=P1>>2|0XC0代替

}

if(j==8) //右移结束,赋P1值准备左移

{

P1=0xfe;

j=0; //最后还要将J恢复为0以便下次循环。

}

}

}

1、基本部分:

8031内部定时计数器T0,按计数器模式和方式1工作,对P3.4(T0)引脚进行计数。将其数值按二进制数在P1口驱动LED灯上显示出来。

#include

void main()

{

TMOD=0X05; //T0工作方式1,计数器工作

TL0=0X00;

TH0=0Xff;//初值设置方法可以参考P143页

IE=0X82; //中断EA=1,ET0中断开启

TR0=1; //开启中断开关

while(1)

{

P1=~TL0; //计数器的值存在TL0里面。每加一个值,所得的值就是以八位二进制形式存在TL0里面的。

}

}

t_0() interrupt 1 //T0的计数器中断

{

TL0=0X00;

TH0=0Xff;

}

2、扩展部分:

利用T0作为定时器,T1作为计数器,将试验箱上的脉冲信号源接到T1引脚,测量出脉冲信号源的频率。

#include

unsigned char i,a;

void main()

{

a=0;

i=10;

TMOD=0X51; //设置T0为工作方式1,定时器工作。T1为工作方式1,计数器工作

EA=1;

ET0=1;

ET1=0;//这里也可以设置为IE=0x82。关闭了T1的中断

TL0=0XB0;

TH0=0X3C;//时间设定为100ms

TL1=0X00;

TH1=0X00; //计数器开启最大范围计数

TR0=1;

TR1=1; //皆开启开关

while(1)//等待计数定时工作完成

{

if(TF1==1)//查询溢出标志位。

{

a++; //溢出一次a的值加1

TF1=0; //将溢出标志位清零

TH1=0x00;

TL1=0X00;//重新装上计数器初值

}

}

}

t_0() interrupt 1 //定时器T0的中断子程序

{

TL0=0XB0;

TH0=0X3C; //赋初值

i--;

if(i==0)

{

i=10;

P1=TL1;//将低位记录的次数赋给P1显示出来。

P2=TH1;//将高位记录的次数赋给P2显示出来,即一秒内的计数次数,即为频率。

TR0=0;

TR1=0;//频率读出后关闭T0和T1

}

}

//一般情况下,所测频率不能超过500kHz,否则此程序结果有错。程序频率计算为:P1和P2的读数转为十进制数字,加上(a*65536)得出频率总和。

1、基本部分:

利用74ls165读入拨盘开关的状态,利用单片机串行口将状态读入并通过P1口输出到LED,从而实现拨盘开关对LED灯的控制。

#include

sbit P1_6=P1^6; //实验箱内部已经将P1.6引脚与165的S/L引脚相连,也把P3.6与165的CLK引脚相连

void main()

{

SM0=0;

SM1=0;

REN=1; //串行口工作方式0,也可用SCON=0x10

EA=1;

ES=1; //开总中断和串行口中断

while(1);

}

I_0() interrupt 4 //串行口中断子程序

{

P1_6=0; //让74LS165将按键的状态读入

P1_6=1; //让74LS165将读入的8位按键码用串行方式输出,从低位到高位;

P2=SBUF; //将SBUF缓冲器里的数据读给P2

RI=0;//RI要由软件置0

}

2、扩展部分:

利用74ls165读入拨盘开关的状态,利用单片机P3口将状态读入并通过P1口输出到LED,从而实现拨盘开关对LED灯的控制。

#include

sbit p1_6=P1^6;//与165的内部S/L相连

sbit p3_6=P3^6; //与165的内部CLK相连

sbit p1_7=P1^7; //P1.7短路帽扣上时,P1.7与165的QH相连

unsigned char i,x;

main()

{

while(1)

{

p1_6=0; //数据移入165芯片

p1_6=1; //数据从165芯片输出

x=p1_7; //防止第一位丢失

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

{

p3_6=0;

p3_6=1; //内部制造一个上升沿,从而达到数据传输,一个上升沿一个数据。

x=x<<1|p1_7;//每次左移一个位,空出来的位补P1_7的值

}

P2=x; //将移位完的X赋给P2,那么P2上显示的就是按键的二进制状态}

}

1、基本部分:

利用单片机串行口,实现两个实验台之间的串行通讯。其中一个实验台作为发送方,另一侧为接收方。利用发送方的拨盘控制接收方的LED。

甲方:

#include

void main()

{

SM0=0;

SM1=1;

SM2=0;//设定串行口工作方式1,单对单通信,可用SCON=0X40代替

EA=0;

ES=0;

ET1=0; //关串行口中断,关总中断,关定时/计数器T1中断

PCON=0; //设置SMOD=0,波特率不加倍

TMOD=0X20; //设置定时/计数器T1为工作方式2,定时器工作

TH1=0XFE;

TL1=0XFE; //赋初值,此处赋值与定时或计数赋初值不同,此处初值用于波特率,可参考P168

TR1=1; //开定时器T1

while(1)

{

SBUF=P2; //把P2口接收到的值赋给发送SBUF,准备发送

while(TI==0); //等待发送完毕

TI=0; //将发送标志位TI置0,此步一定要软件操作

}

}

乙方:

#include

void main()

{

SM0=0;

SM1=1;

SM2=0;

REN=1; //串行口工作方式1,单对单通信,可用SCON=0x50代替

EA=0;

ET1=0;

ES=0; //关所有中断

TMOD=0X20; //T1工作方式2,定时器工作

PCON=0; //SMOD=0,波特率不加倍

TH1=0XFE;

TL1=0XFE; //与发送端相同的波特率,则初值也应当一样

TR1=1;

while(1)

{

while(RI==0); //等待接收完毕

P1=SBUF; //将接收到的值赋给P1

RI=0; //将接收标志位置0

}

}

2、扩展部分:

利用单片机的串行口完成数据的自发自收,发送数据在内部RAM30H为首的8个单元中,数据分别是:55H,AAH,33H,CCH,0FH,F0H,66H,99H;接收后能在LED显示出接收的数据值(二进制形式)。

#include

unsigned char x,i,*p,*q;

void delay(x)

{

unsigned char j,k,l;

do

{

for(j=10;j>0;j--)

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

for(l=249;l>0;l--);

}

while(--x);

}

main()

{

unsigned char data a[8]={0x55,0xAA,0x33,0xCC,0x0F,0xF0,0x66,0x99};

p=0x30;

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

{

*p=a[i];

p++;

}

SM0=0;

SM1=1;

REN=1;//串行口工作方式1,可用SCON=0X50代替

TMOD=0X20; //T1工作在方式2,定时器工作

PCON=0; //SMOD=0,波特率不加倍

TH1=0Xe8;

TL1=0Xe8; //设定初值,用于设定波特率,换算公式参考P168

EA=1; //开总中断

ET1=0; //关定时器T1中断,此处一定要关中断,因为我们不是用该定时器来做定时工作的

ES=1; //开串行口中断

q=0x30; //指针指向0x30地址

TR1=1; //开T1工作开关

SBUF=*q; //将指针指向的值赋给发送SBUF等待发送

while(1);

}

T_1() interrupt 4 //串行口中断程序

{

q++; //传输完一个数据后,指针加1,指向下一个位置

P1=SBUF;//将接收到的数据在P1口显示出来

delay(1);//延时500MS(晶振在12MHz的前提下)

SBUF=*q; //将指针指向的值赋给发送SBUF,准备发送

TI=0;

RI=0;//置TI和RI为0

}

最新单片机原理实验教案参考程序

单片机原理实验教案 参考程序

广东松山职业技术学院《MCS-51单片机原理》实验指导书 宁玉珊黄晓林 使用Proteus辅助设计与仿真

实训项目1 Proteus辅助设计与仿真的使用 一、实训目的 学习并熟练掌握PROTEUS辅助设计与仿真软件的使用。通过使用Proteus的ISIS组件绘制AT89C51功能接口原理图,并对原理图编写程序和调试程序,观察在仿真条件下的实现功能的效果。 二、实训内容 在PROTEUS仿真环境下实现一个发光二极管(LED)闪烁。要求LED亮0.5s灭1s,并绘制原理图和编写实现程序,同时用虚拟的示波器观察硬件和软件实现的效果。 三、实训器材 安装有Proteus7软件的计算机 1 台。 四、实训步骤 1)在硬盘建立文件夹用来保存新建项目的所有文件。如在D盘建立PROJECT文件夹。 2)选择‘开始→程序→Proteus7 professional→ISIS professional(或者双击桌面图标ISIS)’,进入Proteus仿真环境,如图P1_1和P1_2所示。 图P1-1

图P1-2 3)选择菜单【File/New Design】创建一个新的设计项目,如图P1_3所示。 图P1-3 4)此时系统会弹出模板选择窗口,选择‘DEFAULT’点击【OK】即可,如图P1_4所示。

图P1_4 5)点击界面左侧工具栏中的图标,接着点击元件池上方的按钮,将要用到的元器件从系统库调到当前设计文件库中。在弹出的Pick Devices对话框左上角的‘Keywords’文本框中键盘输入元件名(或元件的其它关键词)搜索到需要的元器件。双击‘Results’栏下的目标元件,该元件即调出到当前设计文件库的元件列表中,如图P1_5所示。本实训中所要用到的元件如表PS1_1所示。 图P1_5 元件名称搜索关键词元件序 数值备注 号 电阻器Resistor R1 10k 电阻器Resistor R2 1k 电解电容器MINELECT1U63V C1 4.7μ 陶瓷电容器CERAMIC22P C2、C3 22p 晶振CRYSTAL X1 12MHz 单片机AT89C51 U1

单片机实训报告范文精选5篇

单片机实训报告范文精选5篇 实训报告是展示自身实训收获成长的重要报告,那么实训报告该如何写呢?小编精选了一些关于实训报告的优秀范例,一起来看看吧。 单片机课程设计心得体会 在学校学习期间我有幸的参加了学校的单片机学习小组,在小组里我了解了什么是单片机,单片机有哪些用途,利用单片机可以实现哪些功能来方便人们的生活如交通灯,时钟,还有手机中,电子玩具等等,它们里面都有单片机的存在来实现某种功能。通过在单片机小组里的学习我简单总结了几点心得和体会: 第一:万事开头难,要勇敢的迈出第一步,不要总找借口说没有学习过就总推脱。凡事都有第一步可以先可简单的来,然后可以逐步的向深层次学习。可以从建项目开始,然后可以找一个简单的小程序先把它敲进单片机内然他运行起来,感觉一下单片机的运行,让自己了解单片机整个运行。 第二:对于知识点,学过的要掌握牢固,对于没有学的和暂时用不到的先不用学习。比如:小灯得点亮就没有用到中断可以先不用看。这样可以避免知识过多记不住的麻烦。对于程序这里的知识点不能只停留在理论层次上,一定要结合着程序进行学习这样才能掌握的很牢靠,当用到哪里的知识点不记得了可以去看书,对于用不到的可以不去看。 第三:程序不要只是看别人得,一定要自己写过才是自己的。开始

不懂可以参考别人的,看看每一句代表着什么意思,能够实现什么现象。明白之后自己再重新写一遍,你会发现看别人的能懂到自己写的时候很困难。当你自己能写出来的时候说明你真懂了。 第四:一定要学会程序调试的方法。有时候把程序写完了然后运行时不能实现理想的现象。这时有人就晕了不知该怎么办,然后就去问别人。当别人找出问题出在哪里时就会恍然大悟。其实当遇到问题一定要自己尝试着解决,不能遇到问题就去问别人。自己一定要掌握解决问的方法和思路。 第五:在学习初期看别人的代码,学习别人的思路这个很有用。通过看别人的代码特别是有多年编程经验的人的程序,可以迅速提高自己的编程水平。也可以结合着别人的手法,与自己的想法结合在一起写出更好的程序。但是切记将学习变成抄袭,不能认为抄袭别人的你就学会了,这样只能使你退步。第六:面对一个新项目时,自己一定要多想想,不要急着去看别人是怎么写的。有的人看到新项目时就去找别人的然后抄一小段,自己在写几句,放在一起完成任务,虽然省时间但不利你的学习。当你遇到一新项目时你应该先想一下程序的构架,想想如何来完成。然后自己动手去写,当你遇到实在是没办法解决的问题时再去请教别人,看他是怎么处理的,学习他的方法。这样起码你自己想过了,有自己的思路不会受到别人的影响,这样更容易提高自己。 在单片机的学习开始时感觉很吃力,在不断的学习过程中慢慢的对

实验5 STC单片机ADC转换实验-V20170317

实验 5 1.实验目的 学习STC12C5A单片机ADC知识; 2.实验设备 硬件:12号节点,串口线; 软件:KeiluVision4编译软件,STC下载软件STC_ISP; 芯片手册:配套光盘\附件\芯片手册\STC单片机手册 源码路径:配套光盘\源代码\单片机原理与技术\实验5 hex路径:配套光盘\源代码\单片机原理与技术\实验5 3.实验原理 3.1A/D相关寄存器介绍 与A/D转换有关的寄存器如表3.1所示: 表3.1A/D相关寄存器 P1ASF:P1口的模拟功能控制器。STC12C5A16S2系列单片机的A/D转换口,在P1口(P1.7-P1.0),上电复位后P1口默认为弱上拉型I/O口,用户可以通过软件设置将8路中的任何一路设置为A/D转换,不需作为A/D使用的P1口可继续作为I/O口使用(建议只作为输入)。需作为A/D使用的口需先将P1ASF特殊功 能寄存器中的相应位置为‘1’,将相应的口设置为模拟功能。P1ASF寄存器的定义如表3.2所示: 表3.2P1ASF寄存器定义 ADC_CONTR:ADC控制寄存器。该寄存器的描述如表3.3所示: 表3.3ADC_CONTR寄存器定义 对ADC_CONTR寄存器的操作建议使用直接赋值语句,不要使用“与”和“或”语句。 ADC_POWER:?ADC电源控制位。 0:关闭A/D转换器电源 1:打开A/D转换器电源 建议进入空闲模式时,将ADC电源关闭,即ADC_POWER?=0。启动A/D转换前一定要确认A/D电源已打开,A/D转换结束后关闭A/D电源可降低功耗,也可不关闭。初次打开内部A/D转换模拟电源,需适当延时,等内部模拟电源稳定后,再启动A/D转换。 建议启动A/D转换后,在A/D转换结束之前,不改变任何I/O口的状态,有利于高精度A/D?转换,若能将定时器/串行口/中断系统关闭更好。 SPEED1,SPEED0:模数转换器转换速度控制位,其描述如表3.4所示: 表3.4SPEED1、SPEED0描述 ADC_FLAG:模数转换器转换结束标志位,当A/D转换完成后,ADC_FLAG=1,要由软件清0。不管是A/D转换完成后由该位申请产生中断,还是由软件查询该

重庆大学 单片机实验

实验一系统认识及基本程序设计实验 四、实验内容 1. 将BCD 码整数0~255 存入片内RAM 的20H、21H、22H 中,然后转换为二进制整数00H~FFH,保存到寄存器R4 中。修改20H、21H、22H 单元的内容,如:00H,05H,08H;观察实验结果。 参考程序: ;============================================================== ; 文件名称: Asm2-1.asm ; 功能描述: BCD整数转换为二进制整数(8位, 范围从00H--FFH) ;============================================================== ORG 0000H LJMP MAIN ORG 0100H MAIN: MOV R0, #20H ;BCD存放高位地址 MOV R7, #03H ;BCD码0--255, 最多3位 CLR A MOV R4, A LP1: MOV A, R4 MOV B, #0AH MUL AB ;乘10 ADD A, @R0 ;加下一位的值 INC R0 ;指向下一单元 MOV R4, A ;结果存入R4 DJNZ R7, LP1 ;转换未结束则继续 SJMP MAIN ;设置断点, 观察实验结果R4中的内容 END 2. 将16 位二进制整数存入R3R4 寄存器中,转换为十进制整数,以组合BCD 形式存储在RAM 的20H、21H、22H 单元中。 参考程序: ;============================================================= ; 文件名称: Asm2-2.asm ; 功能描述: 二进制整数(16位)转换为十进制整数(组合BCD) ;============================================================= ; 0--FFFFH(R3R4)==>0--65535 ORG 0000H LJMP MAIN ORG 0100H MAIN: MOV R0, #22H ;转换结果低位地址 MOV A, R0 PUSH ACC ;ACC表示累加器A的直接地址 MOV R7, #03H

实验5 STC单片机ADC转换实验-V20170317

实验5 STC单片机ADC转换实验-V20170317 1.实验目的 学习STC12C5A单片机ADC知识; 2.实验设备 硬件:12号节点,串口线; 软件:Keil u Vision4编译软件,STC下载软件STC_ISP; 芯片手册:配套光盘\附件\芯片手册\STC单片机手册 源码路径:配套光盘\源代码\单片机原理与技术\实验 5 STC单片机ADC转换实验-V20170317 hex路径:配套光盘\源代码\单片机原理与技术\实验 5 STC单片机ADC转换实验-V20170317\out\ADC.hex 3.实验原理 3.1 A/D相关寄存器介绍 与A/D转换有关的寄存器如表3.1所示: 表3.1 A/D相关寄存器 P1ASF:P1口的模拟功能控制器。STC12C5A16S2系列单片机的A/D转换口,在P1口(P1.7-P1.0),上电复位后P1口默认为弱上拉型I/O口,用户可以通过软件设置将8路中的任何一路设置为A/D转换,不需作为A/D使用的P1口可继续作为I/O口使用(建议只作为输入)。需作为A/D使用的口需先将P1ASF特殊功能寄存器中的相应位置为‘1’,将相应的口设置为模拟功能。P1ASF寄存器的定义如表3.2所示: 表3.2 P1ASF寄存器定义 ADC_CONTR:ADC控制寄存器。该寄存器的描述如表3.3所示: 表3.3 ADC_CONTR寄存器定义

对ADC_CONTR寄存器的操作建议使用直接赋值语句,不要使用“与”和“或”语句。 ADC_POWER: ADC电源控制位。 0:关闭A/D转换器电源 1:打开A/D转换器电源 建议进入空闲模式时,将ADC电源关闭,即ADC_POWER =0。启动A/D转换前一定要确认A/D电源已打开,A/D转换结束后关闭A/D电源可降低功耗,也可不关闭。初次打开内部A/D转换模拟电源,需适当延时,等内部模拟电源稳定后,再启动A/D转换。 建议启动A/D转换后,在A/D转换结束之前,不改变任何I/O口的状态,有利于高精度A/D 转换,若能将定时器/串行口/中断系统关闭更好。 SPEED1,SPEED0:模数转换器转换速度控制位,其描述如表3.4所示: 表3.4 SPEED1、SPEED0描述 ADC_FLAG:模数转换器转换结束标志位,当A/D转换完成后,ADC_FLAG=1,要由软件清0。不管是A/D转换完成后由该位申请产生中断,还是由软件查询该标志位A/D转换是否结束,当A/D转换完成后,ADC_FLAG = 1,一定要软件清0。 ADC_START:模数转换器(ADC)转换启动控制位,设置为“1”时,开始转换,转换结束后为0。 CHS2/CHS /CHS0:模拟输入通道选择,CHS2/CHS1/CH0描述如表3.5所示: 图3.5 CHS2/CHS1/CH0定义 ADC_RES、ADC_RESL:ADC结果寄存器。该寄存器用于存A/D转换结果,其定义如表3.6所示: 表3.6 ADC_RES、ADC_RESL寄存器定义

单片机U盘读写参考程序

/*******************************************************/ #include"reg52.h" #include"stdio.h" #include "string.h" #include "intrins.h" #include"CH375INC.H" /*******************************************************/ #define uchar unsigned char #define uint unsigned int /*******************************************************/ sbit CH375_INT=P3^3; sbit CH375_A0=P3^4; sbit CH375_RD=P3^5; sbit CH375_WR=P3^6; sbit CH375_CS=P3^7; /*******************************************************/ uchar xdata my_buf[512]; /*******************************************************/ void uart_init() { TMOD=0X20; TH1=TL1=0XFD; TR1=1; REN=1; SM0=0;SM1=1; EA=1; ES=1; } /*******************************************************/ void uart_send_pc(uchar *s) //串口监视//void uart_send_pc(uchar a[20]) { //{ uchar len=strlen(s); // uchar i; uchar i; // for(i=0;i<20;i++) for(i=0;i

单片机实验--LCD显示实验

实验19L C D显示实验 一、实验目的: 学习液晶显示的编程方法,了解液晶显示模块的工作原理。 掌握液晶显示模块与单片机的接口方法。 二、所需设备 CPU挂箱、8031CPU模块 三、实验内容 编程实现在液晶显示屏上显示中文汉字“北京理工达盛科技 有限公司”。 四、实验原理说明 五、实验步骤 1、实验连线 8255的PA0~PA7接DB0~DB7,PC7接BUSY,PC0接REQ,CS8255 接CS0。 2、运行实验程序,观察液晶的显示状态。 六、程序框图 八、附:点阵式LCD 模块 点阵式LCD模块 由一大一小两块液晶 模块组成。两模块均 由并行的数据接口和 应答信号接口两部分 组成,电源由接口总 线提供。 (1)OCMJ2×8液晶 模块介绍及使 用说明 OCMJ中文模块系列液晶显示器内含 GB 2312 16*16点阵国标一级简体汉字和 ASCII8*8(半高)及8*16(全高)点阵英文字库,用户输入区位码或 ASCII 码即可实现文本显示。 OCMJ中文模块系列液晶显示器也可用作一般的点阵图形显示器

之用。提供有位点阵和字节点阵两种图形显示功能,用户可在指定的屏幕位置上以点为单位或以字节为单位进行图形显示。完全兼容一般的点阵模块。 OCMJ中文模块系列液晶显示器可以实现汉字、ASCII 码、点阵图形和变化曲线的同屏显示,并可通过字节点阵图形方式造字。 本系列模块具有上/下/左/右移动当前显示屏幕及清除屏幕的命令。一改传统的使用大量的设置命令进行初始化的方法,OCMJ 中文模块所有的设置初始化工作都是在上电时自动完成的,实现了“即插即用”。同时保留了一条专用的复位线供用户选择使用,可对工作中的模块进行软件或硬件强制复位。规划整齐的10个用户接口命令代码,非常容易记忆。标准用户硬件接口采用REQ/BUSY 握手协议,简单可靠。 硬件接口 接口协议为请求/应答(REQ/BUSY)握手方式。应答BUSY 高电平(BUSY =1)表示 OCMJ 忙于内部处理,不能接收用户命令;BUSY 低电平(BUSY =0)表示 OCMJ 空闲,等待接收用户命令。发送命令到 OCMJ可在BUSY =0 后的任意时刻开始,先把用户命令的当前字节放到数据线上,接着发高电平REQ 信号(REQ =1)通知OCMJ请求处理当前数据线上的命令或数据。OCMJ模块在收到外部的REQ高电平信号后立即读取数据线上的命令或数据,同时将应答线BUSY变为高电平,表明模块已收到数据并正在忙于对此数据的内部处理,此时,用户对模块的写操作已经完成,用户可以撤消数据线上的信号并可作模块显示以外的其他工作,也可不断地查询应答线BUSY是否为低(BUSY =0?),如果BUSY =0,表明模块对用户的写操作已经执行完毕。可以再送下一个数据。如向模块发出一个完整的显示汉字的命令,包括坐标及汉字代码在内共需5个字节,模块在接收到最后一个字节

单片机实验报告

南京晓庄学院电子工程学院 实验报告 课程名称:单片机系统设计与应用 姓名:森 专业:电子信息科学与技术 年级: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)

51单片机实验程序

3 3 3 用查表方式编写y=x1 +x2 +x3 。(x 为0~9 的整数) #include void main() { int code a[10]={0,1,8,27,64,125,216,343,512,729}; //将0~9 对应的每位数字的三次方的值存入code中,code为程序存储器,当所存的值在0~255 或-128~+127 之间的话就用char ,而现在的值明显超过这个范围,用int 较合适。int 的范围是0~65535 或-32768~32767 。 int y,x1,x2,x3; //此处定义根据习惯,也可写成char x1,x2,x3 但是变量y 一定要用int 来定义。 x1=2; x2=4; x3=9; //x1,x2,x3 三个的值是自定的,只要是0~9 当中的数值皆可,也可重复。 y=a[x1]+a[x2]+a[x3]; while(1); //单片机的程序不能停,这步就相当于无限循环的指令,循环的内容为空白。 } //结果的查询在Keilvision 软件内部,在仿真界面点击右下角(一般初始位置是右下角)的watch 的框架内双击“double-click or F2 to add”文字输入y 后按回车,右侧会显示其16 进制数值如0x34,鼠标右键该十六进制,选择第一行的decimal,可查看对应的10 进制数。 1、有10 个8 位二进制数据,要求对这些数据进行奇偶校验,凡是满足偶校验的 数据(1 的个数为偶数)都要存到内RAM50H 开始的数据区中。试编写有关程序。 #include void main() { int a[10]={0,1,5,20,24,54,64,88,101,105}; // 将所要处理的值存入RAM 中,这些可以根据个人随意设定,但建议不要超过0~255 的范围。 char i; // 定义一个变量 char *q=0x50; // 定义一个指针*q 指向内部0x50 这个地址。 for(i=9;i>=0;i--) //9~0 循环,共十次,也可以用for(i=0;i<10;i++) { ACC=a[i]; //将a[i] 的值赋给累加器ACC if (P==0) //PSW0 位上的奇偶校验位,如果累加器ACC 内数值1 的个数为偶数那么P 为0,若为奇数,P 为1。这里的P 是大写的。 { *q=a[i]; q++; // 每赋一个值,指针挪一个位置指向下一个。 } } while(1); //同实验一,程序不能停。 }

单片机实验5个

HEFEI UNIVERSITY 单片机实训 题目单片机应用技术实验 系别电子信息与电气工程系 专业自动化 班级自动化()班 成员 学号 指导老师储忠 完成时间2011-6-20

实验内容及要求 实验一构建单片机最小系统和实验环境熟悉 1、熟悉单片机最小系统的组成和工作原理,熟悉Keil C51集成环境软件的安装和使用方法。 2、作出单片机最小系统的组成原理图,分析其各构成单元的工作原理。 3、熟悉MCS51汇编指令。 4、进行存储单元数据传输实验,编写程序。 5、运行程序,验证译码的正确性。 实验二跑马灯实验及74HC138译码器 跑马灯实验: 1、熟悉集成环境软件或熟悉Keil C51集成环境软件的安装和使用方法。 2、8个指示灯,循环点亮,瞬间只有一个灯亮。 3、观察实验结果,验证程序是否正确。 74HC138译码器实验: 1、设计74HC138接口电路,编写程序:使用单片机的P1.0、P1.1、P1.2控制74HC138的数据输入端,通过译码产生8选1个选通信号,轮流点亮8个LED指示灯。 2、运行程序,验证译码的正确性。 实验三8255控制交通灯实验 1、设计8255接口电路,编写程序:使用8255的PA0.. 2、PA5..7控制LED指示灯,实现交通灯功能。 2、连接线路验证8255的功能,熟悉它的使用方法。 实验四8253方波实验 1、设计接口电路,编写程序:使用8253的计数器0和计数器1实现对输入时钟频率的两级分频,得到一个周期为1秒的方波,用此方波控制蜂鸣器,发出报警信号,也可以将输入脚接到逻辑笔上来检验程序是否正确。 2、连接线路,验证8253的功能,熟悉它的使用方法。

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 口,如图所示:

单片机实验参考程序

实验一键盘输入实验 参考程序: ;4*4矩阵键盘读取程序,利用P0口,列线左起P0.0-P0.3 ;行线上起P0.4-P0.7,行线默认接高电平, ;P3.7作为键盘被读取的提示灯 ; 0 1 2 3 ; 4 5 6 7 ; 8 9 A B ; C D E F ;不考虑有两个或以上按键同时按下的情况, ;每次扫描到一个有按下则结束本次扫描 SETB P3.7 ;确认关闭键盘响应指示灯 MAIN: MOV R0,#0EFH ;用于给键盘行列线确定的电平 MOV R1,#0H ;循环次数,R1=0对应第一行,=1为第二行,以此类推SMAIN: MOV P0,R0 ;改变行线的状态,列线全处于高电平 NOP NOP MOV A,P0 JB ACC.0,L1 ;判断某行的第一列是否按下,按下则P0.0为低电平 MOV R2,#0H ; 将某行的列码保存至R2,显示程序会根据此值和R1的值计算具体为何按键按下 ACALL DISP SJMP MAIN ; 每次扫描到一个有按下则结束本次所有扫描

L1: JB ACC.1,L2 ;判断某行的第二列是否按下,按下则P0.1为低电平MOV R2,#01H ACALL DISP SJMP MAIN L2: JB ACC.2,L3 ;判断某行的第三列是否按下,按下则P0.2为低电平MOV R2,#02H ACALL DISP SJMP MAIN L3: JB ACC.3,SKIP ;判断某行的第四列是否按下,按下则P0.3为低电平MOV R2,#03H ACALL DISP SJMP MAIN ; SKIP: INC R1 ;R1加1,共计4行, MOV A,R0 RL A ;左移R0内的值,以并扫描下一行 MOV R0,A CJNE R1,#04H,SMAIN ;若四行扫描完毕,则跳转至程序最初,相关参数为初始值NO: MOV P2,#0FFH ;程序能执行到此说明四行扫描完毕并且一个按键都没按下,关闭数码管和指示灯 SETB P3.7 SJMP MAIN DISP: CLR P3.7 ;点亮键盘响应指示灯 MOV A,R1 RL A RL A ;R1对应行,具体的按键计算为R1*2+R2 ADD A,R2 ADD A,#3H ;下列指令与表格见有3字节的距离 MOVC A,@A+PC MOV P2,A ;十六进制的高位用数码管L1显示 RET ;共阳数码管0-F的显示码 DIS: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H DB 80H,90H,88H,83H,0C6H,0A1H,86H,8EH DELAY: m ov r7,#255;延时 del1: mov r6,#255; del2: djnz r6,del2 djnz r7,del1 ret END

单片机实验答案

前言 由于单片机具有高可靠性、超小型、低价格、容易产品化等特点,在仪器仪表智能化、实时工业控制、实时数据采集、智能终端、通信设备、导航系统、家用电器等控制应用领域,具有十分广泛的用途。目前在国内单片机应用中,MCS-51系列单片机仍然是一种主流单片机。为配合《单片机应用技术》课程的教学,使学生尽快了解、掌握89C51单片机的使用,特编写了这本上机指导书(基础篇)。 《单片机》是一门实践性很强的课程,提高教学质量的一个重要环节是上机实习和训练,无论是学习汇编语言程序设计,还是学习接口电路和外设与计算机的连接,或者软硬兼施地研制单片机应用系统,不通过加强动手是不能获得预期效果的。本实验指导书提供了9个实验的指导性材料,实验还有一些思考题,可以根据课时的安排和教学要求进行取舍。为了达到某些实验的目的,书中提供的参考程序与实际应用中的程序会有些差别,所以不一定是最优的。 由于时间紧迫,加上编者学识有限,如有不妥之处,欢迎读者批评指正。 编者

实验须知 1. 实验前必须阅读教科书的有关部分和本实验指导书,了解实验目的、内容、步骤,做好实验前的准备工作,编写好实验中要求自编或修改的程序;完成实验前要求完成的准备工作后方可以上机实验,否则不得上机操作。 2. 各种电源的电压和极性不能接错,严禁带电接线和接插元器件。通电前须经过指导教师检查认可后方能通电。 3. 不准随意拨弄各种与实验无关的旋钮和开关,凡与本次实验无关的任何设备都禁止动用和摸弄,注意安全。 4. 严禁用手触摸实验系统印制电路板和元器件的引脚,防止静电击穿芯片。 5. 实验中若损坏仪器或元器件,应及时向指导教师报告,听候处理。 6. 在实验室内保持安静和卫生,不得随意走动和喧哗,集中精力完成实验。 7. 实验完成后,关掉电源,及时整理实验台桌面,保持环境整洁。 8. 按规定认真完成实验报告,对实验中出现的现象进行分析,在规定的时间内交上实验报告。 9. 凡实验或实验报告未能按规定完成的学生,不能参加本课程的考试或考查。

单片机实验模版

单片机实验模版 本科实验报告 课程名称:单片机综合设计学院(系): 专业:电子 班级: 学号: 学生姓名: 2018 年月日

实验项目列表 注意:独立完成预习报告和实验操作。 专业:班级:学号: 学生签字: 联系:

《单片机原理及应用实验》报告填写要求依照《大连理工大学本科实验报告规范(试行)》提出的各项要求,现规定《单片机原理及应用实验》报告填写要求如下: 一、每次实验前必须完成预习报告。注意:预习报告中的回答问题必须手写,且由 学生本人签名。第一次实验时,课前将预习报告与《实验项目列表》一同交给 实验老师。每次实验时,课前提交预习报告,没有完成预习报告者不得进行实 验。 二、每一个实验项目均须撰写一份实验报告,最后按顺序装订、上交。 三、实验报告内容: 1、实验目的和要求:写明实验的目的和任务要求; 2、实验原理和内容:与实验内容相关的算法描述、程序的结构类型,与实验相关的 接口模块功能描述。 3、算法流程:使用流程图对算法进行描述。流程图应当逻辑正确、简单清晰。流程 图能够采纳打印或手工绘制。 4、使用protel等工具绘制实验系统电路图(也可手工绘制)。系统电路图应正确、 工整。系统电路中应包含单片机以及单片机工作时所必需的外围相关器件(晶 体、上电复位电路等); 5、程序清单:程序清单一律采纳打印的方式,源程序文件的格式要整齐、规范(语 句的标号、指令及注释应在不同列中)。在程序的关键语句上加注释。相关子程 序要在凝视中进行功能说明; 6、实验结果与分析:明确地写出最后结果(是否实现设计要求等),对实验中所遇 到的问题以及解决的方法加以描述; 7、实验体会、建议:通过实验所体会的收成。针对实验内容、教学方法、考核方法 等提出需要解决的问题,提出改进建议; 8、全部文字叙述内容要求简明扼要,思路清晰、用词规范; 9、要紧仪器设备:记录要紧仪器的名称、型号(包括实验运行软件名称)等 10、实验时刻:报告中应标明实验的日期(年、月、日;星期;组号)。 四、要求实验报告字迹工整,文字简练,数据齐全,图表规范,运算正确,分析充分、具体、定量。

Keil C51单片机实验指导2015.5.4

Keil C51实验项目 Keil C51实验项目 (1) 一、单片机的IO编程 (3) 实验1 IO开关量输入实验 (3) 实验2 IO输出驱动继电器(或光电隔离器)实验 (4) 实验3 IO输入/输出---半导体温度传感器DS18B20实验 (5) 二、单片机的中断系统 (6) 实验 1 外部中断----脉冲计数实验 (6) 实验 2 外部中断----故障报警实验 (7) 三、单片机的定时器/计数器 (8) 实验1 计数器实验 (8) 实验2 秒时钟发生器实验 (10) 四、单片机的串口特点和编程 (11) 实验1 PC机串口通讯实验 (11) 实验2 RS485通讯实验 (13) 五、存储器 (14) 实验1 RAM存储器读写实验 (14) 六、PWM发生器 (15) 实验1 PWM发生器(模拟)实验 (15) 实验2 蜂鸣器实验 (16) 七、WDG看门狗 (17) 实验1 外扩WDG(MAX705)实验 (17) 实验2 WDG(内部)实验 (18) 八、SPI总线 (19) 实验1 SPI(模拟)实验-----TLC2543 AD转换实验 (19) 实验2 SPI(模拟)实验-----TLV5616 DA转换实验 (20) 九、I2C总线 (21) 实验1 I2C(模拟)实验-----IC卡(AT24C01)读写实验 (21) 十、综合实验 (23) 实验1 HD7279LED数码管显示实验 (23) 实验2 HD7279键盘实验 (23) 实验3 电机转速实验 (24) 十一、步进电机实验 (26)

实验1 步进电机正反转实验 (26) 十二、TFT液晶显示实验 (26) 实验1 TFT液晶显示彩色条纹实验 (26) 十三、16X16LED点阵显示汉字实验 (27) 实验1 16X16LED点阵显示汉字实验 (27)

实验五 8051单片机定时中断实验

实验五8051单片机定时中断实验 一实验目的: 了解8051系列单片机的定时中断基本工作原理。掌握8051系列单片机定时中断的用法。 二实验原理: 在上一个实验里我们介绍了8051单片机的外中断应用,本实验要介绍的是定时器中断的应用。 8051系列单片机至少有两个16位的内部定时器/计数器,既可以编程为定时器使用,也可以作为计数器使用。如果是计数内部晶振驱动时钟,它是定时器,如果是计数8051的输入管脚的信号,就是计数器。 MCS-51单片机内部的定时/计数器的结构如图5-1所示,定时器T0特性功能寄存器TL0(低8位)和TH0(高8位)构成,定时器T1由特性功能寄存器TL1(低8位)和TH1(高8位)构成。特殊功能寄存器TMOD控制定时寄存器的工作方式,TCON则用于控制定时器T0和T1的启动和停止计数,同时管理定时器T0和T1的溢出标志等。程序开始时需对TL0、TH0、TL1和TH1进行初始化编程,以定义它们的工作方式和控制T0和T1的计数。 图5-1 TMOD特殊功能寄存器的格式参见下表(表5-1): 表5-1 高4位为定时器/计数器1的控制字,低4位为定时器/计数器0的控制字。其中GATE 为门控信号,C/T为定时器或计数器的选择,而M1,M0是工作方式选择位。 当M1M0=00时,T/C工作在方式0。方式0为13位的T/C,其计数器由TH的8位和TL的5

位构成,计数器的计数值范围是: 1—8192(213),但是启动前可以预置计数初值。当C/T为 0时,T/C为定时器,计数脉冲为振荡源12分频的信号;当C/T为1时,T/C为计数器,对输入端T0或T1输入的脉冲进行计数。计数脉冲加到计数器上与否决定于启动信号。当GATE=0时,TR=1时T/C便启动,当GATE=1时,启动受到TR与INT的双重控制,即二者同时为高 时才启动。当计数满时,TH向高位进位,这时中断溢出标志TF置1,即产生中断请求。而当CPU转向中断服务程序时,TF自动清零。 当M1M0=01时,T/C工作在方式1。方式1和方式0的区别仅在于方式0的计数器位数为13位,而方式1的为16位。 当M1M0=10时,T/C工作在方式2。区别于前面的两种工作方式的是,方式2具有自动重装载的功能。TH和TL作为两个8位的计数器,TH中的8位初值始终保持不变,由TL进行8位计数。在计数溢出时不但会产生中断请求,而且自动将TH中的值加载至TL 中,即自动重装载。 当M1M0=11时,T/C工作在方式3。但是这种工作方式只存在于T/C0中,这时TH0与TL0成为两个独立的计数器。只有在T/C1作为串行口的波特率发生器使用,而造成定时器不够用时,T/C0才能工作在方式3。 下面是定时器时间常数计算公式,这个公式在方式1,即16 位定时或计数模式可用。 THX=(65536-定时时长[μS]/(机器周期数/时钟频率[MHz])/256; TLX=(65536-定时时长[μS]/(机器周期数/时钟频率[MHz])%256; 在定时器重装载过程中因为TL1=0可以不写。 三实验内容: 利用中断方式在LED上输出10HZ方波,系统晶体频率11.059MHz。 四实验电路图:

C51单片机实验指导书

单片机原理与接口技术实验讲义 目录 第一章开发环境安装使用说明 (3) 第二章基于51单片机系统资源实验 (12)

实验1 IO开关量输入实验 (12) 实验2 IO输出驱动继电器(或光电隔离器)实验 (13) 实验3 IO输入/输出---半导体温度传感器DS18B20实验 (14) 实验4 外部中断----脉冲计数实验 (15) 实验5 计数器实验 (16) 实验6 秒时钟发生器实验 (17) 实验7 PC机串口通讯实验 (18) 实验8 RS485通讯实验 (19) 实验9 PWM发生器(模拟)实验 (20) 实验10 蜂鸣器实验 (21) 第一章开发环境安装使用说明 一、KeilC51集成开发环境的安装 1.Keil u Vision2的安装步骤如下

将安装文件拷贝到电脑根目录下,然后双击图标,如图1-1所示:注意:去掉属性里的只读选项。 图1-1 启动安装环境对话框 2.选择Eval Version。然后一直next直至安装完成,如图1-2所示: 二.在Keil uVision2中新建一个工程以及工程配置 1.打开Keil C环境,如图1-3所示。

图1-3打开工程对话框 2.新建工程或打开工程文件:在主菜单上选“Project”项,在下拉列表中选择“New Project”新建工程,浏览保存工程文件为扩展名为“.Uv2”的文件。或在下拉列表中选择“Open project”打开已有的工程文件。如 图1-4所示: 图1-4 新建工程 3.环境设置:新建工程文件后,在工具栏中选择如下图选项设置调试参数及运行环境,或从主菜单“Project”项中 选择“Options for Target ‘Target1’”,打开如下图1-5设置窗口。

实验五--单片机中断优先级实验

实验五单片机中断优先级实验 一、实验目的 1.理解AT89C51单片机中断优先级和优先权。 2.用PROTEUS设计、仿真基于AT89C51单片机的中断优先级实验。 3.掌握中断编程。 4.掌握发光二极管的控制方法。 二、实验要求 单片机主程序控制P0口数码管循环显示0~8;外中断(INT0)、外中断(INT1)发生时分别在P2、P1口依次显示0~8;INT1为高优先级,INT0为低优先级。 三、电路设计 ④CAP、CAP-ELEC:电容、电解电容; ⑤CRYSTAL:晶振; ⑥BUTTON:按钮。

2.放置元器件 3.放置电源和地 4.连线 5.元器件属性设置 6.电气检测 四、源程序设计、生成目标代码文件 1.流程图 2.源程序设计 通过菜单“sourc e→Add/Remove Source Files…”新建源程序文件:DZC35.ASM。 通过菜单“sourc e→DZC35.ASM”,打开PROTEUS提供的文本编辑器SRCEDIT,在其中编辑源程序。 程序编辑好后,单击按钮存入文件DZC35.ASM。 3.源程序编译汇编、生成目标代码文件 通过菜单“sourc e→Build All”编译汇编源程序,生成目标代码文件。若编译失败,可对程序进行修改调试直至汇编成功。 五、PROTEUS仿真 1.加载目标代码文件 2.全速仿真 单击按钮,启动仿真。 (1)低优先级INT0中断主程序:当主程序运行时,单片机控制与P0

口相接的数码管循环显示1~8;而P1、P2口的数码管不显示。当前主程序控制P0口显示“8”的时刻单击“低优先级输入”按钮,触发INT0如图所示,INT0服务程序控制P2口依次显示1~8,当前显示“2”。 (2)高优先级INT1中断低优先级INT0;在上一步的基础上,即主程序被INT0中断在P0口输出“8”,而在INT0服务程序在P2口输出“2”的时刻,单击“高优先级输入”按钮,触发高优先级INT1,所在INT0被中断在显示“2”,INT1服务程序控制P1口依次显示1~8。 3.仿真调试 六、思考题: 1.说明单片机中共有哪几种中断,它们的默认优先级是什么? 2.怎样修改中断优先级?例如在本实验中要使TIMER1成为优先级最高的中断,该怎么处理?

相关文档
最新文档