当前位置:文档之家› 单片机编程培训

单片机编程培训

单片机编程培训
单片机编程培训

单片机编程培训

(可用C语言/汇编语言)

要求:每周做一个实验(共六周),做完后要写好实验总结(侧重于对实验内容的认识与心得)并提交。实验有用编程软件(如KEIL)做,然后用仿真软件(如proteus)或单片机(如情况允许)调试仿真;实验要自己独立完成,可参考一些例程。

1.I/0口控制:P1口接八个独立按键,P3口接八个LED灯。

当P1口有按键按下时,P3口对应的灯亮。

2.流水灯:循环控制八个LED灯。

3.数码管动态扫描:八个数码管,每位显示不同的数字。4.独立按键与数码管显示:对若干个独立按键赋予不同的数值,当键盘按下时,数码管显示数字。

5.矩阵键盘:掌握行列扫描方法,和去抖方法;

6.定时器/中断:

主程序:自己设计(如点亮LED1灯);

定时器0中断程序:自己设计(如主程序的LED1灯熄灭,点亮另外一盏LED2灯。);

要求中断过后(LED2灯灭),主程序正常执行(LED1灯亮);

02.点亮P1口的一个灯

03.IO口信号输入

while(1)

{

P1=P3;

}

04.IO读写操作程序

按下P3口的按键,P1显示相应的位置#include

sbitKEY=P3^0;//定义按键的接口

sbitLED=P1^0;//定义灯的接口

voidmain(void)

{

P1=0xFF;//所有的灯灭

while(1)

{

LED=KEY;//灯的状态由按键的状态决定

}

}

05.流水灯

#include

voiddelay(unsignedintcnt)

{

while(--cnt);

}

main()

{

P1=0xfe;//给初始化值换算成二进制是11111110

while(1)

{

delay(3000);//延时程序

P1<<=1;//左移一位该语句等效于P1=P1<<1

P1|=0x01;//最后一位补1,该语句等效于P1=P1|0x01符号"|"表示"或"

if(P1==0x7f)//检测是否移到最左端?"=="表示检测符号2端的值是否相等{

delay(30000);

P1=0xfe;//重新赋值

}

}

}

06.

//按下P3口的按键,P1显示相应的位置,IO读写操作程序

sfrP1=0x90;/*SFRdefinitionforPort1*/

sfrP3=0xB0;/*SFRdefinitionforPort3*/

voidmain(void)

{

unsignedcharpval;

P1=0xFF;

while(1)

{

pval=P3;/*ReadP1intopval*/

P1=pval;/*WritepvaltoP3*/

}

}

08.数码管动态扫描

#include

Unsignedcharconstdofly[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x 6f};//显示段码值01234567

unsignedcharcodeseg[]={0,1,2,3,4,5,6,7};//分别对应相应的数码管点亮,即位码voiddelay(unsignedintcnt)

{

while(--cnt);

}

main()

{

unsignedchari;

while(1)

{

P0=dofly[i];//取显示数据,段码

P2=seg[i];//取位码

delay(200);//扫描间隙延时,时间太长会闪烁,太短会造成重影

i++;

if(8==i)//检测8位扫描完全?

i=0;

}

}

11.独立按键

内容:切换到独立按键模式,通过按键在数码管显示对应的数字#include

sbitkey1=P3^0;//定义按键位置

sbitkey2=P3^1;

sbitkey3=P3^2;

sbitkey4=P3^3;

voiddelay(unsignedintcnt)

{

while(--cnt);

}

main()

{

P2=0x00;

while(1)

{

if(!key1)//按下相应的按键,数码管显示相应的码值P0=0x06;//数码管显示"1"

if(!key2)

P0=0x5B;//2

if(!key3)

P0=0x4F;//3

if(!key4)

P0=0x66;//4

}

}

//如果有干扰请加去抖程序

//红外接收头部分用黑色物质遮光,防止干扰按键,因为红外接收和按键使用同一个端口15.去抖

独立按键

#includesbitkey1=P3^0;//定义按键位置

sbitkey2=P3^1;

sbitkey3=P3^2;

sbitkey4=P3^3;

voiddelay(unsignedintcnt)

{

while(--cnt);

}

main()

{

P2=0x00;

while(1)

{

if(!key1)

{//按下相应的按键,数码管显示相应的码值

delay(1000);

if(!key1)

{

P0=0x06;//数码管显示"1"

}

}

if(!key2)

{//按下相应的按键,数码管显示相应的码值

delay(1000);//去抖动

if(!key2)//检测按键确实按下,进行按键处理

{

P0=0x5B;//数码管显示"2"

//这里可以添加按键按下所需要的操作,如数据加减乘除,蜂鸣器等设备开关}

}

if(!key3)

{//按下相应的按键,数码管显示相应的码值

delay(1000);

if(!key3)

{

P0=0x4F;//数码管显示"3"

}

}

if(!key4)

{//按下相应的按键,数码管显示相应的码值

delay(1000);

if(!key4)

{

P0=0x66;//数码管显示"4"

}

}

}

}

矩阵键盘

//行列扫描程序,可以自己定义端口和扫描方式,这里做简单介绍

#include//包含头文件

#defineucharunsignedchar

#defineuintunsignedint

unsignedcharconstdofly[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x 6f,

0x77,0x7c,0x39,0x5e,0x79,0x71};//0-F

ucharkeyscan(void);

voiddelay(uinti);

voidmain()

{

ucharkey;

P2=0x00;//1数码管亮按相应的按键,会显示按键上的字符

while(1)

{

key=keyscan();//调用键盘扫描,

switch(key)

{

case0x7e:P0=dofly[0];break;//0按下相应的键显示相对应的码值

case0x7d:P0=dofly[1];break;//1

case0x7b:P0=dofly[2];break;//2

case0x77:P0=dofly[3];break;//3

case0xbe:P0=dofly[4];break;//4

case0xbd:P0=dofly[5];break;//5

case0xbb:P0=dofly[6];break;//6

case0xb7:P0=dofly[7];break;//7

case0xde:P0=dofly[8];break;//8

case0xdd:P0=dofly[9];break;//9

case0xdb:P0=dofly[10];break;//a

case0xd7:P0=dofly[11];break;//b

case0xee:P0=dofly[12];break;//c

case0xed:P0=dofly[13];break;//d

case0xeb:P0=dofly[14];break;//e

case0xe7:P0=dofly[15];break;//f

}

}

}

ucharkeyscan(void)//键盘扫描函数,使用行列反转扫描法{

ucharcord_h,cord_l;//行列值

P3=0x0f;//行线输出全为0

cord_h=P3&0x0f;//读入列线值

if(cord_h!=0x0f)//先检测有无按键按下

{

delay(100);//去抖

if(cord_h!=0x0f)

{

cord_h=P3&0x0f;//读入列线值

P3=cord_h|0xf0;//输出当前列线值

cord_l=P3&0xf0;//读入行线值

return(cord_h+cord_l);//键盘最后组合码值

}

}return(0xff);//返回该值

}

voiddelay(uinti)//延时函数

{

while(i--);

}

16.定时器0

*ThissampleisusedforTimer016bittimermode. #include

sbitLED=P1^2;

voidInit_Timer0(void)

{

TMOD|=0x01;

TH0=0x00; /*Initvalue*/

TL0=0x00;

EA=1;/*interuptenable*/

ET0=1;/*enabletimer0interrupt*/

TR0=1;

}

main()

{

Init_Timer0();

while(1);

}

voidTimer0_isr(void)interrupt1using1

{

TH0=0x00; /*Initvalue*/

TL0=0x00;

LED=~LED;//指示灯反相

}

17.定时器1

*ThissampleisusedforTimer116bittimermode. #include

sbitLED=P1^2;

voidInit_Timer1(void)

{

TMOD|=0x10;

TH1=0x00; /*Initvalue*/

TL1=0x00;

EA=1;/*interuptenable*/

ET1=1;/*enabletimer1interrupt*/

TR1=1;

}

main()

{

Init_Timer1();

while(1);

}

voidTimer1_isr(void)interrupt3using1

{

TH1=0x00; /*Initvalue*/

TL1=0x00;

LED=~LED;

}

20.

外部中断0电平触发

内容:通过中断接口P3.2连接的独立按键测试,按一次P1口的LED灯反向,

这里使用电平触发,所以一直按键不松开和一次按键效果不相同,按下会看到灯全部亮,说明中断一直在作用

#include

main()

{

P1=0x55;//P1口初始值

EA=1;//全局中断开

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

IT0=0;//电平触发

while(1)

{

//在此添加其他程序

}

}

外部中断程序

voidISR_Key(void)interrupt0using1

{

P1=~P1;

}

23.外部中断0边沿触发

内容:通过中断接口P3.2连接的独立按键测试,按一次P1口的LED灯反向,这里使用边沿触发,所以一直按键不松开和一次按键效果相同,区别于电平触发#include

main()

{

P1=0x55;//P1口初始值

EA=1;//全局中断开

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

IT0=1;//边沿触发

while(1)

{

//在此添加其他程序

}

}

外部中断程序

voidISR_Key(void)interrupt0using1

{

P1=~P1;//s3按下触发一次,P1取反一次,这里需要切换跳帽到独立按键模式}

实验一 单片机数据区传送程序设计

实验一单片机数据区传送程序设计 一、实验目的 1.进一步掌握汇编语言程序设计和调试方法。 2.了解单片机RAM中的数据操作 二、实验说明 要求:编写程序把R2、R3源RAM区首地址内的R6、R7字节数据传送到R4、R5目的地址的RAM区。 三、实验仪器 计算机 伟福软件(lab2000P ) 四、实验内容 在R0、R1中输入源地址(例如:3000H),R2、R3中输入目的地址(例如4000H),R6、R7中输入字节数(例如:1FFFH)。 查看RAM 区3000~30FFH和4000~40FFH内容,也可自己重新赋值。 运行程序,首先单步,然后用执行到指定位置,最后用连续运行方式。 记录下运行结果,检查3000~30FFH中内容是否和4000~40FFH内容完全一致。 五、思考题 1、改变源地址,例如00FFH; 2、改变目的地址,例如2000H; 3、改变传输的个数,小于256个和大于256个的情况。 4、把程序改为对某一数据存储区RAM赋都相同一个数值。 六、源程序及其修改原理 org 0000H Block equ 2000h mov dptr, #Block ; 起始地址 mov r0,#12h mov a,#20h ;修改2000h开始的地址所存放的内容为20h Loop: mov r1,#14h ;增加r1计数,用循环方式实现大于256的数据传输(思 考题3) Loop1: movx @dptr,a inc dptr ; 指向下一个地址 djnz r1,Loop1 djnz r0, Loop ; 双循环实现r0,r1计数相乘 (以上程序实现对某一数据存储区2000h~2168hRAM赋都相同一个数值20h,思考题4) mov r0, #20h ;改变源地址为2000h(思考题1) mov r1, #00h mov r2, #50h;改变目的地址为5000h(思考题2) mov r3, #00h

单片机C语言程序方案实训例——+Proteus仿真(前题)

单片机C语言程序设计实训100例 ——基于8051+Proteus仿真01 闪烁的LED /*名称:闪烁的LED 说明:LED按设定的时间间隔闪烁*/ #include #define uchar unsigned char #define uint unsigned int sbit LED=P10。 //延时 void DelayMS(uint x> { uchar i。 while(x--> { for(i=0。i<120。i++>。 } } //主程序 void main(> { while(1> { LED=~LED。 DelayMS(150>。 } } 02从左到右的流水灯 /*名称:从左到右的流水灯 说明:接在P0口的8个LED 从左到右循环依次点亮,产生走 马灯效果*/ #include #include #define uchar unsigned char #define uint unsigned int //延时 void DelayMS(uint x> { uchar i。 while(x--> {

for(i=0。i<120。i++>。 } } //主程序 void main(> { P0=0xfe。 while(1> { P0=_crol_(P0,1>。 //P0的值向左循环移动 DelayMS(150>。 } } 038只LED左右来回点亮 /*名称:8只LED左右来回点亮 说明:程序利用循环移位函数_crol_和_cror_形成来回滚动的效果*/ #include #include #define uchar unsigned char #define uint unsigned int //延时 void DelayMS(uint x> { uchar i。 while(x--> { for(i=0。i<120。i++>。 } } //主程序 void main(> { uchar i。 P2=0x01。 while(1> { for(i=0。i<7。i++> { P2=_crol_(P2,1>。 //P2的值向左循环移动 DelayMS(150>。 } for(i=0。i<7。i++> { P2=_cror_(P2,1>。 //P2的值向右循环移动

单片机C语言程序设计实训100例--基于8051+PROTEUS仿真

《单片机C语言程序设计实训100例—基于8051+Proteus仿真》案例 第01 篇基础程序设计 01 闪烁的LED /* 名称:闪烁的LED 说明:LED按设定的时间间隔闪烁 */ #include<> #define uchar unsigned char #define uint unsigned int sbit LED=P1^0; .\r\n"); Puts_to_SerialPort("-------------------------------\r\n"); DelayMS(50); while(1) { Putc_to_SerialPort(c+'A'); DelayMS(100); Putc_to_SerialPort(' '); DelayMS(100); if(c==25) With PCB layout now offering automation of both component ", "can often be the most time consuming element of the exercise.", "And if you use circuit simulation to develop your ideas, ", "you are going to spend even more time working on the schematic." }; //显示缓冲(2行) uchar Disp_Buffer[32]; //垂直滚动显示 void V_Scroll_Display() { uchar i,j,k=0; uchar *p=Msg[0]; uchar *q=Msg[Line_Count]+strlen(Msg[Line_Count]); //以下仅使用显示缓冲的前16字节空间 while(p

单片机实验程序设计

实验一LED流水灯 一、实验目的 制作一个流水灯,编写程序来控制发光二极管由上至下的反复循环流水点亮,每次点亮一个发光二极管。 二、程序设计 #include #include sbit LED = P1^0; void delay() { unsigned int i,j; for(i=120;i>0;i++) for(j=120;j>0;j++); } void main() { unsigned char i; LED = 0; while(1) { for(i=0;i<8;i++) { LED=0xfe; delay( ); LED = _crol_(LED,1); P1 = LED; } LED=0X01; for(i=0;i<8;i++) { delay( ); LED = _cror_(LED,1); P1 = LED; } } }

实验二按键扫描 一、实验目的 使用单片机片内的I/O口来进行开关状态的检测。当开关打开时,I/O引脚为高电平,当开关闭合时,I/O引脚为低电平。编写一个程序,控制流水灯,开关闭合,对应的发光二极管点亮。 二、程序设计 #include #include #define GPIO_LED P1 sbit K1=P3^5; sbit K2=P3^4; void Delay10ms( ); void main(void) { unsigned int i,j,l; j=0xfe; while(1) { GPIO_LED=j; if (K1==0) { Delay10ms( ); if (K1==0) { j=_cror_(j,1); while((i<50)&&(K1==0)) { Delay10ms( ); i++; } i=0; } } if (K2==0) { Delay10ms( ); if (K2==0) { l=0xff; GPIO_LED=~l;

AVR单片机C语言程序设计实验指导书

实验一发光二极管的移动控制 一、实验目的 1.熟悉并行接口的设置与应用; 2.进一步熟悉编译软件和下载软件的使用; 3.熟悉C语言中移位、延时、数组等指令的应用; 4.增强学习单片机的兴趣。 二、实验内容 1.参考课本P128“发光二极管的移动控制”实验程序,实现发光二极管循环点亮的按键控 制。 ) 2.设计一个完整程序(另建一个文档),实现8个led灯的自动顺序(加法)点亮和逆序 (减法)点亮。见参考程序,并在程序中添加必要的解释文字。 三、实验步骤 1.以班级和姓名为文件夹名称在D盘根目录下新建一个子目录文件夹,用来保存每次实验的项目和程序。(注意:每次实验的位置固定,即下次实验的计算机还是上次的计算机。) 2.再在这个子目录下以实验题目为名新建一个文件夹。打开ICCAVR开发编程软件,新建一个工程文件项目,参照程序清单或根据实验要求自己重新修改设置并输入程序。 3.保存程序,并将程序源文件添加到项目里。见下图1。 图1 ( 4.设置项目属性,选择目标芯片等,见下图2,3。

图2 图3 5.编译程序。将所输入的程序进行编译(菜单Project→ Make命令),或者在工具栏单击 按钮),若编译时下方出现错误提示,说明程序有语法错误,此时必须根据编译器所列 出的错误消息,逐条查改,重新编译,直到错误消除并生成*.hex文件。 6.功能仿真。利用proteus或AVR studio的仿真功能对程序进行功能性仿真,验证程序功能是否正确。 7.打开下载软件(progisp或AVR Studio里的JTAG ICE),将刚刚生成的相应*.hex文件写入单片机(在此之前,须将单片机实验板按要求与PC机连接正确,并接通电源)。 8.验证硬件实现的结果是否与功能要求一致。 四、参考程序(实现8个led灯的自动顺序(加法)和逆序(减法)点亮的部分程序) > /*********************** 系统外接8M晶振 ************************/ unsigned char i; while (1) { for (i = 0; i < 8; i ++) { PORTB = ~(1 << i); delay_ms(200); 。 } for (i = 8; i > 0; i --) { PORTB = ~(1 << i-1); delay_ms(200); } }

51单片机C语言程序设计Proteus仿真实训 2

基于8051+Proteus仿真案例 第01 篇基础程序设计01 闪烁的LED /* 名称:闪烁的LED 说明:LED按设定的时间间隔闪烁 */ #include #define uchar unsigned char #define uint unsigned int sbit LED=P1^0; //延时 void DelayMS(uint x) { uchar i; while(x--) { for(i=0;i<120;i++); } } //主程序 void main() { while(1) { LED=~LED; DelayMS(150); } } 02 从左到右的流水灯 /* 名称:从左到右的流水灯 说明:接在P0口的8个LED 从左到右循环依次点亮,产生走 马灯效果 */ #include #include #define uchar unsigned char #define uint unsigned int

//延时 void DelayMS(uint x) { uchar i; while(x--) { for(i=0;i<120;i++); } } //主程序 void main() { P0=0xfe; while(1) { P0=_crol_(P0,1); //P0的值向左循环移动 DelayMS(150); } } 03 8只LED左右来回点亮 /* 名称:8只LED左右来回点亮 说明:程序利用循环移位函数_crol_和_cror_形成来回滚动的效果*/ #include #include #define uchar unsigned char #define uint unsigned int //延时 void DelayMS(uint x) { uchar i; while(x--) { for(i=0;i<120;i++); } } //主程序 void main() { uchar i; P2=0x01; while(1) {

(完整版)单片机C语言程序设计实训100例—基于8051+Proteus仿真毕业论文

《基于8051+Proteus仿真》案例 第01 篇基础程序设计 01 闪烁的LED * 名称:闪烁的LED 说明:LED按设定的时间间隔闪烁 * #include

P0=0xfe; while(1) { P0=_crol_(P0,1); P0的值向左循环移动 DelayMS(150); } } 03 8只LED左右来回点亮 * 名称:8只LED左右来回点亮 说明:程序利用循环移位函数_crol_和_cror_形成来回滚动的效果* #include

DelayMS(150); } } } 04 花样流水灯 * 名称:花样流水灯 说明:16只LED分两组按预设的多种花样变换显示 * #include

单片机实验c语言编程

流水灯 效果:发关二级管依次独个被点亮,一直循环下去。 C语言程序如下: #include unsigned char i; unsigned char temp; void delay(void) //延时子程序 { unsigned char m,n,s; for(m=20;m>0;m--) for(n=20;n>0;n--) for(s=248;s>0;s--); } void main(void) //主程序 { while(1) //循环条件永远为真,以下程序一直执行下去。{ temp=0xfe; P3=temp; //直接对I/O 口P3 赋值,使.P3.0 输出低点平。delay(); //延时 for(i=1;i<8;i++) //实现灯的移动 { temp=(temp<<1)|0x01; //P3 口I/O 轮流低电平

P3=temp; delay(); //延时,肉眼可以看到 } } } 闪烁灯 效果:发光二极管维持一闪一闪的状态。 C语言程序如下: #include /******************************************************************** ********** 第一行是一个"文件包含"处理。 所谓"文件包含"是指一个文件将另外一个文件的内容全部包含进来,所以这里的程序虽然只有4 行,但C 编译器在处理的时候却要处理几十或几百行。这里程序中包含REG51.h文件的目的是为了要使用P1 这符号即通知C 编译器,程序中所写的P1 是指80C51 单片机的P1 端口而不是其它变量。 ********************************************************************* *********/ void delay02s(void) //延时0.2 秒子程序 { unsigned char i,j,k; //定义3 个无符号字符型数据。 for(i=20;i>0;i--) //作循环延时

单片机程序设计实训汇总

单片机程序设计实训 (一)数据块传送 1.实验目的 (1)了解和熟悉仿真器功能及使用方法, (2)掌握程序汇编方法及汇编后的代码及存储地址 (3)掌握8031内部RAM和传送操作,从而了解MCS-51存贮空间分配 (4)掌握数据块的移动编程方法 2.实验内容 (1)将8031内部RAM前20-7F字节清0 (2)将40H~4FH单元分别置初值0A0~0AFH (3)将40H~4FH单元传到片内RAM50H~5FH单元 3.实验步骤 数据块的移动编辑要求 (1)阅读仿真器使用说明, (2)编辑及编译程序如下: a.将8031内部RAM前20-7F字节清0 b.将40H~4FH单元分别置初值0A0~0AFH c.将40H~4FH单元传到片内RAM50H~5FH单元 (3)分别用单步、断点和全速之行程序,检查片内RAM40~4FH单元,50~5FH单元内容是否为A0~AFH 4.实验仪器和设备 AEDK5196ET单片机实验箱一台,PC机一台,LCA51ET单片机开发环境。 5.程序流程图

6.参考程序 a:将8031内部RAM前20-7F字节清0 ORG0000H LJM MAIN ORG0100H MAIN:MOV R0, MOV A,#0 MOV R2, LOOP:MOV@R0,A INC R0 DJNZ,LOOP END b:将40H~4FH单元分别置初值0A0~0AFH ORG0000H LJM MAIN ORG0100H MAIN:MOV R0, MOV A,#0 LOOP:MOV@R0,#0A0H INC R0 CJNE R0,,LOOP END c:将40H~4FH单元传到片内RAM50H~5FH单元 ORG0000H MOV R0,#50H MOV R1,#40H MOV R2,16H LOOP:MOV A,@R1 MOV@R0,A INC R1 INC R0 DJNZ R2,LOOP 7.思考题 (1)说说数据块移动程序在实际中的作用。 (2)若需要移动的数据块大于0FFH时,应如何编程,写出编程方法和原程序清单。 (3)写出程序a、b完整程序和详尽流程图,独立编写程序c。

单片机实训报告---S-51单片机开发板设计

S-51单片机开发板设计---------《单片机及应用设计》实训报告 姓名: 学号: 班级:08级电子信息工程专业本科班 学院:计算机电子信息工程学院 时间:2010年11月15日——12月3日 指导教师:

目录 一.前言 (2) 二.单片机及各模块简介 (2) 1.总体设计方案 (2) 2.硬件模块简介 (3) 2.1 S51单片机主控制模块 (3) 2.2 键盘模块 (4) 2.3 DS1302时钟模块 (4) 2.4 串口通信模块 (5) 2.5 LED数码管显示和流水灯模块 (5) 2.6下载线模块 (6) 2.7 蜂鸣器模块 (6) 2.8 其他模块 (7) 三.开发板(串口通信模块)设计原理介绍 (7) 1.实验项目要求 (7) 1.1元器件功能介绍 (7) 1.2串口通信原理 (8) 2.原理图的绘制 (10) 2.1串口通信模块仿真电路设计 (10) 3.程序的编写 (11) 3.1 keil操作过程 (11) 3.2程序框图 (12) 3.3USB模块电路原理图的绘制 (12) 四.印刷板的焊接及流程 (14) 焊接流程 (14) 五.调试及遭遇的问题解决方法 (14) 1.调试 (14) 1.1程序下载 (14) 1.2开发板调试 (15) 2.问题解决 (15) 六.总结体会 (15) 附录: (16) 串口通信C语言源程序 (16)

一.前言 近年来随着科技的飞速发展,单片机的应用正在不断深入,同时带动传统控制检测技术日益更新。在实时检测和自动控制的单片机应用系统中,单片机往往作为一个核心部件来使用,仅单片机方面知识是不够的,还应根据具体硬件结构软硬件结合,加以完善。 本次实训的主要目的就是为了学习单片机的基本理论知识,进而进行单片机的开发、实践和扩展,以更好的运用到实际的软硬件开发中去。此次单片机的实训目的如下: (1)掌握单片机的相关理论知识。 学习单片机相关寄存器的配置,单片机内部结构及特点,存储器组织及外部接口,中断及串口功能,功能寄存器的相关配置,确定软硬件设计总体方案;(2)掌握硬件设计和软件设计的基本知识,学会使用基本的设计软件,依据总体的设计方案对单片机进行软硬件开发。 在Protel中对单片机的各个功能模块进行外部电路的设计,在实现各个模块的功能的前提下充分合理利用单片机的内部资源和外围接口,以求最大限度的发挥单片机的功能。 学会使用Keil C进行编辑、编译及仿真调试,实现对单片机进行C语言开发。 以Proteus为平台,对单片机外围各个功能模块进行软件仿真验证功能。(3)开发板板上资源的硬件实现及下载器的制作。 对软硬件设计仿真验证功能无误后,将Protel绘制的PCB进行加工、焊接元器件,制作出S51开发板及下载器。 二.单片机及各模块简介 1.总体设计方案 本开发板共分为十个模块,分别是:S51单片机主控制器模块、键盘模块、DS1302时钟模块、数码管模块、LCDCPS364BR模块、ARK点阵模块、下载器模块、流水灯模块、蜂鸣器模块、电源模块。其中以S51单片机作为核心控制器;键盘模块用来向单片机输入特定编码的信息;DS1302时钟模块用来实现实时时钟;数码管模块用来显示简单的数字、字母;LCD模块用来显示字母、数字、符号;点阵模块用来显示图像、符号、汉字;下载器模块用来实现S51单片机的

实验1、实验2熟悉软件开发环境及51单片机编程(学生版)

实验一、熟悉软件开发环境及51单片机资源认识 ——I/O口的应用与编程 计算机的应用是一个系统,这个系统应由两部分组成――硬件和软件。硬件是指具体的元器件、电路等,软件则是指程序和数据。如果説硬件是计算机应用系统的基础的话,那么软件则是计算机应用系统的灵魂。计算机原理告诉我们程序和数据是被“装载”在计算机存储器中的,从某种意义上讲,认识一个计算机的存储器系统是开发软件所必须的。 为了全面认识51系列单片机的存储空间,实验一与实验二列出四个实训单元。在进行完四个实训单元后,要求学生应全面了解51系列单片机的程序存储器(ROM)、片内随机存储器(片内RAM)和片外随机存储器(片外RAM)空间的范围、用途和使用方法等。 1.1认识51系列单片机的程序存储器(ROM) 第一部分教学要求 一、实验目的: 1.认识51系列单片机的程序存储器(ROM)的空间范围; 2.认识汇编指令编码在ROM中存储形式; 3.掌握指令编码和指令编码所在地址的概念; 4.了解51系列单片机的程序存储器(ROM)固定地址的用途。 二、实训平台 1.PC机,台/人; 2.伟福V 3.2版仿真软件或其它51系列单片机仿真软件 三、实验报告内容: (注:成绩评定等级:优、良、中、及格、不及格) 第二部分教学内容 一、预备知识 1.ROM存储器 ROM(Read Only Memory)即只读存储器之意,其特点是在计算机正常运行的情况下CPU对ROM存储器只能进行读操作且断电后信息不会丢失,通常用来存储固定不变的程序和数据,如引导程序、基本输入输出系统程序等。ROM按其性能可分为以下几类: (1)掩模工艺ROM 它是由芯片制造厂根据ROM要求存储的信息,制造成固定的半导体掩模版生产的。一旦制出成品后,其存储的信息只能读出,不能改变。这种ROM适用于存储固定不变的程序和数据,批量生产时,成本较低。 (2)可一次编程PROM 允许用户对ROM进行一次编程。 (3)可擦除的EPROM 允许用户对ROM进行多次编程,即可擦除。按擦除的方法不同,可分为紫外线擦除的可

单片机C语言程序设计实训例

《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例01 闪烁的LED LED 名称:闪烁的/* 按设定的时间间隔闪烁说明:LED*/ #include #define uchar unsigned char #define uint unsigned int sbit LED=P1^0; 延时//void DelayMS(uint x) { uchar i; while(x--) { for(i=0;i<120;i++); } } //主程序void main() { while(1) { LED=~LED; DelayMS(150); } }

02 从左到右的流水灯 名称:从左到右的流水灯/* LED个接在P0口的8 说明:产生走从左到右循环依次点亮,马灯效果*/ #include #include #define uchar unsigned char #define uint unsigned int 延时//void DelayMS(uint x) { uchar i; while(x--) { 1 上海师范大学信息与机电工程学院—倪继锋 《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例 for(i=0;i<120;i++); } } //主程序 void main() { P0=0xfe; while(1) { P0=_crol_(P0,1); //P0的值向左循环移动 DelayMS(150); } } 03 8只LED左右来回点亮 /* 名称:8只LED左右来回点亮 说明:程序利用循环移位函数_crol_和_cror_形成来回滚动的效果

单片机程序设计与综合实验报告

单片机程序设计与综合实验 目录 一、设计目的 (2) 二、硬件电路设计 (3) 1、主原理图 (3) 2、AT89C52引脚级共能说明 (3) 3、74LS138引脚图级功能说明 (4) 4、74HC573引脚图级功能说明 (4) 5、矩阵是键盘电路及功能说明 (5) 6、数码管功能说明 (5) 三、流程图 (7) 1、主流程图 (7) 2、判断所按键值流程图 (7) 3、动态显示子程序 (8) 4、判断有无键按下 (8) 四、程序设计 (8) 五、心得体会 (13)

单片机课程设计报告一、设计题目:简易计算器的设计 设计要求:(1)设计实现两位小于100的整数加、减运算; (2)键盘采用4*4的矩阵键盘,键盘安排如下; 1 2 3 4 5 6 7 8 9 0 + - = (3)输入数据及运算结果采用三位数码管进行显示; 设计目的:(1)掌握数码管一位动态扫描的编程方法; (2)掌握矩阵扫描的编程方法; (3)掌握简单数据运算的编程方法 二、硬件电路的设计 1、原理电路图:

图1 功能说明:(1)如图1,AT89C52单片机的P0.0 – P0.7 接74HC573的输入端,数码管的相同字段接在一起,并分别接在74HC573的输出端(PA0 -–PA7)。跳线CON3接Vcc,使74HC573处于透明状态(即不锁存),这样由单片机传送的数据即可通过573送到数码管,并显示。另外,573也可提高驱动能力。(2)74HC138的输入端A、B、C分别接单片机的P2.0 -- P2.2, 其输出~Y0 -- ~Y7接入数码管的选通信号,这样,通过对P2口不同的赋值,即可选择不同的数码管进行显示。 (3)键盘处的跳线CON3选通J1和J3,使用4*4的矩阵键盘。其中P3.0 – P3.3为行线,P3.4 – P3.7为列线。 2、各芯片引脚及功能: I、AT89C52

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