超经典!PIC单片机原理及应用实验(含代码)

合集下载

PIC18F452单片机原理及编程实践(第二章)PIC结构体与汇编语言编程

PIC18F452单片机原理及编程实践(第二章)PIC结构体与汇编语言编程



2017/8/29
20
―快速访问RAM区”的映射示意图
0区 (256B)
000H 0FFH
GP RAM GP RAM
000H 07FH F80H FFFH
128B 14区 (256B)
GP RAM FSR
GP RAM
F00H F7FH
F80H FFFH
128B
―快速访问”存 储区的组成 (256B)
9

2017/8/29
PIC18F452的“文件寄存器”结构示意图
4K RAM 000H 0FFH
GP RAM GP RAM
0 255
通用寄存器GPR 文件寄存器 特殊功能寄存器SFR
GP RAM
F00H F7FH F80H FFFH
3840
GP RAM SFR区域 (128B)
3967 3968 4095

2017/8/29
8
PIC文件寄存器(RAM)的空间分配

按照功能逻辑划分,文件寄存器(RAM)被分为: ① 通用寄存器 GPR:存储程序中的变量数据; ② 特殊功能寄存器 SFR:用于设定功能模块的工作 模式、工作状态等特殊信息。

GPR和SFR同在一个RAM存储阵列。 凡是没有分配给SFR的空间都可以作为通用寄存器GPR。 在18F系列中,SFR被“统一集中”在RAM的高地址空间 中(第15区的高128B)。 PIC18系列 RAM的大小随型号而不同,从32B~4KB。

―区选择寄存器”BSF的设定是可以通过指令: MOVLW k MOVWF BSR (k=0~15)
15区 (256B)
GP RAM SFR区域 (128B)

PIC单片机C语言编程实例

PIC单片机C语言编程实例

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单片机原理及应用

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实验程序

pic实验程序

void _delay_ms(char a) //毫秒级延时子函数 { unsigned char i,j; for(i=0;i<a;i++) for(j=0;j<40;j++);
}
void enable(void) //控制命令的子函数 {
rs=0;//1111 1101 a1 置 0 rw=0; //1111 1011 a2 置 0
while(delaytime)delaytime--; } //向 LCD 写入命令的子程序 void write_lcd_command(unsigned char write_command) {
lcd_delay(40); RSCLR;//Rs=0 RWCLR;//RW=0 temp=(write_command&0xf0)>>4; LCDPORT=(LCDPORT&0xf0)|temp;//写命令字 ((write_command>>4)&0x0f); ENSET;//EN=1; ENCLR;//EN=0
unsigned char i; ENCLR;//开使能 for(i=20;i>0;i--)lcd_delay(248);//延时 45ms for(i=4;i>0;i--)write_lcd_command(0x2f);//设为四线输出 lcd_delay(248); write_lcd_command(0x2f);//设为四线输出 lcd_delay(248);//延时 45ms write_lcd_command(0x2f);//设为四线输出 for(i=4;i>0;i--)lcd_delay(248);//延时 45ms
#define up

PIC单片机原理及应用(第三版)(下)

PIC单片机原理及应用(第三版)(下)
主编: 李荣正
1
第0章 键盘和显示
键盘和显示是单片机控制系统非常重要的人 机交互界面。
2
0.1 八段数码显示
1、八段数码显示器的编码
数值
1 2 3 4 5
编码
06H 5BH 4FH 66H 6DH
数值
6 7 8 9 0
编码
7DH 07H 7FH 6FH 3FH
2、编码查表程序
3
3、多位数字动态显示 多位数字动态显示涉及数据的传送和显示 位的控制。
18
Bit6/SSPOV:接收溢出标志位,被动参数。 0:未发生接收溢出; 1:发生接收溢出。 注意:所指的接收溢出是缓冲器SSPBUF中 数据还未取出时,移位寄存器SSPSR中又收到 新的数据,原SSPSR中的数据丢失。
19
Bit7/WCOL:写操作冲突检测位,被动参数。 在SPI从动方式下: 0:未发生冲突; 1:发生冲突。 注意:当WCOL=1, 正在发送前一个数据时, 又有新数据写入SSPBUF,必须用软件予以清零。
RK0 RK0 RK1 RK2 RK3 CK0 CK1 CK2 CK3 RK0 RK1 RK2 RK3 CK0 CK1 CK2 CK3 TO PIC1 6F877 RSW1 4K7 RSW2 4K7 RSW3 4K7 RSW4 4K7 RK3 C SW-PB D SW-PB E SW-PB F SW-PB RK2 8 SW-PB 9 SW-PB A SW-PB B SW-PB RK1 4 SW-PB 5 SW-PB 6 SW-PB 7 SW-PB 0 SW-PB 1 SW-PB 2 SW-PB 3 SW-PB
37
Bit2/T1SYNC:TMR1外部输入时钟与系统时钟同步控制位,主 动参数。 当TMR1工作于计数器方式(TMR1CS=1时): 0: TMR1外部输入时钟与系统时钟保持同步; 1: TMR1外部输入时钟与系统时钟不保持同步; 当TMR1工作于定时器方式(TMR1CS=0时):该位不起作用。 Bit3/T1OSCEN:TMR1自带振荡器使能位,主动参数。 0: 禁上TMR1振荡器起振,使非门的输出端呈高阻态; 1: 允许TMR1振荡器起振。

PIC18F452单片机原理及编程实践(第五章)算数、逻辑指令和程序示例

PIC18F452单片机原理及编程实践(第五章)算数、逻辑指令和程序示例

00111100 11100111
+ 00111011 10001101 01111000 01110100

=7874H
作为计算机,是按照字节运算的,所以应采用“先做低8 位” 、 “后做高8位”字节运算的规律。但是这种8位的 字节两次加法是否能与真正的16位加法运算相一致呢?
8
2017/8/29
9
2017/8/29
5.1.4 BCD(二进制编码的十进制数)系统
十进制数 BCD码

用二进制数来表示十进制数的 方法称之为“BCD”码; 在计算机系统中,存储BCD码 的方式有两种: 非压缩的BCD码; 压缩的BCD码。

1. 2.
0 1 2 3 4 5 6 7 8 9
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001


2017/8/29
13

1. 2.
举例说明: 两个BCD码17H+28H。 人工计算=45H; 计算机计算=3FH。 问题出在计算机是按照二进制加法法则运算的。

1. 2.
修正原理。执行任何一条指令后: 如果低4位大于9或DC=1,那么低4位加6H; 如果高4位大于9或C=1,那么高4位加6H。
2017/8/29
14

57H+77H。
57H + 77H CEH + 6 6H 3 4H
DC=1、C=0 C=1
实际调整后应当为134,注意百位的BCD码是存在C中。
2017/8/29
15
PIC的DAW指令的特殊性

与其它的微处理器(如INTE公司的MCS-例如:

PIC实验报告

PIC实验报告

} void interrupt AD_SER() { if(T0IF) { T0IF=0; GO=1; while(GO); LED=!LED; } } 2.protues原理图
实验四:PWM 2.实验程序: #include "pic.h" __CONFIG(0x20f1); __CONFIG(0x3fff); void main() { TRISC1=0; //RC1定义为输出 CCP2CON=0b00001100; //占空比低两字节为0;PWM模式CCPR2L=0b01100100; //占空比高8位 PR2=249; T2CON=0b00000101; //timer2使能;预分频比1:4 while(1); } 3.protu实验报告实验一:定时器 2.实验程序: #include "pic.h" __CONFIG(0x20f1); __CONFIG(0x3fff); #define LED1 RD1 void interrupt T1_SER(void); void main() { TRISD=0; LED1=1; T1CON=0b00000001; TMR1H=15536>>8; TMR1L=15536; GIE=1;TMR1IE=1;PEIE=1; while(1); } void interrupt T1_SER() { if(TMR1IF) { TMR1IF=0; LED1=!LED1; TMR1H=15536>>8; TMR1L=15536; } } 3.protues原理图
实验二:按键中断2.实验程序: #include "pic.h" __CONFIG(0x20F1); __CONFIG(0x3FFF); #define uint unsigned int #define LED RD0 void DELAY(uint); void interrupt INT_SER(void); void main(void) { TRISD=0b11111110; TRISB=0b11111111; ANSEL=0; ANSELH=0; nRBPU=0; WPUB0=1; LED=1; GIE=1;INTE=1; while(1); } void interrupt INT_SER(void)

PIC18F452单片机原理及编程实践(第四章)PIC的端口编程

PIC18F452单片机原理及编程实践(第四章)PIC的端口编程

MOVF
PORTA,W
却使用了两个不同的地址。这是防止与PORTA得真正输 入(通过Input Latch的外信号输入)相区别。
LAT
的地址=F80H;
PORTA的地址=F92H。
端口结构图
2017/8/29 17
端口结构小结

1.
每一个端口都对应三个地址: 数据端口PORT x : 输入输出Latch地址。 注意:在端口内部输出与输入对应着两个锁存器: Out Data Latch ----- 输出数据的锁存器; Input Data Latch ----- 输入数据的锁存器。 但他们都具有相同的地址:如 MOVWF PORTA 利用输出锁存器输出数据; MOVF PORTA,W 通过输入锁存器读取引脚信号。 两者是靠指令的性质(输入/输出)来自动选择的。
端口结构图
2017/8/29
16

5 检查端口的输出数据。(RD LAT)
端口做输出时的“回馈 ”操作,可以称之为“准输 入 ”。与真正的输入的区别是:回送前次输出数据的状 态,而不是端口的引脚电平信号。

注意:尽管在物理结构上 RD LAT 的操作与端口输出时 WR PORT 是同一个锁存器,但是两种操作: MOVF LATA,W

端口A: 7位并行端口(引脚:RA0~RA6); 端口地址(SFR): PORTA:F80H; I/O引脚 第二功能 TRISA: F92H; RA0 AN0 / CAREF LATA: F89H。 RA1 AN1 / 端口的第二功能: RA2 AN2 / VREFADC电路的模拟 RA3 AN3 / VREF+ 输入引脚等。
如: MOVF MOVF LATA,W PORTA,W ;回读Out Data Latch 数据 ;输入PORTA的引脚信号

PIC单片机原理及应用(第三版)(上)

PIC单片机原理及应用(第三版)(上)
F877程序存储器具有13位宽的程序计数器PC。PC指针所产生的13位地址最大可寻址的程 序存储器空间为8K,相应的地址编码范围为0000H~lFFFH。
F877归属于中档单片机,其指令字节宽度为14位,内部构架配置了8K ╳ l4位的闪烁 FLASH程序存储器。
一般将整个程序存储器以2KB为单位进行分页(PAGE),如图2-1所示F877单片机,8KB程序 存储器共分作4页,分别称为“页0”、“页l”、“页2”和“页3”。 程序计数器高8位 PCLATH的Bit4-Bit3位构成程序存储器分页的选择位,对应的地址空间如下:
所谓互为映射就是说,在4个体内的相同位置,物理上对应同一个寄存器单元,所以该单元 具备4个不同的地址。
2.3.1 通用寄存器
01Fh 020h
09Fh 0A0h
11Fh 120h
19Fh 1A0h
GPRs
GPRs
GPRs
GPRs
07Fh RP<1:0> RP<1:0>
= 00
0F0h 0FFh RP<1:0>
= 01
170h 17Fh RP<1:0>
= 10
1F0h 1FFh = 11
互相映射
有些寄存器单元在4个体上是互相映射的,如状态寄存器STATUS、间接寻址寄存器INDF、程 序计数器低8位PCL、文件选择寄存器FSR、程序计数器高8位PCLATH和中断控制寄存器INTCON。
利用单片机串行总线端口可以方便而灵活地扩展外围器件,目前已在许多电子产品中得到广 泛应用。
1.2.2 PIC16F877单片机的结构 从其执行功能考虑,可以将单片机分成两大组件,即内部核心模块和外围功能模块
1.2.3 PIC16F877单片机的引脚

北京理工大学PIC单片机实验一PIC单片机集成开发环境MPLAB IDE的使用

北京理工大学PIC单片机实验一PIC单片机集成开发环境MPLAB IDE的使用

实验一 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 安装目录中头文件和函数库子目录的路径。

PIC18系列单片机原理及实践

PIC18系列单片机原理及实践
PIC18系列单片机原理及 实践
PIC18系列单片机是一种非常常用的微控制器,本课程将通过理论与实践相 结合的方式,详细介绍该系列单片机的原理和应用。
PIC18单片机系列概述
PIC18单片机系列广泛应用于嵌入式系统,具有强大的处理能力和丰富的外设功能。本节课将介绍其特 点、应用领域和优势。
强大的处理能力
2
对电流、电压和功率的控制。
PIC18单片机可以通过PWM输出来控
制LED的亮度,实现动态调节效果。
3
电机速度控制
利用PWM输出可以控制电机的转速, 实现精确的速度控制。
定时器与中断的应用
定时器和中断是PIC18单片机重要的功能模块。本节课将介绍定时器的原理和中断的应用方法。
定时器 中断ቤተ መጻሕፍቲ ባይዱ
通过定时器模块可以实现精确的时间计量和延 时控制。
1
需求分析
明确系统的功能需求和性能指标。
硬件设计
2
选择适合的单片机和外围电路,并进
行电路设计。
3
软件设计
编写单片机的程序代码,实现系统的
系统集成
4
功能。
将硬件和软件部分进行整合,并进行 调试和测试。
开发工具的选择与环境配置
选择合适的开发工具和环境对于单片机开发非常重要。本节课将介绍开发工具的选择准则和环境配置的 步骤。
2 汇编语言
更接近硬件,可以对单片机进行更细致的控制,适合对性能要求较高的应用。
I/O口及外设的应用方法
通过I/O口和外围设备,PIC18单片机可以与外部世界进行信息交互。本节课将介绍I/O口的基本原理和 外设的应用方法。
I/O口基本原理
外设的应用方法
I/O口用于输入和输出数字信号, 通过设置和读取I/O口寄存器来 实现。

PIC单片机实验

PIC单片机实验

15
2、在上面程序基础上修改程序,要求: – 定时时间为1秒 – 根据不同的时间级别分别在LED上点灯,如: 第1个红灯表示1秒时间到 第2个红灯表示10秒时间到 第3个红灯表示100秒时间到 – 调试程序,在实验板运行
16
综合实验选题
17
一、2路抢答器
1、设计要求
• 单片机的18、23引脚为输入口,接抢答按键开关S6、S7
练习二:按键实验
① 要求能够读取连接在RE8端口的按键状态,判断按键是否按下, 如果按键按下,则点亮RE0相连的LED。 ② 修改程序,如果按键按下,点亮RE0-RE5相连的LED,使其按照二 进制显示按键按下的次数。
8
练习三:液晶显示器实验(选做)
① 查看原理图了解硬件连接方式,读懂程序构架 ② 调试运行程序,在LCD上显示
10
练习二:按键实验
#include "p30f4011.h” int main() { unsigned int led = 0x0000; unsigned long int i = 0; while(1) { TRISE = 0x0100; //将RE0-RE7配置为输出,RE8配置为输入 if ((PORTE&0x0100)==0x0000) //查询S8是否按下 { for (i=0;i<1000;i++){} //延时消抖 if ((PORTE&0x0100)==0x0000) //再次查询S8是否按下 led = led+1; } PORTE =led; } return 0; }
11
实验三、中断实验
一、实验目的
实验三的主要目的是进一步了解掌握PIC单片机的结构和中断功能,学习

PIC实验报告(中断、定时、PWM、AD程序代码)

PIC实验报告(中断、定时、PWM、AD程序代码)

实验一:定时器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单片机实验报告引言:PIC单片机是一种非常常见的嵌入式系统开发工具,被广泛应用于电子产品的设计与制造过程中。

本实验报告将介绍我对PIC单片机的实验研究,并分享实验过程中的收获和心得体会。

实验一:LED灯的控制在本实验中,我使用PIC单片机来控制一组LED灯的亮灭。

通过编程,我成功实现了按键控制LED灯的开关,以及通过定时器实现LED灯的闪烁效果。

这个实验让我初步了解了PIC单片机的编程方法和基本原理。

实验二:温度传感器的应用在这个实验中,我将PIC单片机与温度传感器连接,并通过编程实现了温度的实时监测和显示。

通过这个实验,我深入了解了模拟信号的采集和数字信号的处理过程,并学会了如何使用PIC单片机进行数据的读取和处理。

实验三:蜂鸣器的控制本实验中,我使用PIC单片机控制了一个蜂鸣器的发声。

通过编程,我实现了不同频率的声音输出,并且可以通过按键控制声音的开关。

这个实验让我了解了如何通过PIC单片机来控制外部设备,并且学会了如何利用定时器来产生不同频率的方波信号。

实验四:液晶显示屏的应用在这个实验中,我将PIC单片机与液晶显示屏连接,并通过编程实现了文字和图形的显示。

通过这个实验,我学会了如何使用PIC单片机来控制液晶显示屏,并且了解了液晶显示屏的基本原理和工作方式。

实验五:无线通信模块的应用在本实验中,我将PIC单片机与无线通信模块连接,并通过编程实现了两个PIC 单片机之间的无线数据传输。

通过这个实验,我了解了无线通信模块的基本原理和工作方式,并学会了如何使用PIC单片机进行无线通信的应用。

结论:通过对PIC单片机的实验研究,我深入了解了PIC单片机的工作原理和应用方法。

通过编程和实践,我成功实现了LED灯的控制、温度传感器的应用、蜂鸣器的控制、液晶显示屏的应用以及无线通信模块的应用。

这些实验不仅让我掌握了PIC单片机的基本编程技巧和应用方法,还培养了我对嵌入式系统开发的兴趣和能力。

PIC18F452单片机原理及编程实践(第一章)PIC微控制器的历史和特征

PIC18F452单片机原理及编程实践(第一章)PIC微控制器的历史和特征
2017/8/29 2
Microchip 公司简介

1990年Microchip 公司在世界同行排名第20名;
2003年6月“市场研究公司——Gartner Dataquest‖ 的“2002年单片机 市场份额和单位出货量”报告指出: Microchip 公司8位机已跃居全球第 一,占全球市场的16.1%;


2017/8/29
3
第一章 PIC微控制器的历史和特征

1989年Microchip公司开发了一种8位的微控制器: PIC(Peripheral Interface Controler ——— 外围接口控制器);

将少量的RAM、ROM、一个定时器和一些I/O端口全 部集成在一个8脚的芯片上;
1.
2017/8/29 6
计算机/单片机系统的构成

一个计算机系统是由“硬件系统”和“应用软件”组成; 硬件系统主要包括: CPU--中央处理器:执行指令的机构; 存储器:包含程序存储器ROM和数据存储器; I/O --- 输入输出端口:CPU与外部器件的数据通道; 中断系统:高效处理外部器件服务请求的硬件逻辑;


2017/8/29
5
了解几个单片机的名词
CPU:中央处理器(),执行指令的机构; 2. RAM:随机存储器();存数程序的中间、结果数据; 3. ROM:只读存储器();存储程序或常数; 4. Bit:二进制数据的“位”; 5. 字节:数据/指令的宽度,由8bit或16bit组成; 6. 8位单片机:指可直接处理8位数据的单片机; 7. 立即数:存在于指令中的原始数据; 8. 寄存器:用于暂存数据的存储单元(是RAM的一部分); 9. 指 令:控制CPU的代码(存放于ROM中); 10. 程 序:实现某一功能的指令序列;

三.PIC单片机应用实例

三.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单片机的原理和应用一、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单片机在工业自动化领域中得到了广泛应用。

它们可以用于控制生产线上的设备、监测温度、湿度、压力等参数,并根据需要进行相应的控制和调节。

2015-PIC单片机原理及应用(2)

2015-PIC单片机原理及应用(2)

第2节 中断
主要内容
中断介绍
中断控制方法 中断应用举例 外部中断实验
2.1 中断介绍
1. 中断 中断是指在程序运行过程中,当出现情况时,CPU暂 时停止当前程序的执行,转而执行处理新情况的过程叫做 中断。 简单来说:中断是一种发生了一个外部的事件时调用 相应的处理程序的过程。 2.中断源 引起中断的原因,或能够发出中断请求信号的来源统 称为中断源。
四. 实验步骤 (1)连接在线调试器PICkit3、APP009实验板和计算机; (2)打开MPLAP IDE集成开发环境软件,点击Debugger>Select Tools>PICkit 3 选择调试工具; (3)点击Debugger>Settings,在Settings窗口中点击Power栏,选择 由PICkit3向实验板供电; (4)完成实现发光LED灯闪烁实验; (5)完成实现流水灯或花样彩灯实验; (6)完成实现按按键加1计数实验。 五. 实验报告内容与要求 (1)简述3个实验任务的程序设计方法; (2)分析观察到的实验结果; (3)分析PIC单片机IO端口输入与输出操作的不同之处。

NSTDIS位:中断嵌套禁止位(INTCON1<15>)。默认为0;该位置1,则
禁止中断嵌套,即如果正在处理一个中断,将禁止处理新的中断,即使
新中断的优先级比当前正在处理的中断优先级高。 ALTIVT位:使能备用中断向量表位。使用标准向量表时该位置0(默
认);使用备用向量表时该位置1 。
INT2EP- INT0EP位:外部中断边沿检测极性选择位。该位置1,是来负 边沿时产生中断;该位置0(默认),是来正边沿时产生中断
软件分析:
(1)RE8管脚对应的寄存器及对应位 – 方向控制寄存器TRISE的 TRISE8位; – LATE寄存器的 LATE8位; – PORTE寄存器的 RE8位; (2)控制步骤: – TRISE寄存器的TRISE8位置1,设置RE8为数据输入端口; TRISE0-RISE5位置0,设置RE0-RE5为输出端口,即为0x0100。 – 读PORTE寄存器的RE8位, 判断RE8输入的电平,判断按键是 否按下(按下时读入为0); – 计数值+1,并写入寄存器LATE,二进制计数值通过RE0-RE5 端口输出给D1-D6。

PIC系列单片机应用设计与实例

PIC系列单片机应用设计与实例

PIC系列单片机应用设计与实例1.温度测量与控制系统温度测量与控制系统常用于温度控制领域,如空调、温室、温度仪器等。

通过使用PIC单片机与温度传感器,可以实时测量环境温度,并通过控制输出端口控制温度设备,实现温度的自动调节。

例如,当温度超过设定值时,PIC单片机会发送控制信号给空调,使其开启或关闭,以保持温度在合适的范围内。

2.电子秤电子秤已经成为了我们日常生活中常见的电子设备。

使用PIC单片机可以实现电子秤的设计与制造。

通常,电子秤采用称重传感器来检测物体的重量,并通过PIC单片机的模拟输入端口接收称重传感器的信号。

通过编程,PIC单片机可以将模拟信号转换为数字信号,并进行处理,最后将数据显示在数码管或液晶显示器上。

3.智能家居控制系统智能家居控制系统可以将家居设备集成到一个统一的平台中,通过使用PIC单片机与传感器、开关等设备进行连接与控制。

例如,可以通过控制面板或手机应用程序来实现对灯光、电器设备、窗帘等的控制。

PIC单片机可以接收来自传感器的反馈信号,并根据设定的条件来执行相应的控制操作。

4.汽车电子系统在现代汽车中,PIC单片机广泛应用于各种电子系统中。

例如,车载信息娱乐系统(IVI)可以通过PIC单片机来控制音频、视频、导航等功能。

车身电子控制系统(Body Electronics Control,BEC)可以通过PIC单片机来控制车门、窗户、空调等设备。

发动机控制系统(Engine Control Unit,ECU)则可以通过PIC单片机来实现对发动机的控制与监测。

综上所述,PIC系列单片机在各个领域都有着广泛应用。

通过编程和硬件设计,可以实现各种功能,如温度测量与控制、电子秤、智能家居控制、汽车电子系统等。

这些应用设计与实例不仅展示了PIC单片机的强大功能和灵活性,同时也为我们带来了更加智能化和便捷化的生活方式。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《单片机原理及应用》实验指导书适用年级: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 键盘控制实验实验目的:熟悉键盘矩阵的扫描方法程序中先不考虑做按键去抖,也先不考虑多个键同时按下的情况。

相关文档
最新文档