超经典!PIC单片机原理及应用实验(含代码)
- 格式:doc
- 大小:103.50 KB
- 文档页数:22
PIC单片机C语言编程实例——液晶显示模块编程15.2.2 MG-12232模块的编程下面以图15.1的接口电路为例。
液晶显示区域分成E1边和E2边,下面只含E1边的程序(表15.1中E1=1,E2=0),E2边(表15.1中E1=0,E2=1)类推。
在系统程序的初始化部分,应对程序中用到的寄存器和临时变量作说明,如:unsigned char TRANS;unsigned char PAGEADD;//存放页地址寄存器unsigned char PAGENUM;//存放总页数寄存器unsigned char CLMSUM;//存放总列数寄存器unsigned char CLMADD;//存放列地址寄存器unsigned char WRITE;//存放显示数据寄存器unsigned char row;//存放显示起始行寄存器unsigned char i,k;//通用寄存器//系统各口的输入输出状态初始化子程序void INITIAL(){ADCON1=0X87;//设置PORTA口和PORTE口为数字I/O口TRISA3=0;TRISB0=0;TRISE=0X00;//设置液晶的4个控制脚为输出}//读液晶显示器状态子程序void LCDSTA1(){while(1){TRISD=0XFF;//设置D口为输入RB0=1;//E1=1RA3=0;//E2=0RE0=1;//R/W=1RE1=0;//A0=0if(RD7==0) break;//为忙状态,则继续等待其为空闲}}//对液晶显示器发指令子程序(指令保存在TRANS寄存器中)void TRANS1(){LCDSTA1();//判断液晶是否为忙TRISD=0X00;//置D口为输出RB0=1;//E1=1RA3=0;//E2=0RE0=0;//R/W=0RE1=0;//A0=0PORTD=TRANS;//需要写入的命令字送入数据线RB0=0;//E1=0写入指令RE0=1;//R/W=1}//对液晶显示器写数据子程序(数据保存在WRITE寄存器中) void WRITE1(){TRANS=CLMADD;//设置列地址TRANS1();LCDSTA1();//查询液晶是否为空闲TRISD=0X00;//D口为输出RB0=1;//E1=1RA3=0;//E2=0RE0=0;//R/W=0RE1=1;//A0=1PORTD=WRITE;//需要写入的数据放入D口RB0=0;//E1=0,写入数据CLMADD++;//列地址加1RE0=1;//R/W=1}//开E1显示子程序void DISP1(){while(1){TRANS=0XAF;TRANS1();//送出控制命令LCDSTA1();//判断液晶是否为空闲TRISD=0XFF;//设置D口为输入RB0=1;//E1=1RA3=0;//E2=0RE0=1;//R/W=1RE1=0;//A0=0if(RD5==0) break;//如果液晶没被关闭,则继续关}}//E1边清屏子程序void CLEAR1(){PAGEADD=0xB8;//设置页地址代码for(PAGENUM=0X04;PAGENUM>0;PAGENUM-){ TRANS=PAGEADD;TRANS1();CLMADD=0x00;//设置起始列for(CLMSUM=0X50;CLMSUM>0;CLMSUM-){ LCDSTA1();//判断液晶是否为空闲WRITE=0X00;WRITE1();//写入00H以清屏}PAGEADD++;//页号增1}}//关E1显示子程序void DISOFF1(){while(1){TRANS=0XAE;TRANS1();//发出控制命令LCDSTA1();//判断液晶是否为空闲TRISD=0XFF;//D口设置为输入RB0=1;//E1=1RA3=0;//E2=0RE0=1;//R/W=1RE1=0;//A0=0if(RD5==1) break;//如果液晶没被关闭,则继续关}}有了以上的通用子程序,就可以构造出各种显示程序,如字符。
PIC单片机原理及应用PIC单片机的原理是基于微处理器的原理,它包含了CPU、存储器、输入输出(I/O)端口、定时/计数器等功能单元。
其中,CPU负责执行指令,通过存储器存储数据和程序,通过输入输出端口与外部设备进行数据交互,通过定时/计数器实现计时和计数功能。
PIC单片机的应用非常广泛。
首先,它可以用于各种嵌入式系统中,如智能家居系统、工业自动化系统等。
在智能家居系统中,PIC单片机可以控制家电设备的开关和状态,实现智能化的控制;在工业自动化系统中,PIC单片机可以根据不同的传感器信号,控制设备的运行状态和生产流程。
其次,PIC单片机还可以用于电子产品设计中,如手机、数码相机等。
在手机中,PIC单片机可以实现电池电量显示、充电管理、触摸屏控制等功能;在数码相机中,PIC单片机可以控制图像处理、曝光控制、对焦等功能。
此外,PIC单片机还可以应用于通信设备、医疗设备、汽车电子等领域。
在PIC单片机的开发过程中,需要使用相应的开发工具和软件。
Microchip公司提供了一系列的开发工具和编程软件,如PICkit系列的编程器、MPLAB X IDE集成开发环境等,方便开发者进行开发和调试。
同时,PIC单片机采用C语言进行编程,可以通过编写代码实现相应的功能和控制。
总之,PIC单片机作为一种强大的单片微控制器,具有体积小、功耗低、性能稳定等特点,广泛应用于各种电子设备中。
它的原理基于微处理器的原理,具有CPU、存储器、输入输出端口、定时/计数器等功能单元。
通过合理使用PIC单片机的开发工具和软件,可以实现各种应用需求,为电子行业的发展提供了有力的支持。
实验一 PIC单片机集成开发环境MPLAB IDE的使用一、实验目的:1、学习使用PIC单片机集成开发环境MPLAB IDE2、学习使用在线调试和编程器MPLAB ICD2二、实验方法:1、通过运行例程来初步认识单片机的开发环境;2、利用在线调试和编程器MPLAB ICD2在集成开发环境MPLAB IDE中建立工程文件夹以及程序文本的编辑、编译连接、下载和调试,实现一组由PIC18F452控制的LED灯的点亮过程。
三.程序设计内容:1、通过改变例程1,训练对PIC18F452的编程能力。
2、参照电路板图,将例程1中的输出口作适当改变,使计数结果能够用电路板上的LED 显示出来。
四、实验步骤:1、编辑源文件并将源文件存于mcc18目录下建立的文件夹中#include <p18f452.h> /*引用p18f452的库函数*/#pragma config WDT = OFF/*关闭看门狗(watchdog timer)*/#pragma config OSC = HS/*振荡器工作模式为高速晶体/谐振器*/#pragma config LVP = OFF/*关闭低电压ICSP编程*/int counter;void main (void){counter = 1;TRISB = 0; /* configure PORTB for output */while (counter <= 15){PORTB = counter; /* display value of 'counter'on the LEDs */counter++;}}2、选择目标处理器Device:PIC18F4523、建立项目(项目名与源文件同名)4、选择项目设置选择语言工具套件:MPLAB c18c Toolsuite (mcc18.exe), 选择MPLAB C18 安装目录中头文件和函数库子目录的路径。
实验一:定时器1. 实验目的:利用定时器0,定时器1,定时2实现4盏流水灯2. 实验内容 a,程序框图定时器0:/************************************************** 计算公式:(256-X)*K*T=25 000us,定时器延时25ms,预分频为K 为64,利用软件编程实现1s 脉冲输出,RB0作为输出 ************************************************/ #include<pic.h>__CONFIG(0x20F1); __CONFIG(0x3F71); #define T0_25MS 61 char a=0;void interrupt ISR() {if(T0IF==1)定时器1定时500MS定时器0定时50MS 、定时器1定时器2定时50MS时间到? 时间到? 时间到?a 的值加1 led 灯循环左移一位 a 的值加1a=20?a=10?a=0,led 灯循环左移一位 a=0,led 灯循环左移一位开始开始开始T0IF=0;TMR0=T0_25MS;a++;if(a==20) //输出1s脉冲{PORTD=(PORTD<<1);a=0;if(PORTD==0x10)PORTD=0x01;}}}void timer0init(){OPTION=0b10000110; //,预分频器给TMR0,TMR0预分频系数为1:64 INTCON=0b10100000; //GIE,PEIE置1}void main(){timer0init();TRISD=0;PORTD=0x01;while(1);}定时器1:/**************************************************计算公式:(65536-X)*K*T=500 000us,定时器延时500ms,预分频为8,利用软件编程实现1s脉冲输出,RB0作为输出************************************************/#include<pic.h>__CONFIG(0x20F1);__CONFIG(0x3F71);#define T1_500MS 3036void interrupt ISR(){if(TMR1IF==1){TMR1IF=0;TMR1H=T1_500MS>>8;TMR1L=T1_500MS;PORTD=(PORTD<<1);if(PORTD==0x10)PORTD=0x01;}void timer1init(){TMR1H=T1_500MS>>8;TMR1L=T1_500MS;TMR1IE=1;INTCON=0b11000000; //GIE,PEIE置1T1CON=0b00110001;; //TMR1预分频系数为1:8}void main(){timer1init();TRISD=0;PORTD=0x01;while(1);}定时器2:/**************************************************计算公式:(PR2+1)*K1*K2*T=50 000us,定时器延时50ms,预分频为K1为16,后分频器K2为15利用软件编程实现1s脉冲输出,RB0作为输出************************************************/#include<pic.h>__CONFIG(0x20F1);__CONFIG(0x3F71);#define LED RB0char a=0;void interrupt ISR(){if(TMR2IF==1){TMR2IF=0;a++;if(a==10) //1秒到了{PORTD=(PORTD<<1);a=0;if(PORTD==0x10)PORTD=0x01;}}}void timer2init()TMR2IE=1;PR2=207;INTCON=0b11000000; //GIE,PEIE置1T2CON=0B001110111; //TMR2预分频系数为1:16,后分频器为1:15 }void main(){timer2init();TRISD=0;PORTD=0x01;while(1);}实验二:RB0中断1.实验目的:a.利用外部中断RB0实现流水灯左移2.程序框图:开始RB0按下?进入中断,led灯循环左移一位程序:#include<pic.h>__CONFIG(0x20F1);__CONFIG(0x3f71);void delaynms(unsigned int n);void interrupt ISR(void);void main(){OPTION=0b00000000;ANS12=0;WPUB0=1;TRISB=0b00000001;INTCON=0b10010000;TRISD=0b00000000;PORTD=0x01;while(1);}void interrupt ISR(void){if(INTF==1){delaynms(30);INTF=0;PORTD=(PORTD<<1);if(PORTD==0x10)PORTD=0x01;}}void delaynms(unsigned int n){unsigned int j;char k;for(j=0;j<n;j++)for(k=246;k>0;k--)NOP();}实验三:AD转换1.实验目的:利用PIC内部AD转换器,AN0通道口采集模拟数据,通过LCD1602显示结果2.程序框图:程序:#include<pic.h>__CONFIG(0x3F39); __CONFIG(0x20F1); #define RS RD4 #define RW RD5 #define E RD6#define uint unsigned int char QW,BW,SW,GW;//8段共阳LED 显示代码,0位-7位分别控制a -h 段const char LED_CODE[]={0b11000000, 0b11111001,0b10100100,0b10110000,0b10011001, 0b10010010,0b10000010,0b11111000,0b10000000,0b10010000,0b01111111}; uint AD_SUB(char k);void init1602(); //1602初始化 void write_com(char com);//写指令 void write_date(char data);//写数据 void delaynms(unsigned int n); void spiinit();void SPI_WRITE(char ); void displayled(); void display1602(); void BCD(uint R1); void main() {uint y;TRISA=0b00000001;选择AD 通道启动ADGODON E=0?数据送1602显示初始化数据送数码管显示 开始ANSEL=0b11111111; //AN0~AN7为模拟输入,上电默认,可不设TRISD=0; //D口设置为输出PORTD=0;spiinit();init1602();while(1){y=AD_SUB(0); //0表示第0个通道BCD(y);displayled();display1602();delaynms(500); //此不不能忽略}}void BCD(uint R1){QW=0;BW=0;SW=0;GW=0;while(R1>=1000){R1-=1000;QW++;}while(R1>=100){R1-=100;BW++;}while(R1>=10){R1-=10;SW++;}GW=R1;}void displayled(){SPI_WRITE(GW); //先发个位SPI_WRITE(SW); //发十位SPI_WRITE(BW); //发百位SPI_WRITE(10); //发小数点SPI_WRITE(QW); //发千位}void display1602(){write_com(0x80);write_date(0x30+QW);write_date(0x2e); //小数点write_date(0x30+BW);write_date(0x30+SW);write_date(0x30+GW);write_date(0x56); //"V"}void SPI_WRITE(char b){char BUF;BUF=LED_CODE[b];SSPBUF=BUF; //发出数据while(BF==0);BUF=SSPBUF;}void spiinit(){TRISC=0b00010000;SSPEN=1;CKP=1;SSPM3=0;SSPM2=0;SSPM1=0;SSPM0=1;SMP=1;CKE=0;}uint AD_SUB(char k){char i;uint temp;float x;ADCON0=0b01000001; //TAD=8TOSC,ADFM=1; //设置成右对齐ADCON0|=(k<<4);for(i=1;i<5;i++)NOP(); //打开AD通道后延时20us左右GODONE=1; //开始AD转换while(GODONE==1); //等待转换完成ADIF=0;temp=ADRESH<<8;temp|=ADRESL;x=temp/1023.0*5.0;temp=x*1000;return(temp);}void init1602(){delaynms(20); //延时时间大于15mswrite_com(0x03);delaynms(5);write_com(0x03);delaynms(5);write_com(0x03);delaynms(5);write_com(0x02); //归HOME位,此不不可少delaynms(5);write_com(0x28); //工作方式设置,4位数据线,2行字符,5*7字体write_com(0x0c); //显示开关设置,画面开,光标消失,禁止闪烁write_com(0x06); //输入方式设置,AC为加一计数器write_com(0x01); //清屏write_com(0x80); //开始显示位置delaynms(2);}void write_com(char com){RS=0; //写指令RW=0;PORTD&=0xf0; //低四位清0E=1; //有效发送PORTD|=((com>>4)&0x0f);//先发高四位delaynms(5);E=0;PORTD&=0xf0;E=1;PORTD|=(com&0x0f);//再发低四位delaynms(5);E=0;}void write_date(char data){RS=1; //写数据RW=0;PORTD&=0xf0;E=1;PORTD|=((data>>4)&0x0f);//先发高四位delaynms(5);E=0;PORTD&=0xf0;E=1;PORTD|=(data&0x0f); //再发低四位delaynms(5);E=0;RS=0;}void delaynms(unsigned int n){unsigned int j;char k;for(j=0;j<n;j++)for(k=246;k>0;k--)NOP();}实验四:PWM1.实验目的:通过PIC单片机输出PWM不同占空比脉冲波形2.程序流程:程序:#include<pic.h>__CONFIG(0x3f3a);char a;void CSH();void interrupt ISR(void);void delaynms(unsigned int n); void main(){CSH();while(1){if(a==0)开始初始化占空比为0.1RB0是否按下进入中断,a加1a=1,则输出占空比0.1 a=2,则输出占空比0.3a=3,则输出占空比0.6a=4,则输出占空比0.9a=5,则a清0,占空比为0.1CSH();}}void CSH(){TRISC2=0;TRISD=0;PR2=249;CCPR1L=0x32;CCP1CON=0x0c;T2CON=0x05;OPTION=0b00000000;ANS12=0;WPUB0=1;TRISB=0b00000001;INTCON=0b10010000;}void interrupt ISR(void){if(INTF==1){delaynms(30);if(RB0==0){INTF=0;a++;switch(a){case 1:CCPR1L=0x19;PR2=249;CCP1CON=0x0c;T2CON=0x05;break; //占空比0.1 case 2:CCPR1L=0x4b;PR2=249;CCP1CON=0x0c;T2CON=0x05;break; //占空比0.3 case 3:CCPR1L=0x96;PR2=249;CCP1CON=0x0c;T2CON=0x05;break; //占空比0.6 case 4:CCPR1L=0xe1;PR2=249;CCP1CON=0x0c;T2CON=0x05;break;// 占空比0.9 case5:a=0;break;}}}}void delaynms(unsigned int n){unsigned int j;char k;for(j=0;j<n;j++)for(k=246;k>0;k--)NOP();}。
pic单片机实验报告PIC单片机实验报告引言:PIC单片机是一种非常常见的嵌入式系统开发工具,被广泛应用于电子产品的设计与制造过程中。
本实验报告将介绍我对PIC单片机的实验研究,并分享实验过程中的收获和心得体会。
实验一:LED灯的控制在本实验中,我使用PIC单片机来控制一组LED灯的亮灭。
通过编程,我成功实现了按键控制LED灯的开关,以及通过定时器实现LED灯的闪烁效果。
这个实验让我初步了解了PIC单片机的编程方法和基本原理。
实验二:温度传感器的应用在这个实验中,我将PIC单片机与温度传感器连接,并通过编程实现了温度的实时监测和显示。
通过这个实验,我深入了解了模拟信号的采集和数字信号的处理过程,并学会了如何使用PIC单片机进行数据的读取和处理。
实验三:蜂鸣器的控制本实验中,我使用PIC单片机控制了一个蜂鸣器的发声。
通过编程,我实现了不同频率的声音输出,并且可以通过按键控制声音的开关。
这个实验让我了解了如何通过PIC单片机来控制外部设备,并且学会了如何利用定时器来产生不同频率的方波信号。
实验四:液晶显示屏的应用在这个实验中,我将PIC单片机与液晶显示屏连接,并通过编程实现了文字和图形的显示。
通过这个实验,我学会了如何使用PIC单片机来控制液晶显示屏,并且了解了液晶显示屏的基本原理和工作方式。
实验五:无线通信模块的应用在本实验中,我将PIC单片机与无线通信模块连接,并通过编程实现了两个PIC 单片机之间的无线数据传输。
通过这个实验,我了解了无线通信模块的基本原理和工作方式,并学会了如何使用PIC单片机进行无线通信的应用。
结论:通过对PIC单片机的实验研究,我深入了解了PIC单片机的工作原理和应用方法。
通过编程和实践,我成功实现了LED灯的控制、温度传感器的应用、蜂鸣器的控制、液晶显示屏的应用以及无线通信模块的应用。
这些实验不仅让我掌握了PIC单片机的基本编程技巧和应用方法,还培养了我对嵌入式系统开发的兴趣和能力。
关于用PIC单片机红外遥控的编码与解码的问题一般常用的红外遥控器编码规则都差不多,基本上都同6221原理一样(可在网上找到)接收时:如果用54,57这类片子做的话有一定的难度(假如要做成实时控制的;比如说你还要驱动显示,驱动步进电机,在加上几个按键)原因就是这类片子没有中断例程如下(用来解6221;分频比为256)RF:BTFSC PORTB,2;;B2口用做接收口GOTO RF1BTFSS DOWNBIT;;检测下降沿标制CLRF RTCCOUNTBSF DOWNBIT;制下降沿标制BTFSS UPBIT;;检测上升沿标制RETLW 0BTFSC IDBIT;;检测码头标制GOTO RF3MOVLW 2AHSUBWF RTCCOUNT,0BTFSS STATUS,0GOTO RF2MOVLW 36HSUBWF RTCCOUNT,0BTFSC STATUS,0GOTO RF2BTFSC IDBITGOTO RF3MOVLW .8MOVWF LOOPMOVLW .3MOVWF LOOPCOUNTCLRF DATACOUNTBSF IDBITBSF DOWNBITBCF UPBITCLRF RTCCOUNTRETLW 0RF1:BTFSS DOWNBITRETLW 0BSF UPBITRETLW 0RF2:BCF DOWNBITBCF UPBITBCF IDBITCLRF RTCCOUNTRETLW 0 ;遥控接收RF3:MOVLW 02HSUBWF RTCCOUNT,0BTFSS STATUS,0GOTO RF4MOVLW 0CHSUBWF RTCCOUNT,0BTFSS STATUS,0GOTO RF4GOTO RF2RF4:MOVLW 08HSUBWF RTCCOUNT,0BTFSC STATUS,0BSF 3H,0MOVLW 07HSUBWF RTCCOUNT,0BTFSS STATUS,0BCF 3H,0RLF DATACOUNT,1BSF DOWNBITBCF UPBITCLRF RTCCOUNTDECFSZ LOOP,1RETLW 0MOVLW .8MOVWF LOOPDECFSZ LOOPCOUNTRETLW 0BSF RFBIT;;制接收完标制BCF DOWNBITBCF UPBITBCF IDBITCLRF RTCCOUNTRETLW 0//////////////////////////////////////////////////////////TIME:BTFSC TIMEPD1GOTO TIME1MOVF RTCC,0;;(MOVWF TIMEONEBSF TIMEPD1RETLW 0 ;定时查寻TIME1:MOVF RTCC,0SUBWF TIMEONE,0BTFSC STATUS,2RETLW 0BCF TIMEPD1INCF RTCCOUNT,1RETLW 0////////////////////////////////////////////////在这里我是用查询的方式来定时的(RTCCOUNT)只是在解码时不需要去追求时间精度;我是去查RTCC有没有发生跳变如有则表示时间过了256US---RTCCOUNT加一;这样做有一个好处---你不必去管RTCC具体的值是多少,(RTCC去做精确的时钟定时;在这个查询的子程序中你可以去判断键扫,显示刷新,驱动步进电机等等)相应的C代码如下:unsigned char rfcount,loop,rftime,//查询定时器k;bit rfbit, //接收完标制lowbit1,lowbit2,downbit,rfgobit;unsigned char dispcount[5];//结果#define rfin RC6//////////////////////////////////////////////////////////////////////////////// rf( )//遥控接收{if(rfbit==0){if((lowbit1==0)&&(rfin==0)){downbit=1;rftime=0;lowbit1=1;return;}if((lowbit1==1)&&(rfin==1)){lowbit2=1;return;}if((lowbit1==1)&&(lowbit2==1)&&(RC6==0)) {lowbit1=0;lowbit2=0;if((rftime>=40)&&(downbit==1))//遥控接收;{rfgobit=1;loop=0;rfcount=0;k=1;rftime=0;return;}rfcount=rfcount+1;loop=loop+1;if(rfcount>=31){rfgobit=0;downbit=0;rfcount=0;rfbit=1;loop=0;return;}if((rftime>=7)&&(rfgobit==1)){dispcount[k]=dispcount[k]|0x80;rftime=0;if(loop==8){k=k+1;loop=0;return;}dispcount[k]=dispcount[k]>>1;return;}if((rftime<5)&&(rfgobit==1)){dispcount[k]=dispcount[k]&0x7f;rftime=0;if(loop==8){k=k+1;loop=0;return;}dispcount[k]=dispcount[k]>>1;return;}}}}(查询子程序同汇编)假如用中断的话也可用时间查询的方法,只是接收口改用带中断的口线;RB4--RB7,CCP1,CCP2,都可以。
pic单片机的原理和应用一、pic单片机的概述PIC(Peripheral Interface Controller)单片机是由美国Microchip Technology公司生产的一种微控制器,广泛应用于嵌入式系统和电子设备中。
它采用哈佛结构,具有高性能、低功耗、易于编程等特点,在各种领域的控制应用中得到了广泛的应用。
二、pic单片机的核心组成部分pic单片机由五个主要部分组成,包括中央处理器(CPU)、存储器、输入/输出(I/O)端口、计时器/计数器和通信接口。
1.中央处理器(CPU):pic单片机通过CPU实现程序的控制和计算操作。
它包含一个ALU(算术逻辑单元)、寄存器和指令集,用于执行程序中的指令。
2.存储器:pic单片机具有多种类型的存储器,包括闪存存储器(用于存储程序代码和数据)、随机存取存储器(RAM)和特殊功能寄存器(SFR)。
这些存储器用于存储程序、变量和配置信息。
3.输入/输出(I/O)端口:pic单片机提供了多个I/O端口,用于与外部设备进行通信。
它们可以用于读取输入数据或控制输出信号,实现与外部世界的连接。
4.计时器/计数器:pic单片机具有多个计时器和计数器,用于执行时间相关的任务。
它们可以用于测量时间、生成定时器中断、计数输入脉冲等操作。
5.通信接口:pic单片机支持多种通信接口,包括串行通信接口(如SPI和I2C)和通用异步收发器(UART)。
这些接口使pic单片机能够与其他设备进行串行通信,实现数据传输和通信功能。
三、pic单片机的应用领域pic单片机在各种控制和嵌入式系统中得到了广泛的应用。
以下是pic单片机的一些常见应用领域:1.家用电器控制:pic单片机可以用于控制家用电器,如洗衣机、冰箱、空调等。
它们可以通过读取传感器数据并根据程序逻辑来控制电器的运行状态和功能。
2.工业自动化:pic单片机在工业自动化领域中得到了广泛应用。
它们可以用于控制生产线上的设备、监测温度、湿度、压力等参数,并根据需要进行相应的控制和调节。
《单片机原理及应用》实验指导书适用年级:08 物电信编制人:彭晓珊编制时间:2010.3实验室:嵌入式工程师实训室1《单片机原理及应用》第一次实验实验名:开发环境认识实验主要内容:认识MPLAB 开发软件,熟悉QL200B 实验箱目的要求:熟练掌握MPLAB 开发软件的开发流程,熟悉QL200B 实验箱的组成。
主要仪器:QL200B 实验箱+PC+万用表《单片机原理及应用》第二次实验实验名:跑马灯实验主要内容:进一步认识MPLAB 开发软件,熟悉QL200B 实验箱硬件,熟悉软件延时的设计。
目的要求:实现一个简单的流水灯程序,即轮流点亮 C 口的8 个灯(先点亮RC0,再熄灭RCO 点亮RC1……)。
硬件要求:拨码开关S11 全部置ON,其余全部为OFF。
主要仪器:QL200B 实验箱+PC参考程序如下:#include<p16f877A.inc> ;调用头文件__CONFIG_DEBUG_OFF&_CP_ALL&_WRT_HALF&_CPD_ON&_LVP_OFF&_BODEN_OFF&_PWRTE_ON&_ WDT_OFF&_HS_OSC;**********************用户寄存器定义********************count equ 20h ;移位次数寄存器2del_va1 equ 0ffh ;外层延时参数del_va2 equ 0afh ;内层延时参数org 00h ;程序人口地址;**********************主程序开始***********************mainnop ;ICD 所需要的一条空指令clrf PORTC ;先清楚C 口所有显示banksel TRISC ;选择I/O 口方向寄存器所在的体clrf TRISC ;设置C 口全为输出clrf STATUS ;返回体0movlw .8movwf count ;装载循环次数8(C 口共8 位)bsf STATUS,C ;置进位标志位为1,因循环移位是带进位循环的looprlf PORTC,1 ;C 口左移1 位call delay3call delayCALL delay ;调用三次延时程序(保证亮度,以及流水灯闪烁速度)bcf STATUS,C ;清0 进位标志位(永远只有一只LED 亮)DECFSZ count,1 ;判断是否一轮循环结束goto loop ;否,继续循环移位GOTO main ;是,程序重头开始;***********************延时程序*************************delaymovlw del_va1 ;延时程序外层参数movwf 30hmovlw del_va2 ;延时程序内层参数movwf 31hdecfsz 31h,1goto $-1decfsz 30h,1goto $-4return;********************程序结束****************************end4《单片机原理及应用》第三次实验实验名:LED 显示控制实验主要内容:进一步认识MPLAB 开发软件,熟悉QL200B 实验箱硬件,熟悉静态和动态显示LED 的设计。
目的要求:1、用静态方式控制LED 显示实验目的:熟悉数码管的静态显示,数码管显示单个数字“0”硬件要求:拨码开关S6 全置ON,S5 第 6 位置ON,其它位和拨码开关置OFF参考程序:#INCLUDE<P16F877A.INC> ;包含头文件__CONFIG_DEBUG_OFF&_CP_ALL&_WRT_HALF&_CPD_ON&_LVP_OFF&_BODEN_OFF&_PWRTE_ON&_ WDT_OFF&_HS_OSCORG 00H ;程序入口地址NOP ;放置ICD 所需要的空指令MOVLW 0FFHMOVWF PORTAMOVWF PORTD ;清除所有显示BSF STATUS,RP0 ;选择体1MOVLW 1FH ;RA5 为输出,其余各位为输入MOVWF TRISA5CLRF TRISD ;RD 口全部输出MOVLW 06HMOVWF ADCON1 ;A 口设置为普通I/OBCF STATUS,RP0 ;回体0MOVLW 0C0H ;0 的共阳极显示编码MOVWF PORTD ;送数码管显示BCF PORTA,5 ;使能数码管显示LOOPGOTO LOOP ;停机指令END ;源程序结束2、用动态方式控制LED 显示实验目的:熟悉多位数码管动态扫描显示的方法。
六位数码管从左到右显示012345 六位数字。
硬件要求:拨码开关S5、S6 全部置ON。
其他拨码开关全置OFF。
#include<p16f877A.inc> ;包含头文件__CONFIG_DEBUG_OFF&_CP_ALL&_WRT_HALF&_CPD_ON&_LVP_OFF&_BODEN_OFF&_PWRTE_ON&_ WDT_OFF&_HS_OSCORG 00H ;程序入口地址6NOP ;放置一条ICD 所需要的空指令MOVLW 0FFHMOVWF PORTAMOVWF PORTD ;清除所有显示BSF STATUS,RP0 ;选择体1CLRF TRISA ;设置A 口为输出CLRF TRISD ;设置D 口为输出MOVLW 06HMOVWF ADCON1 ;设置A 口为普通I/O 口BCF STATUS,RP0 ;回体0LOOPMOVLW 0 ;显示0CALL TABLEMOVWF PORTDBCF PORTA,0CALL DELAYBSF PORTA,0MOVLW 1 ;显示1CALL TABLE7MOVWF PORTDBCF PORTA,1CALL DELAYBSF PORTA,1MOVLW 2 ;显示2CALL TABLEMOVWF PORTDBCF PORTA,2CALL DELAYBSF PORTA,2MOVLW 3 ;显示3CALL TABLEMOVWF PORTDBCF PORTA,3CALL DELAYBSF PORTA,3MOVLW 4 ;显示48CALL TABLEMOVWF PORTDBCF PORTA,4CALL DELAYBSF PORTA,4MOVLW 5 ;显示5CALL TABLEMOVWF PORTDBCF PORTA,5CALL DELAYBSF PORTA,5GOTO LOOP ;循环显示;***************查表程序*****************************TABLEADDWF PCL,1 ;加上偏移地址1RETLW 0C0H ;0 的编码(公阳极数码管)RETLW 0F9H ;1 的编码9RETLW 0A4H ;2 的编码RETLW 0B0H ;3 的编码RETLW 99H ;4 的编码RETLW 92H ;5 的编码;**************延时程序*****************************DELAYMOVLW 0FFHMOVWF 20HDECFSZ 20H,1GOTO $-1RETURNEND ;程序结束10实验四:按键判别实验内容:判断有无按键按下硬件要求:拨码开关S1 全部置ON《单片机原理及应用》第四次实验要求:拨码开关S6 全部置ON,S5 第5-6 位置ON,其他位置OFF 其他拨码开关置OFF数码管无按键按下时显示“FF”,有按键时显示编码;1、使用实验箱上的模块是独立按键模块:2、六位数码管模块使用过3、参考程序:#include<p16f877A.inc> ;包含头文件__CONFIG_DEBUG_OFF&_CP_ALL&_WRT_HALF&_CPD_ON&_LVP_OFF&_BODEN_OFF&_PWRTE_ON&_ WDT_OFF&_HS_OSC;*******************用户寄存器定义*********************DISPLAYVAL1 EQU 20H ;显示高位寄存器DISPLAYVAL2 EQU 21H ;显示低位寄存器;******************程序入口地址************************11ORG 00HNOP ;ICD 所需要的空指令GOTO MAIN ;转主程序;*****************查表程序*****************************TABLEADDWF PCL,1 ;加上偏移地址RETLW 0C0H ;0 的编码RETLW 0F9H ;1 的编码RETLW 0A4H ;2 的编码RETLW 0B0H ;3 的编码RETLW 83H ;b 的编码RETLW 88H ;A 的编码RETLW 8EH ;F 的编码;****************主程序*******************************MAINMOVLW 0FFHMOVWF PORTD ;关闭所有显示BANKSEL TRISA ;选择I/O 口方向寄存器所在的体12MOVLW 0FHMOVWF TRISA ;A 口高2 位输出,低4 位输入MOVWF TRISB ;B 口高4 位输出,低4 位输入CLRF TRISD ;D 口输出BANKSEL ADCON1MOVLW 06HMOVWF ADCON1 ;A 口为普通I/O 口CLRF STATUS ;回体0LOOPMOVLW 6MOVWF DISPLAYVAL1MOVWF DISPLAYVAL2 ;F 的偏移地址BTFSC PORTB,0 ;BO 是否按下?GOTO PB_1 ;否,转判B1CALL DELAY ;延时,清除干扰信号BTFSC PORTB,0 ;再次判断BO 口是否按下?GOTO PB_1 ;否MOVLW 4 ;是,b 的偏移地址MOVWF DISPLAYVAL113MOVLW 0 ;0 的偏移地址MOVWF DISPLAYVAL2GOTO LOOP_END ;转显示部分PB_1BTFSC PORTB,1 ;B1 是否按下?GOTO PB_2 ;否,转判B2CALL DELAY ;延时,清除干扰信号BTFSC PORTB,1 ;再次判断B1 是否按下?GOTO PB_2 ;否MOVLW 4MOVWF DISPLAYVAL1 ;是,b 的偏移地址MOVLW 1MOVWF DISPLAYVAL2 ;1 的偏移地址GOTO LOOP_END ;转显示部分PB_2BTFSC PORTB,2 ;B2 是否按下?GOTO PB_3 ;否,转判B3CALL DELAY ;延时,清除干扰信号BTFSC PORTB,2 ;再次判断B2 是否按下?GOTO PB_3 ;否14MOVLW 4MOVWF DISPLAYVAL1 ;是,b 的偏移地址MOVLW 2MOVWF DISPLAYVAL2 ;2 的偏移地址GOTO LOOP_END ;转显示部分PB_3BTFSC PORTB,3 ;B3 是否按下GOTO PA_0 ;否,转判A0CALL DELAY ;延时,清除干扰信号BTFSC PORTB,3 ;再次判断B3 是否按下?GOTO PA_0 ;否MOVLW 4MOVWF DISPLAYVAL1 ;是,b 的偏移地址MOVLW 3MOVWF DISPLAYVAL2 ;3 的偏移地址GOTO LOOP_END ;转显示部分PA_0BTFSC PORTA,0 ;A0 是否按下GOTO PA_1 ;否,转判A1CALL DELAY ;延时,清除干扰信号15BTFSC PORTA,0 ;再次判断A0 是否按下?GOTO PA_1 ;否MOVLW 5 ;是,A 的偏移地址MOVWF DISPLAYVAL1MOVLW 0MOVWF DISPLAYVAL2 ;0 的偏移地址GOTO LOOP_END ;转显示部分PA_1BTFSC PORTA,1 ;A1 是否按下GOTO PA_2 ;否,转判A2CALL DELAY ;延时,清除干扰信号BTFSC PORTA,1 ;再次判断A1 是否按下?GOTO PA_2 ;否MOVLW 5MOVWF DISPLAYVAL1 ;是,A 的偏移地址MOVLW 1MOVWF DISPLAYVAL2 ;1 的偏移地址GOTO LOOP_END ;转显示部分PA_2BTFSC PORTA,2 ;A2 是否按下16GOTO PA_3 ;否,转判A3CALL DELAY ;延时,清除干扰信号BTFSC PORTA,2 ;再次判断A2 是否按下?GOTO PA_3 ;否MOVLW 5MOVWF DISPLAYVAL1 ;是,A 的偏移地址MOVLW 2MOVWF DISPLAYVAL2 ;1 的偏移地址GOTO LOOP_END ;转显示部分PA_3BTFSC PORTA,3 ;A3 是否按下GOTO LOOP_END ;否,转显示部分CALL DELAY ;延时,清除干扰信号BTFSC PORTA,3 ;再次判断A3 是否按下?GOTO LOOP_END ;否,转显示部分MOVLW 5MOVWF DISPLAYVAL1 ;是,A 的偏移地址MOVLW 3MOVWF DISPLAYVAL2 ;3 的偏移地址GOTO LOOP_END17LOOP_ENDMOVF DISPLAYVAL1,0 ;显示低位CALL TABLE ;查表获取相应的编码MOVWF PORTD ;送数码管显示BCF PORTA,4 ;使能相应数码管显示CALL DELAY ;延时一段时间,以保证足够的亮度BSF PORTA,4 ;关闭显示MOVF DISPLAYVAL2,0 ;显示高位CALL TABLE ;查表获取相应的编码MOVWF PORTD ;送数码管显示BCF PORTA,5 ;使能相应数码管显示CALL DELAY ;延时一段时间BSF PORTA,5 ;关闭显示GOTO LOOP ;循环判断是否有按键按下,并显示;*******************延时程序*************************DELAYMOVLW 0FFHMOVWF 30HDECFSZ 30H,118GOTO $-1RETURN;******************程序结束**************************END《单片机原理及应用》第五次实验:4*4 键盘控制实验实验目的:熟悉键盘矩阵的扫描方法程序中先不考虑做按键去抖,也先不考虑多个键同时按下的情况。