单片机编程培训

  • 格式:doc
  • 大小:34.50 KB
  • 文档页数:13

单片机编程培训(可用C语言/汇编语言)要求:每周做一个实验(共六周),做完后要写好实验总结(侧重于对实验内容的认识与心得)并提交。

实验有用编程软件(如KEIL)做,然后用仿真软件(如proteus)或单片机(如情形承诺)调试仿真;实验要自己独立完成,可参考一些例程。

流水灯:循环操纵八个LED灯。

数码管动态扫描:八个数码管,每位显示不同的数字。

独立按键与数码管显示:对若干个独立按键给予不同的数值,当键盘按下时,数码管显示数字。

矩阵键盘:把握行列扫描方法,和去抖方法;定时器/中断:主程序:自己设计(如点亮LED1灯);定时器0中断程序:自己设计(如主程序的LED1灯熄灭,点亮另外一盏LED2灯。

);要求中断过后(LED2灯灭),主程序正常执行(LED1灯亮);02.点亮P1口的一个灯03. IO口信号输入while (1){P1=P3;}04. IO读写操作程序按下P3口的按键,P1显示相应的位置#include<reg52.h>sbit KEY = P3^0;//定义按键的接口sbit LED = P1^0;//定义灯的接口void main (void){P1 = 0xFF; //所有的灯灭while (1){LED = KEY; //灯的状态由按键的状态决定}}05.流水灯#include<reg52.h>void delay(unsigned int cnt){while(--cnt);}main(){P1=0xfe; //给初始化值换算成二进制是1111 1110while(1){delay(3000);//延时程序P1<<=1; //左移一位该语句等效于P1=P1<<1P1|=0x01; //最后一位补1,该语句等效于P1=P1|0x01 符号"| "表示"或"if(P1==0x7f) //检测是否移到最左端?"=="表示检测符号2端的值是否相等{delay(30000);P1=0xfe; //重新赋值}}}06.//按下P3口的按键,P1显示相应的位置,IO读写操作程序sfr P1 = 0x90; /* SFR definition for Port 1 */sfr P3 = 0xB0; /* SFR definition for Port 3 */void main (void){unsigned char pval;P1 = 0xFF;while (1){pval = P3; /* Read P1 into pval */P1 = pval; /* Write pval to P3 */}}08.数码管动态扫描#include<reg52.h>Unsigned char const dofly[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x0 7,0x7f,0x6f};// 显示段码值01234567unsigned char code seg[]={0,1,2,3,4,5,6,7};//分不对应相应的数码管点亮,即位码void delay(unsigned int cnt){while(--cnt);}main(){unsigned char i;while(1){P0=dofly[i];//取显示数据,段码P2=seg[i]; //取位码delay(200); //扫描间隙延时,时刻太长会闪耀,太短会造成重影i++;if(8==i) //检测8位扫描完全?i=0;}}11.独立按键内容:切换到独立按键模式,通过按键在数码管显示对应的数字#include<reg52.h>sbit key1=P3^0; //定义按键位置sbit key2=P3^1;sbit key3=P3^2;sbit key4=P3^3;void delay(unsigned int cnt){while(--cnt);}main(){P2=0x00;while(1){if(!key1) //按下相应的按键,数码管显示相应的码值P0=0x06;//数码管显示"1"if(!key2)P0=0x5B;//2if(!key3)P0=0x4F;//3if(!key4)P0=0x66;//4}}//如果有干扰请加去抖程序//红外接收头部分用黑色物质遮光,防止干扰按键,因为红外接收和按键使用同一个端口15.去抖独立按键#include<reg52.h>sbit key1=P3^0; //定义按键位置sbit key2=P3^1;sbit key3=P3^2;sbit key4=P3^3;void delay(unsigned int cnt){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 <reg52.h>//包含头文件#define uchar unsigned char#define uint unsigned intunsigned char const dofly[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x0 7,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//0-Fuchar keyscan(void);void delay(uint i);void main(){uchar key;P2=0x00;//1数码管亮按相应的按键,会显示按键上的字符while(1){key=keyscan();//调用键盘扫描,switch(key){case 0x7e:P0=dofly[0];break;//0 按下相应的键显示相对应的码值case 0x7d:P0=dofly[1];break;//1case 0x7b:P0=dofly[2];break;//2case 0x77:P0=dofly[3];break;//3case 0xbe:P0=dofly[4];break;//4case 0xbd:P0=dofly[5];break;//5case 0xbb:P0=dofly[6];break;//6case 0xb7:P0=dofly[7];break;//7case 0xde:P0=dofly[8];break;//8case 0xdd:P0=dofly[9];break;//9case 0xdb:P0=dofly[10];break;//acase 0xd7:P0=dofly[11];break;//bcase 0xee:P0=dofly[12];break;//ccase 0xed:P0=dofly[13];break;//dcase 0xeb:P0=dofly[14];break;//ecase 0xe7:P0=dofly[15];break;//f}}}uchar keyscan(void)//键盘扫描函数,使用行列反转扫描法{uchar cord_h,cord_l;//行列值P3=0x0f; //行线输出全为0cord_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); //返回该值}void delay(uint i)//延时函数{while(i--);}16.定时器0*This sample is used for Timer0 16bit timer mode. #include<reg52.h>sbit LED=P1^2;void Init_Timer0(void){TMOD |= 0x01;TH0=0x00; /* Init value */TL0=0x00;EA=1; /* interupt enable */ET0=1; /* enable timer0 interrupt */TR0=1;}main(){Init_Timer0();while(1);}void Timer0_isr(void) interrupt 1 using 1{TH0=0x00; /* Init value */TL0=0x00;LED=~LED;//指示灯反相}17.定时器1*This sample is used for Timer1 16bit timer mode.#include<reg52.h>sbit LED=P1^2;void Init_Timer1(void){TMOD |= 0x10;TH1=0x00; /* Init value */TL1=0x00;EA=1; /* interupt enable */ET1=1; /* enable timer1 interrupt */TR1=1;}main(){Init_Timer1();while(1);}void Timer1_isr(void) interrupt 3 using 1{TH1=0x00; /* Init value */TL1=0x00;LED=~LED;}20.外部中断0电平触发内容:通过中断接口P3.2连接的独立按键测试,按一次P1口的LE D灯反向,那个地点使用电平触发,因此一直按键不松开和一次按键成效不相同,按下会看到灯全部亮,讲明中断一直在作用#include<reg52.h>main(){P1=0x55; //P1口初始值EA=1; //全局中断开EX0=1; //外部中断0开IT0=0; //电平触发while(1){//在此添加其他程序}}外部中断程序void ISR_Key(void) interrupt 0 using 1{P1=~P1;}23.外部中断0边沿触发内容:通过中断接口P3.2连接的独立按键测试,按一次P1口的LE D灯反向,那个地点使用边沿触发,因此一直按键不松开和一次按键成效相同,区不于电平触发#include<reg52.h>main(){P1=0x55; //P1口初始值EA=1; //全局中断开EX0=1; //外部中断0开IT0=1; //边沿触发while(1){//在此添加其他程序}}外部中断程序void ISR_Key(void) interrupt 0 using 1{P1=~P1; //s3按下触发一次,P1取反一次,那个地点需要切换跳帽到独立按键模式}。