培训体系单片机编程培训_第1页
培训体系单片机编程培训_第2页
培训体系单片机编程培训_第3页
免费预览已结束,剩余7页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、单片机编程培训(可用 C 语言 / 汇编语言) 要求:每周做壹个实验(共六周) ,做完后要写好实验总结(侧重于 对实验内容的认识和心得) 且提交。实验有用编程软件 (如 KEIL)做, 然后用仿真软件(如 proteus )或单片机(如情况允许)调试仿真; 实验要自己独立完成,可参考壹些例程。1 I/0 口控制: P1 口接八个独立按键, P3 口接八个 LED 灯。当 P1 口有按键按下时, P3 口对应的灯亮。2 流水灯:循环控制八个 LED 灯。3 数码管动态扫描:八个数码管,每位显示不同的数字。4 独立按键和数码管显示:对若干个独立按键赋予不同的 数值,当键盘按下时,数码管显示数字。5

2、 矩阵键盘:掌握行列扫描方法,和去抖方法;6 定时器 / 中断:主程序:自己设计(如点亮 LED1 灯);定时器 0 中断程序: 自己设计 (如主程序的 LED1 灯熄 灭,点亮另外壹盏 LED2 灯。);要求中断过后( LED2 灯灭),主程序正常执行( LED1 灯亮);02. 点亮 P1 口的壹个灯03.IO 口信号输入while(1)P1=P3;04.IO 读写操作程序按下 P3 口的按键, P1 显示相应的位置 #include<reg52.h> sbitKEY=P30;/ 定义按键的接口 sbitLED=P10;/ 定义灯的接口voidmain(void)P1=0xFF

3、;/ 所有的灯灭 while(1)LED=KEY;/ 灯的状态由按键的状态决定05. 流水灯#include<reg52.h> voiddelay(unsignedintcnt)while(-cnt);main()P1=0xfe;/ 给初始化值换算成二进制是 11111110 while(1)delay(3000);/ 延时程序P1<<=1;/ 左移壹位该语句等效于 P1=P1<<1P1|=0x01;/ 最后壹位补 1 ,该语句等效于 P1=P1|0x01 符号"|" 表示"或" if(P1=0x7f)/ 检测是否移到

4、最左端? "=" 表示检测符号 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<reg5

5、2.h>,即位码Unsignedcharconstdofly=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6 f;/ 显示段码值 01234567unsignedcharcodeseg=0,1,2,3,4,5,6,7;/ 分别对应相应的数码管点亮 voiddelay(unsignedintcnt)while(-cnt);main()unsignedchari;while(1)P0=doflyi;/ 取显示数据,段码P2=segi;/ 取位码delay(200);/ 扫描间隙延时,时间太长会闪烁,太短会造成重影 i+;if(8=i)/ 检测

6、 8 位扫描完全?i=0;11. 独立按键 内容:切换到独立按键模式,通过按键于数码管显示对应的数字 #include<reg52.h>sbitkey1=P30;/ 定义按键位置sbitkey2=P31;sbitkey3=P32;sbitkey4=P33;voiddelay(unsignedintcnt)while(-cnt);main()P2=0x00;while(1)if(!key1)/ 按下相应的按键,数码管显示相应的码值P0=0x06;/ 数码管显示 "1"if(!key2)P0=0x5B;/2if(!key3)P0=0x4F;/3if(!key4)P0

7、=0x66;/4/ 如果有干扰请加去抖程序/ 红外接收头部分用黑色物质遮光,防止干扰按键,因为红外接收和按键使用同壹个端口15. 去抖独立按键#include<reg52.h>sbitkey1=P30;/ 定义按键位置 sbitkey2=P31;sbitkey3=P32;sbitkey4=P33;voiddelay(unsignedintcnt)while(-cnt);main()P2=0x00;while(1)if(!key1)/ 按下相应的按键,数码管显示相应的码值delay(1000);if(!key1)P0=0x06;/ 数码管显示 "1"if(!key

8、2)/ 按下相应的按键,数码管显示相应的码值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"矩阵键盘/ 行列扫描程序,

9、能够自己定义端口和扫描方式,这里做简单介绍#include<reg52.h>/ 包含头文件#defineucharunsignedchar#defineuintunsignedintunsignedcharconstdofly=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6 f,0x77,0x7c,0x39,0x5e,0x79,0x71;/0-Fucharkeyscan(void);voiddelay(uinti);voidmain()ucharkey;P2=0x00;/1 数码管亮按相应的按键,会显示按键上的字符while(1)k

10、ey=keyscan();/ 调用键盘扫描,switch(key)case0x7e:P0=dofly0;break;/0 按下相应的键显示相对应的码值case0x7d:P0=dofly1;break;/1case0x7b:P0=dofly2;break;/2case0x77:P0=dofly3;break;/3case0xbe:P0=dofly4;break;/4case0xbd:P0=dofly5;break;/5case0xbb:P0=dofly6;break;/6case0xb7:P0=dofly7;break;/7case0xde:P0=dofly8;break;/8case0xdd:

11、P0=dofly9;break;/9case0xdb:P0=dofly10;break;/acase0xd7:P0=dofly11;break;/bcase0xee:P0=dofly12;break;/ccase0xed:P0=dofly13;break;/dcase0xeb:P0=dofly14;break;/ecase0xe7:P0=dofly15;break;/fucharkeyscan(void)/ 键盘扫描函数,使用行列反转扫描法ucharcord_h,cord_l;/ 行列值P3=0x0f;/ 行线输出全为 0cord_h=P3&0x0f;/ 读入列线值if(cord_h!

12、=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<reg52.h>sbitLED=P12;voidIn

13、it_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)interrupt1using1TH0=0x00;/*Initvalue*/TL0=0x00;LED=LED;/ 指示灯反相17. 定时器 1 *ThissampleisusedforTimer116bittimermode.#include<reg52.h&g

14、t; sbitLED=P12;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)interrupt3using1TH1=0x00;/*Initvalue*/TL1=0x00; LED=LED;20.外部中断 0 电平触发内容:通过中断接口 P3.2 连接的独立按键测试,按壹次 P1 口的 LED 灯反向, 这里使用电平触发,所以壹直按键不松开和壹次按键效果不相同,按下会见到灯全部亮,说 明中断壹直于作用#include<reg52.h>main()P1=0x55;/P1 口初始值EA=1;/ 全局中断开 EX0=1;/ 外部中断 0 开IT0=0;/ 电平触发while(1)/ 于此添加其他程序外部中断程序voidISR_Key(void)interrupt0using1P1=P1;23. 外部中断 0 边沿触发内容:通过中断接口 P3.2 连接的独立按键测试,按壹次 P1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论