单片微机原理与接口技术实验指导(ok)

更新时间:2024-01-19 05:19:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

单片微机原理与接口技术实验指导

实验一 用户程序的编辑、编译与仿真调试

1. 实验目的

(1)学会给keil C集成开发环境添加STC系列单片机型号、头文件以及在线仿真驱动数据库。 (2)学会用keil C集成开发环境编辑、编译用户程序,并生成用户程序的机器代码。 (3)学会用keil C集成开发环境模拟仿真调试用户程序。

2. 预习与思考 预习3.1节内容,并根据实验内容制定好实验步骤。

3. 实验电路原理及硬件连线

本实验只需PC机和keil C集成开发环境工具,无须其它硬件电路。 2. 4. 实验内容 (1)实验程序功能与参考程序

本实验程序功能是一流水灯控制,控制信号从P1口输出,低电平驱动,轮流点亮P1控制的LED灯,时间间隔为1s,参考程序如下:

#include //STC15系列单片机头文件 #include

#include //I/O初始化文件,详见附录六 #define uchar unsigned char #define uint unsigned int uchar x=0xfe;

/*---------1000ms延时函数,从STC-ISP工具中获得---------*/ void Delay1000ms() //@11.0592MHz { unsigned char i, j, k; _nop_(); _nop_(); i = 43; j = 6; k = 203; do {

1

do { while (--k); } while (--j); } while (--i); }

/*------------主函数---------------*/ void main(void) { GPIO(); while(1) { P1=x;

Delay1000ms(); x=_crol_(x,1);

} } (2)用Keil ?Vision2开发工具输入、编辑与编译上述实验程序,并生成该程序的机器代码。 (3)用Keil ?Vision2开发工具的软件模拟仿真功能调试本实验程序。

5. 程序调试及效果分析 (1)从项目文件夹中,查看生成的机器代码,默认情况下,其默认文件名取决于哪里。 (2)用Keil ?Vision2开发工具的软件模拟仿真功能调试本实验程序的效果。

6. 实验报告要求 (1)总结给Keil ?Vision2开发工具添加STC系列单片机型号、头文件以及STC在线仿真驱动数据库的方法。 (2)总结应用Keil ?Vision2开发工具编辑、编译用户程序,生成用户程序机器代码的操作步骤。

2

实验二 用户程序的在线编程与在线仿真

1. 实验目的 (1) 理解STC单片机与PC机USB接口的通信线路及学会加载USB转串口的驱动程序。 (2)学会用STC-ISP在线编程工具给单片机加载用户程序与在系统调试。 (3)学会应用Keil ?Vision4开发工具与STC15实验板进行用户程序的在线仿真调试。

2. 预习与思考 (1)预习3.2节内容,理解STC单片机与PC机USB接口的通信线路,以及加载USB转串口驱动程序的方法。 (2)预习3.2节内容,掌握用STC_ISP在线编程工具下载用户程序的方法。 (3)预习3.2节内容,掌握STC单片机在线仿真的方法,包括如何设置仿真芯片以及Keil ?Vision4开发工具在线硬件仿真的设置。

(4)分析demo.c的程序功能。 3. 实验参考程序(demo.c) #include #include #include

#define uchar unsigned char #define uint unsigned int

/*---------1ms延时函数,从STC-ISP工具中获得---------*/ void Delay1ms() //@11.0592MHz { unsigned char i, j; _nop_(); _nop_(); _nop_(); i = 11; j = 190; do { while (--j); } while (--i); }

/*------------xms延时函数---------------*/ void delay(uint x) //@11.0592MHz

3

{ uint i; for(i=0;i

/*------------主函数---------------*/ void main(void) { GPIO(); while(1) { P17 = 0; delay(1000); P17 = 1; P16 = 0; delay(1000); P16 = 1; P47 = 0; delay(1000); P47 = 1; P46 = 0; delay(1000); P46 = 1; } }

4. 实验电路原理及硬件连线

本实验基于STC15开发板上实施,硬件线路包括STC单片机与PC机USB接口的通信线路,以及LED7、LED8、LED9、LED10等LED灯。

5. 实验内容 (1)用Keil ?Vision2开发工具编辑、编译demo.c程序,并生成机器代码。 (2)用STC_ISP在线编程工具给STC15单片机开发板下载用户程序,运行用户程序,验证程序功能是否符合程序要求。 (3)应用Keil ?Vision2开发工具与STC15实验板进行用户程序的在线仿真调试,验证程序功能是否符合程序要求。

6. 程序调试及效果分析 (1)在系统调试,分析程序运行效果。 (2)在线仿真调试,分析程序运行效果。

4

7. 实验报告要求

(1)总结STC单片机在线编程的操作步骤与在系统调试方法。 (2)总结STC单片机在线仿真方法。

(3)总结STC单片机在线仿真有什么优势?

5

实验三 IAP15W4K58S4单片机外部中断的应用编程与调试

1. 实验目的 (1)进一步掌握中断技术的原理。 (2)掌握外部中断触发方式的设置与应用编程。

2. 预习与思考 预习7.1~7.3节内容,分析INT01.ASM与int01.c,根据程序功能制定程序调试方案。 3. 实验参考程序

(1)INT01.ASM

$include(stc15.inc) ;STC15新增特殊功能寄存器的定义文件,详见附录六 ORG 0000H LJMP MAIN ORG 0003H LJMP INT0_ISR ORG 0013H LJMP INT1_ISR MAIN: LCALL GPIO ;调用初始化程序 SETB IT0 SETB IT1 SETB EX0 SETB EX1 SETB EA SJMP $ INT0_ISR: CPL P1.7 RETI INT1_ISR: CPL P4.7 RETI

$include(gpio.inc) ;STC15 I/O口的初始化文件 END

(2)int01.c

#include //包含支持IAP15W4K58S4单片机的头文件 #include #include //I/O初始化文件

6

#define uchar unsigned char #define uint unsigned int void ex01_init() { IT0=1; IT1=1; EX0=1; EX1=1; EA=1; }

void main() { GPIO(); ex01_init(); while(1); }

void int0_isr() interrupt 0 { P17=~P17; }

void int1_isr() interrupt 2 { P47=~P47; }

4. 实验电路原理及硬件连线

基于STC15单片机开发板实施,采用LED7、LED9显示,采用SW17、SW18输入外部中断0和外部中断1中断请求信号。

5. 实验内容 (1)完成INT01.ASM程序的编辑、编译与调试。 (2)完成int01.c程序的编辑、编译与调试。

6. 程序调试及效果分析 (1)调试INT01.ASM程序,记录与分析程序运行效果。 (2)调试int01.c程序,记录与分析程序运行效果。

7. 实验报告要求 (1)总结外部中断的触发方式设置与工作特点。 (2)总结按键输入外部中断请求信号存在的问题与解决方法。

7

实验四 IAP15W4K58S4单片机定时器/计数器定时功能的应用编程与调试

1. 实验目的 (1)进一步掌握IAP15W4K58S4单片机定时器/计数器的电路结构与工作原理。 (2)掌握IAP15W4K58S4单片机定时器/计数器定时功能的应用编程。

2. 预习与思考 (1)预习8.1~8.3节内容,掌握IAP15W4K58S4单片机定时器/计数器TMOD、TCON的设置与应用编程。 (2)预习8.4节内容,分析参考程序FLASH.ASM与flash.c。

3. 实验参考程序 (1)FLASH.ASM

$include(stc15.inc) ;STC15新增特殊功能寄存器的定义文件 ORG 0000H LJMP MAIN ORG 001BH LJMP T1_ISR MAIN: LCALL GPIO ;调用初始化程序 MOV R3,#20 ;置50ms计数循环初值 MOV TMOD,#00H ;设定时器1为方式0定时 MOV TH1,#3CH ;置50ms定时器初值 MOV TL1,#0B0H SETB ET1 ;开放T1中断 SETB EA SETB TR1 ;启动T1 SJMP $ ;原地踏步 T1_ISR: DJNZ R3,T1_QUIT ;未到1s继续循环 MOV R3, #20 CPL P1.6 CPL P1.7 CPL P4.6 CPL P4.7 T1_QUIT: RETI

8

$include(gpio.inc) ;STC15 I/O口的初始化文件 END

(2)Flash.c

#include //包含支持IAP15W4K58S4单片机的头文件 #include

#include //I/O初始化文件 #define uchar unsigned char #define uint unsigned int uchar i = 0; void main(void) { GPIO(); //初始化函数 TMOD=0x00; TH1=0x3c; TL1=0xb0; ET1=1; EA=1; TR1=1; while(1); }

void T1_isr() interrupt 3 { i++; if(i==20) { i=0; P16=~P16; //LED灯的驱动取反输出 P17=~P17; P46=~P46; P47=~P47; } }

4. 实验电路原理及硬件连线

基于STC15开发板,采用数码管显示秒表值。 5. 实验内容

完成SECOND.ASM与second.c程序的编辑、编译与调试。 6. 程序调试及效果分析 (1)调试SECOND.ASM程序,观察与记录程序运行结果。

9

(2)调试second.c程序,观察与记录程序运行结果。 7. 实验报告要求 (1)以IAP15W4K58S4单片机定时器/计数器方式0的电路结构,分析IAP15W4K58S4单片机定时器/计数器的工作原理。 (2)分析FLASH.ASM.ASM与flash.c的程序功能。

10

实验五 IAP15W4K58S4单片机双机通信的应用编程与调试

1. 实验目的

(1)巩固串行通信的基本概念与基本知识。

(2)掌握IAP15W4K58S4单片机串行口1工作方式的设置与应用编程。 2. 预习与思考

(1)预习9.1节内容,掌握串行通信的基本知识。

(2)预习9.2节内容,掌握IAP15W4K58S4单片机串行口1的工作方式与应用编程。 (3)分析例参考程序UART.ASM与uart.c,根据程序功能制定程序的调试方案。 3. 实验电路原理及硬件连线 (1)UART.ASM

$include(stc15.inc) ;STC15新增特殊功能寄存器的定义文件,详见附录六 ORG 0000H LJMP MAIN ORG 0023H LJMP S_ISR MAIN: LCALL GPIO LCALL UARTINIT SETB ES SETB EA ORL P3,#00001100B LOOP: MOV A, P3 ANL A, #00001100B MOV SBUF, A JNB TI, $ CLR TI LCALL DELAY100MS ;设置发送间隔 SJMP LOOP S_ISR: PUSH ACC JNB RI, S_QUIT CLR RI MOV A, SBUF ANL A, #00001100B CJNE A, #00H, NEXT1

11

CLR P1.7 SETB P1.6 SETB P4.7 SETB P4.6 SJMP S_QUIT NEXT1: CJNE A, #04H, NEXT2 SETB P1.7 CLR P1.6 SETB P4.7 SETB P4.6 SJMP S_QUIT NEXT2: CJNE A, #08H, NEXT3 SETB P1.7 SETB P1.6 CLR P4.7 SETB P4.6 SJMP S_QUIT NEXT3: SETB P1.7 SETB P1.6 SETB P4.7 CLR P4.6 S_QUIT: POP ACC RETI UARTINIT: ;9600bps@11.0592MHz,从STC-ISP工具中获得 MOV SCON,#50H ;8位数据,可变波特率 ORL AUXR,#40H ;定时器1时钟为Fosc,即1T ANL AUXR,#0FEH ;串口1选择定时器1为波特率发生器 ANL TMOD,#0FH ;设定定时器1为16位自动重装方式 MOV TL1,#0E0H ;设定定时初值 MOV TH1,#0FEH ;设定定时初值 CLR ET1 ;禁止定时器1中断 SETB TR1 ;启动定时器1 RET

DELAY100MS: ;@11.0592MHz ,从STC-ISP工具中获得 NOP

12

NOP NOP PUSH 30H PUSH 31H PUSH 32H MOV 30H,#4 MOV 31H,#93 MOV 32H,#152 NEXT: DJNZ 32H,NEXT DJNZ 31H,NEXT DJNZ 30H,NEXT POP 32H POP 31H POP 30H RET

$include(gpio.inc) ;STC15 I/O口的初始化文件 END (2)uart.c

#include //包含支持IAP15W4K58S4单片机的头文件 #include #include //I/O初始化文件 #define uchar unsigned char #define uint unsigned int uchar temp; uchar temp1;

void Delay100ms() //@11.0592MHz { unsigned char i, j, k; _nop_(); _nop_(); i = 5; j = 52; k = 195; do { do {

13

while (--k); } while (--j); } while (--i); }

void UartInit(void) //9600bps@11.0592MHz { SCON = 0x50; //8位数据,可变波特率 AUXR |= 0x40; //定时器1时钟为Fosc,即1T AUXR &= 0xFE; //串口1选择定时器1为波特率发生器 TMOD &= 0x0F; //设定定时器1为16位自动重装方式 TL1 = 0xE0; //设定定时初值 TH1 = 0xFE; //设定定时初值 ET1 = 0; //禁止定时器1中断 TR1 = 1; //启动定时器1 }

void main() { GPIO(); UartInit(); ES=1; EA=1; while(1) { temp=P3; temp=temp&0x0c; SBUF=temp; while(TI==0); TI=0; Delay100ms(); } }

void uart_isr() interrupt 4 { if(RI==1) { RI=0; temp1=SBUF; switch(temp1&0x0c) {

14

case 0x00:P17=0;P16=1;P47=1;P46=1;break; case 0x04:P17=1;P16=0;P47=1;P46=1;break; case 0x08:P17=1;P16=1;P47=0;P46=1;break; default:P17=1;P16=1;P47=1;P46=0;break; } } }

4. 实验电路原理及硬件连线

基于STC15单片机开发板实施,采用LED7~LED10采用,采用SW17、SW18输入控制信号。甲机的P3.0与乙机的P3.1相连,甲机的P3.1与乙机的P3.0相连,甲机的地线与乙机的地线相连。

5. 实验内容 (1)完成UART.ASM程序的编辑、编译与调试。 (2)完成uart.c程序的编辑、编译与调试。

(3)改用串行口2实现双机通信,试编写程序并调试。 6. 程序调试及效果分析 (1)调试UART.ASM程序,改变甲机SW17、SW18的输入状态,观察乙机LED7~LED10的状态,并记录与分析;反之,改变乙机SW17、SW18的输入状态,观察甲机LED7~LED10的状态,并记录与分析。 (2)调试uart.c程序,改变甲机SW17、SW18的输入状态,观察乙机LED7~LED10的状态,并记录与分析;反之,改变乙机SW17、SW18的输入状态,观察甲机LED7~LED10的状态,并记录与分析。

(3)调试用串行口2实现双机通信的程序。 7. 实验报告要求 (1)总结串行口1的工作方式与工作特性。

(2)双机通信的调试结果与分析。 (3)用串行口2实现双机通信,画出用串行口实现双机通信的电路图,列出实验程序与调试记录,分析调试结果。

15

实验六 IAP15W4K58S4单片机AD转换模块的应用编程与调试

1. 实验目的

(1)掌握IAP15W4K58S4单片机AD转换模块的编程应用。

(2)通过实验理解IAP15W4K58S4单片机AD转换模块如何进行数据采集,如何实现模拟量到数字量的转换。

(3)了解IAP15W4K58S4单片机AD转换模块在各种领域的应用。 2. 预习与思考

(1)复习IAP15W4K58S4单片机AD转换模块的结构以及寄存器的控制使用。

(2)复习IAP15W4K58S4单片机8位或10位AD转换结果在两种不同存储格式下分别的计算方法。

(3)复习IAP15W4K58S4单片机AD转换模块的应用编程要点与思路,分析ad.c程序的功能。

3. 实验参考程序(ad.c)

#include #include #include

//I/O初始化文件

#define uchar unsigned char #define uint unsigned int #include <595hc.h> uint adc_value; void main(void) {

uint i;

//定义整型变量i用于适当延时

//打开A/D转换电源 //适当延时

//设置ADC1(P1.1)为模拟量输入功能 //ADRJ=1,设置A/D转换结果的存储格式

//选择选择输入通道ADC1(P1.1)并启动A/D转换 //打开ADC中断 //打开CPU总中断

ADC_CONTR|=0x80; for(i=0;i<1000;i++); P1ASF=0x02;

CLK_DIV|=0x20; EADC=1; EA=1; while(1) {

Dis_buf[7]= adc_value; //秒值送显示缓冲区 Dis_buf[6]= adc_value/10;

Dis_buf[7]= adc_value/100; //秒值送显示缓冲区 Dis_buf[6]= adc_value/1000;

display(); // 调显示函数

16

//定义无符号字符型变量adc_value用于保存ADC值

//主程序

//包含支持IAP15W4K58S4单片机的头文件

ADC_CONTR=0x89;

}

void ADC_int(void) interrupt 5 //ADC中断服务子程序 { }

ADC_CONTR=0x81; ADC_CONTR=0x89;

//将ADC_FLAG清0

//保存10位A/D转换结果,范围为0~1023

//重新启动A/D转换

adc_value= ADC_RES*256+ADC_RESL; }

4. 实验电路原理及硬件连线

将STC15实验板W1电位器的中间抽头(P5.5)接AD转换的输入端P1.1,转换后结果送数码管显示(0~1023)。

5. 实验内容

(1)完成ad.c程序的编辑、编译与调试。

(2)如果AD模块采用查询方式进行转换,编写程序并验证效果。 (3)如果AD模块采用定时方式进行转换,编写程序并验证效果。 6. 程序调试及效果分析

(1)通过编译软件keil编写源程序代码,编译通过没有错误,生成十六进制目标文件。 (2)通过STC单片机下载软件STC-ISP将十六进制目标文件下载到STC学习板的单片机芯片IAP15W4K58S4,验证实验效果。

(3)调节W1,观察数码管的显示值并记录。 7. 实验报告要求

(1)总结IAP15W4K58S4单片机AD转换模块的软、硬件设计原理与方法;

(2)写出所作实验程序的源代码,给每行语句加上详细的注释,在预习报告的基础上完善程序流程图;

(3)叙述程序调试过程中遇到的问题以及解决方法,写出本次实验的收获和心得体会。

17

实验七 键盘与数码LED显示接口的应用编程与调试

1. 实验目的

(1)掌握独立按键的编程应用。 (2)掌握数码管的编程应用。 2. 预习与思考

(1)预习13.2.1内容。

(2)预习13.2.1、13.2.3内容。 (4)画出独立按键电路原理图。

(5)画出串行数据动态扫描数码管显示电路原理图。

(6)分析595hc.h头文件(见附录)和key-display.c的程序功能。 3. 实验参考程序(key-display.c)

#include \#include \#include

#define uchar unsigned char

#include \包含数码管显示头文件 sbit SW17 = P3^2; sbit SW18 = P3^3; { }

void main(void) {

signed int i=0; //为了i能小于0,定义i为有符号变量,初始值0 GPIO(); while(1) {

if(SW17==0) {

Delay(10000); //按键消抖 if(SW17==0) {

i--;

//变量i减1

//判断如果i小于0就回到99 //等待按键松开

18

if(i<0){i=99;} while(SW17==0);

//按键-

//初始化I/O端口为准双向口 //主程序

while(v!=0)

v--;

//定义按键- //定义按键+

//包含单片机头文件 //包含初始化I/O端口头文件

void Delay(unsigned int v)

}

}

}

if(SW18==0) { }

Dis_buf[6]=i/10;//数码管显示十位数据 Dis_buf[7]=i;//数码管显示个位数据 display();

Delay(10000); //按键消抖 if(SW18==0) { }

i++;

//变量i加1

//判断如果i大于99就回到0 //等待按键松开

if(i>99){i=0;} while(SW18==0);

//按键+

}

4. 实验电路原理及硬件连线

STC15学习板上已经连接好两个独立按键,分别是按键SW17(P3.2引脚)和按键SW18(P3.3引脚)。

硬件电路原理图参考STC15开发板电路图。图中由两片74HC595组成串行数据转并行数据驱动8位数码管显示。STC学习板上IAP15W4K58S4单片机P4.0引脚已经连接好74HC595的串行数据SER;P4.3引脚已经连接好74HC595的位同步脉冲输出SRCLK;P5.4引脚已经连接好74HC595的锁存脉冲输出RCLK。 5. 实验内容

(1)利用IAP15W4K58S4单片机设计两个独立按键SW17(P3.2)和SW18(P3.3),实现按下SW17使2位LED数码管显示的数字加1,按SW18显示的数字减1,当加1到最大值99后回到最小值0,当减1到最小值0后回到最大值99。单片机工作频率为12.0MHz。 (2)修改程序,实现当加1到最大值99后继续按键则保持最大值并给出报警,当减1到最小值0后继续按键保持最小值并给出报警。

(3)修改程序,实现按下按键SW17不松开可以连续减1,按下按键SW18不松开可以连续加1。

(4)修改程序,实现3位数0~999、4位数0~9999的显示。 (5)修改程序,实现数码管左边最高位是0时不显示。

(6)按下按键SW17,有时候显示可能不是减1,而是减2,同理按下按键SW18,有时候显示可能不是加1,而是加2,请分析是什么原因。 6. 程序调试及效果分析

(1)通过编译软件keil编写源程序代码,编译通过没有错误,生成十六进制目标文件。

19

(2)通过STC单片机下载软件STC-ISP将十六进制目标文件下载到STC学习板的单片机芯片IAP15W4K58S4,验证实验效果。

(3)程序对独立按键进行识别,并对变量加一或减一操作,通过数码管的显示可观察。 (4)修改C语言源程序里面相关参数,观察实验效果的变化。 7. 实验报告要求

(1)总结独立按键与LED数码管显示的软、硬件设计原理与方法;

(2)写出所作实验程序的源代码,给每行语句加上详细的注释,在预习报告的基础上完善程序流程图;

(3)叙述程序调试过程中遇到的问题以及解决方法,写出本次实验的收获和心得体会。

20

附录: 常用文件

说明:本附录中包好STC15系列单片机特殊功能寄存器定义的头文件(STC15.INC和stc15.h)、STC15单片机I/O的初始化文件(GPIO.INC、gpio.h)以及STC15实验板数码管的驱动函数(595HC.INC、595hc.h),其中STC15系列单片机特殊功能寄存器定义的头文件可利用STC-ISP在线编程软件获取。 一、汇编部分 1. STC新增特殊功能寄存器的定义文件(STC15.INC)

(1)程序文件说明:该文件包含STC15系列单片机新增特殊功能寄存器的地址定义,文件名称命名为:STC15.INC。

(2)程序清单

P4 DATA 0C0H ; 1111,1111 端口4 P5 DATA 0C8H ; xxxx,1111 端口5 P6 DATA 0E8H ; 0000,0000 端口6 P7 DATA 0F8H ; 0000,0000 端口7

P0M0 DATA 0x94 ; 0000,0000 端口0模式寄存器0 P0M1 DATA 093H ; 0000,0000 端口0模式寄存器1 P1M0 DATA 092H ; 0000,0000 端口1模式寄存器0 P1M1 DATA 091H ; 0000,0000 端口1模式寄存器1 P2M0 DATA 096H ; 0000,0000 端口2模式寄存器0 P2M1 DATA 095H ; 0000,0000 端口2模式寄存器1 P3M0 DATA 0B2H ; 0000,0000 端口3模式寄存器0 P3M1 DATA 0B1H ; 0000,0000 端口3模式寄存器1 P4M0 DATA 0B4H ; 0000,0000 端口4模式寄存器0 P4M1 DATA 0B3H ; 0000,0000 端口4模式寄存器1 P5M0 DATA 0CAH ; 0000,0000 端口5模式寄存器0 P5M1 DATA 0C9H ; 0000,0000 端口5模式寄存器1 P6M0 DATA 0CCH ; 0000,0000 端口6模式寄存器0 P6M1 DATA 0CBH ; 0000,0000 端口6模式寄存器1 P7M0 DATA 0E2H ; 0000,0000 端口7模式寄存器0 P7M1 DATA 0E1H ; 0000,0000 端口7模式寄存器1 ;系统管理特殊功能寄存器

AUXR DATA 08EH ; 0000,0000 辅助寄存器 AUXR1 DATA 0A2H ; 0000,0000 辅助寄存器1

P_SW1 DATA 0A2H ; 0000,0000 外设端口切换寄存器1 CLK_DIV DATA 097H ; 0000,0000 时钟分频控制寄存器 BUS_SPEED DATA 0A1H ; xx10,x011 总线速度控制寄存器

P1ASF DATA 09DH ; 0000,0000 端口1模拟功能配置寄存器 P_SW2 DATA 0BAH ; 0xxx,x000 外设端口切换寄存器

21

;中断特殊功能寄存器

IE2 DATA 0AFH ; 0000,0000 中断控制寄存器2 IP2 DATA 0B5H ; xxxx,xx00 中断优先级寄存器2

INT_CLKO DATA 08FH ; 0000,0000 外部中断与时钟输出控制寄存器 ;定时器特殊功能寄存器

T4T3M DATA 0D1H ; 0000,0000 T3/T4模式寄存器 T3T4M DATA 0D1H ; 0000,0000 T3/T4模式寄存器 T4H DATA 0D2H ; 0000,0000 T4高字节 T4L DATA 0D3H ; 0000,0000 T4低字节 T3H DATA 0D4H ; 0000,0000 T3高字节 T3L DATA 0D5H ; 0000,0000 T3低字节 T2H DATA 0D6H ; 0000,0000 T2高字节 T2L DATA 0D7H ; 0000,0000 T2低字节

WKTCL DATA 0AAH ; 0000,0000 掉电唤醒定时器低字节 WKTCH DATA 0ABH ; 0000,0000 掉电唤醒定时器高字节 WDT_CONTR DATA 0C1H ; 0000,0000 看门狗控制寄存器 ;串行口特殊功能寄存器

S2CON DATA 09AH ; 0000,0000 串口2控制寄存器 S2BUF DATA 09BH ; xxxx,xxxx 串口2数据寄存器 S3CON DATA 0ACH ; 0000,0000 串口3控制寄存器 S3BUF DATA 0ADH ; xxxx,xxxx 串口3数据寄存器 S4CON DATA 084H ; 0000,0000 串口4控制寄存器 S4BUF DATA 085H ; xxxx,xxxx 串口4数据寄存器 SADDR DATA 0A9H ; 0000,0000 从机地址寄存器 SADEN DATA 0B9H ; 0000,0000 从机地址屏蔽寄存器 ;ADC 特殊功能寄存器

ADC_CONTR DATA 0BCH ; 0000,0000 A/D转换控制寄存器 ADC_RES DATA 0BDH ; 0000,0000 A/D转换结果高8位 ADC_RESL DATA 0BEH ; 0000,0000 A/D转换结果低2位 ;SPI 特殊功能寄存器

SPSTAT DATA 0CDH ; 00xx,xxxx SPI状态寄存器 SPCTL DATA 0CEH ; 0000,0100 SPI控制寄存器 SPDAT DATA 0CFH ; 0000,0000 SPI数据寄存器 ;IAP/ISP 特殊功能寄存器

IAP_DATA DATA 0C2H ; 0000,0000 EEPROM数据寄存器 IAP_ADDRH DATA 0C3H ; 0000,0000 EEPROM地址高字节 IAP_ADDRL DATA 0C4H ; 0000,0000 EEPROM地址第字节 IAP_CMD DATA 0C5H ; xxxx,xx00 EEPROM命令寄存器 IAP_TRIG DATA 0C6H ; 0000,0000 EEPRPM命令触发寄存器

22

IAP_CONTR DATA 0C7H ; 0000,x000 EEPROM控制寄存器 ;PCA/PWM 特殊功能寄存器

CCON DATA 0D8H ; 00xx,xx00 PCA控制寄存器 CF BIT CCON.7 ; CR BIT CCON.6 ; CCF2 BIT CCON.2 ; CCF1 BIT CCON.1 ; CCF0 BIT CCON.0 ;

CMOD DATA 0D9H ; 0xxx,x000 PCA 工作模式寄存器 CL DATA 0E9H ; 0000,0000 PCA计数器低字节 CH DATA 0F9H ; 0000,0000 PCA计数器高字节

CCAPM0 DATA 0DAH ; 0000,0000 PCA模块0的PWM寄存器 CCAPM1 DATA 0DBH ; 0000,0000 PCA模块1的PWM寄存器 CCAPM2 DATA 0DCH ; 0000,0000 PCA模块2的PWM 寄存器

CCAP0L DATA 0EAH ; 0000,0000 PCA模块0的捕捉/比较寄存器低字节 CCAP1L DATA 0EBH ; 0000,0000 PCA模块1的捕捉/比较寄存器低字节 CCAP2L DATA 0ECH ; 0000,0000 PCA模块2的捕捉/比较寄存器低字节 PCA_PWM0 DATA 0F2H ; xxxx,xx00 PCA模块0的PWM寄存器 PCA_PWM1 DATA 0F3H ; xxxx,xx00 PCA模块1的PWM寄存器 PCA_PWM2 DATA 0F4H ; xxxx,xx00 PCA模块1的PWM寄存器

CCAP0H DATA 0FAH ; 0000,0000 PCA模块0的捕捉/比较寄存器高字节 CCAP1H DATA 0FBH ; 0000,0000 PCA模块1的捕捉/比较寄存器高字节 CCAP2H DATA 0FCH ; 0000,0000 PCA模块2的捕捉/比较寄存器高字节 ;比较器特殊功能寄存器

CMPCR1 DATA 0E6H ; 0000,0000 比较器控制寄存器1 CMPCR2 DATA 0E7H ; 0000,0000 比较器控制寄存器2 ;增强型PWM波形发生器特殊功能寄存器

PWMCFG DATA 0F1H ; x000,0000 PWM配置寄存器 PWMCR DATA 0F5H ; 0000,0000 PWM控制寄存器 PWMIF DATA 0F6H ; x000,0000 PWM中断标志寄存器

PWMFDCR DATA 0F7H ; xx00,0000 PWM外部异常检测控制寄存器 2. STC15W4K32S4系列单片机I/O端口初始化文件(GPIO.INC)

(1)程序文件说明:该文件对STC15系列单片机的I/O端口进行初始化,将I/O端口的状态设置为准双向口,文件名称命名为:GPIO.INC,初始化I/O程序的入口地址为GPIO。

(2)程序清单

GPIO: ;初始化I/O口 MOV P0M1,#0 MOV P0M0,#0

23

MOV P1M1,#0 MOV P1M0,#0 MOV P2M1,#0 MOV P2M0,#0 MOV P3M1,#0 MOV P3M0,#0 MOV P4M1,#0 MOV P4M0,#0 MOV P5M1,#0 MOV P5M0,#0 RET

3. STC15W4K32S4系列单片机学习板数码管驱动文件(595HC.INC)

(1)程序文件说明:该程序文件是数码管595芯片驱动程序,命名为:595HC.INC。显示缓冲区为30H~37H,30H是最高位,37H是最低位;显示子程序的入口地址为F_DisplayScan。

(2)程序清单

;************* IO口定义 **************/

P_HC595_SER BIT P4.0 ; pin 14 SER data input

P_HC595_RCLK BIT P5.4 ; pin 12 RCLk store (latch) clock P_HC595_SRCLK BIT P4.3 ; pin 11 SRCLK Shift data clock

; *********************** 显示相关程序 T_Display: ;标准字库

;0 1 2 3 4 5 6 7 8 9 A B C D E F

DB 03FH,006H,05BH,04FH,066H,06DH,07DH,007H,07FH,06FH,077H,07CH,039H,05EH,079H,071H

; black - H J K L N o P U t G Q r M y DB 000H,040H,076H,01EH,070H,038H,037H,05CH,073H,03EH,078H,03dH,067H,050H,037H,06EH T_COM:

DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH ; 位码 ; 函数: F_Send_595, 向HC595发送一个字节子程序

F_Send_595: PUSH 02H ;R2入栈 MOV R2, #8 L_Send_595_Loop: RLC A MOV P_HC595_SER,C

24

SETB P_HC595_SRCLK CLR P_HC595_SRCLK DJNZ R2, L_Send_595_Loop POP 02H ;R2出栈 RET

; 函数: F_DisplayScan, 显示扫描子程序

F_DisplayScan: PUSH DPH ;DPH入栈 PUSH DPL ;DPL入栈 PUSH 00H ;R0 入栈

PUSH 01H ;R1入栈 PUSH 02H ;R2入栈 PUSH ACC MOV R0,#30H MOV R1,#0 MOV R2,#8 F_DisplayScan_LOOP: MOV DPTR, #T_COM MOV A, R1 MOVC A, @A+DPTR INC R1 LCALL F_Send_595 ;输出位码 MOV DPTR, #T_Display MOV A, @R0 ;取显示缓冲区数据 INC R0 MOVC A, @A+DPTR ;取显示码 LCALL F_Send_595 ;输出段码 SETB P_HC595_RCLK CLR P_HC595_RCLK ; 锁存输出数据 LCALL DELAY1MS DJNZ R2, F_DisplayScan_LOOP L_QuitDisplayScan: POP ACC POP 02H ;R2 出栈 POP 01H ;R1 出栈 POP 00H ;R0 出栈 POP DPL ;DPL出栈 POP DPH ;DPH出栈 RET

25

DELAY1MS: ;@11.0592MHz PUSH 30H PUSH 31H MOV 30H,#9 MOV 31H,#150 NEXT: DJNZ 31H,NEXT DJNZ 30H,NEXT POP 31H POP 30H RET 二、C语言部分

1. STC15W4K32S4系列单片机特殊功能寄存器定义头文件(stc15.h)

(1)程序文件说明:该文件包含STC15系列单片机特殊功能寄存器及可寻址特殊功能寄存器位的地址定义,文件名称命名为:stc15.h。该文件程序可从STC-ISP工具中获得。

(2)程序清单

#ifndef __STC15F2K60S2_H_ #define __STC15F2K60S2_H_

//内核特殊功能寄存器 // 复位值 描述

sfr ACC = 0xE0; //0000,0000 累加器Accumulator sfr B = 0xF0; //0000,0000 B寄存器 sfr PSW = 0xD0; //0000,0000 程序状态字 sbit CY = PSW^7; sbit AC = PSW^6; sbit F0 = PSW^5; sbit RS1 = PSW^4; sbit RS0 = PSW^3; sbit OV = PSW^2; sbit P = PSW^0;

sfr SP = 0x81; //0000,0111 堆栈指针

sfr DPL = 0x82; //0000,0000 数据指针低字节 sfr DPH = 0x83; //0000,0000 数据指针高字节 //I/O 口特殊功能寄存器

sfr P0 = 0x80; //1111,1111 端口0 sbit P00 = P0^0; sbit P01 = P0^1; sbit P02 = P0^2; sbit P03 = P0^3; sbit P04 = P0^4;

26

sbit P05 = P0^5; sbit P06 = P0^6; sbit P07 = P0^7;

sfr P1 = 0x90; //1111,1111 端口1 sbit P10 = P1^0; sbit P11 = P1^1; sbit P12 = P1^2; sbit P13 = P1^3; sbit P14 = P1^4; sbit P15 = sbit P16 = sbit P17 = sfr P2 = sbit P20 = sbit P21 = sbit P22 = sbit P23 = sbit P24 = sbit P25 = sbit P26 = sbit P27 = sfr P3 = sbit P30 = sbit P31 = sbit P32 = sbit P33 = sbit P34 = sbit P35 = sbit P36 = sbit P37 = sfr P4 = sbit P40 = sbit P41 = sbit P42 = sbit P43 = sbit P44 = sbit P45 = sbit P46 = sbit P47 = P1^5; P1^6; P1^7;

0xA0; //1111,1111 端口2 P2^0; P2^1; P2^2; P2^3; P2^4; P2^5; P2^6; P2^7;

0xB0; //1111,1111 端口3 P3^0; P3^1; P3^2; P3^3; P3^4; P3^5; P3^6; P3^7;

0xC0; //1111,1111 端口4 P4^0; P4^1; P4^2; P4^3; P4^4; P4^5; P4^6; P4^7;

27

sfr P5 = 0xC8; //xxxx,1111 端口5 sbit P50 = P5^0; sbit P51 = P5^1; sbit P52 = P5^2; sbit P53 = P5^3; sbit P54 = P5^4; sbit P55 = P5^5; sbit P56 = P5^6; sbit P57 = P5^7;

sfr P6 sbit P60 sbit P61 sbit P62 sbit P63 sbit P64 sbit P65 sbit P66 sbit P67 sfr P7 sbit P70 sbit P71 sbit P72 sbit P73 sbit P74 sbit P75 sbit P76 sbit P77 sfr P0M0 sfr P0M1 sfr P1M0 sfr P1M1 sfr P2M0 sfr P2M1 sfr P3M0 sfr P3M1 sfr P4M0 sfr P4M1 sfr P5M0 sfr P5M1 = 0xE8; //0000,0000 端口6 = P6^0; = P6^1; = P6^2; = P6^3; = P6^4; = P6^5; = P6^6; = P6^7;

= 0xF8; //0000,0000 端口7 = P7^0; = P7^1; = P7^2; = P7^3; = P7^4; = P7^5; = P7^6; = P7^7;

= 0x94; //0000,0000 端口0模式寄存器0 = 0x93; //0000,0000 端口0模式寄存器1 = 0x92; //0000,0000 端口1模式寄存器0 = 0x91; //0000,0000 端口1模式寄存器1 = 0x96; //0000,0000 端口2模式寄存器0 = 0x95; //0000,0000 端口2模式寄存器1 = 0xB2; //0000,0000 端口3模式寄存器0 = 0xB1; //0000,0000 端口3模式寄存器1 = 0xB4; //0000,0000 端口4模式寄存器0 = 0xB3; //0000,0000 端口4模式寄存器1 = 0xCA; //0000,0000 端口5模式寄存器0 = 0xC9; //0000,0000 端口5模式寄存器1

28

sfr P6M0 = 0xCC; //0000,0000 端口6模式寄存器0 sfr P6M1 = 0xCB; //0000,0000 端口6模式寄存器1 sfr P7M0 = 0xE2; //0000,0000 端口7模式寄存器0 sfr P7M1 = 0xE1; //0000,0000 端口7模式寄存器1 //系统管理特殊功能寄存器

sfr PCON = 0x87; //0001,0000 电源控制寄存器 sfr AUXR = 0x8E; //0000,0000 辅助寄存器 sfr AUXR1 = 0xA2; //0000,0000 辅助寄存器1

sfr P_SW1 = 0xA2; //0000,0000 外设端口切换寄存器1 sfr CLK_DIV = 0x97; //0000,0000 时钟分频控制寄存器 sfr BUS_SPEED = 0xA1; //xx10,x011 总线速度控制寄存器

sfr P1ASF = 0x9D; //0000,0000 端口1模拟功能配置寄存器 sfr P_SW2 = 0xBA; //0xxx,x000 外设端口切换寄存器 //中断特殊功能寄存器

sfr IE = 0xA8; //0000,0000 中断控制寄存器 sbit EA = IE^7; sbit ELVD = IE^6; sbit EADC = IE^5; sbit ES = IE^4; sbit ET1 = IE^3; sbit EX1 = IE^2; sbit ET0 = IE^1; sbit EX0 = IE^0;

sfr IP = 0xB8; //0000,0000 中断优先级寄存器 sbit PPCA = IP^7; sbit PLVD = IP^6; sbit PADC = IP^5; sbit PS = IP^4; sbit PT1 = IP^3; sbit PX1 = IP^2; sbit PT0 = IP^1; sbit PX0 = IP^0;

sfr IE2 = 0xAF; //0000,0000 中断控制寄存器2 sfr IP2 = 0xB5; //xxxx,xx00 中断优先级寄存器2

sfr INT_CLKO = 0x8F; //0000,0000 外部中断与时钟输出控制寄存器 //定时器特殊功能寄存器

sfr TCON = 0x88; //0000,0000 T0/T1控制寄存器 sbit TF1 = TCON^7; sbit TR1 = TCON^6;

29

sbit TF0 = TCON^5; sbit TR0 = TCON^4; sbit IE1 = TCON^3; sbit IT1 = TCON^2; sbit IE0 = TCON^1; sbit IT0 = TCON^0;

sfr TMOD = 0x89; //0000,0000 T0/T1模式寄存器 sfr TL0 = 0x8A; //0000,0000 T0低字节 sfr TL1 = 0x8B; //0000,0000 T1低字节 sfr TH0 = 0x8C; //0000,0000 T0高字节 sfr TH1 = 0x8D; //0000,0000 T1高字节

sfr T4T3M = 0xD1; //0000,0000 T3/T4模式寄存器 sfr T3T4M = 0xD1; //0000,0000 T3/T4模式寄存器 sfr T4H = 0xD2; //0000,0000 T4高字节 sfr T4L = 0xD3; //0000,0000 T4低字节 sfr T3H = 0xD4; //0000,0000 T3高字节 sfr T3L = 0xD5; //0000,0000 T3低字节 sfr T2H = 0xD6; //0000,0000 T2高字节 sfr T2L = 0xD7; //0000,0000 T2低字节

sfr WKTCL = 0xAA; //0000,0000 掉电唤醒定时器低字节 sfr WKTCH = 0xAB; //0000,0000 掉电唤醒定时器高字节 sfr WDT_CONTR = 0xC1; //0000,0000 看门狗控制寄存器 //串行口特殊功能寄存器

sfr SCON = 0x98; //0000,0000 串口1控制寄存器 sbit SM0 = SCON^7; sbit SM1 = SCON^6; sbit SM2 = SCON^5; sbit REN = SCON^4; sbit TB8 = SCON^3; sbit RB8 = SCON^2; sbit TI = SCON^1; sbit RI = SCON^0;

sfr SBUF = 0x99; //xxxx,xxxx 串口1数据寄存器 sfr S2CON = 0x9A; //0000,0000 串口2控制寄存器 sfr S2BUF = 0x9B; //xxxx,xxxx 串口2数据寄存器 sfr S3CON = 0xAC; //0000,0000 串口3控制寄存器 sfr S3BUF = 0xAD; //xxxx,xxxx 串口3数据寄存器 sfr S4CON = 0x84; //0000,0000 串口4控制寄存器 sfr S4BUF = 0x85; //xxxx,xxxx 串口4数据寄存器

30

sfr SADDR = 0xA9; //0000,0000 从机地址寄存器 sfr SADEN = 0xB9; //0000,0000 从机地址屏蔽寄存器 //ADC 特殊功能寄存器

sfr ADC_CONTR = 0xBC; //0000,0000 A/D转换控制寄存器 sfr ADC_RES = 0xBD; //0000,0000 A/D转换结果高8位 sfr ADC_RESL = 0xBE; //0000,0000 A/D转换结果低2位 //SPI 特殊功能寄存器

sfr SPSTAT = 0xCD; //00xx,xxxx SPI状态寄存器 sfr SPCTL = 0xCE; //0000,0100 SPI控制寄存器 sfr SPDAT = 0xCF; //0000,0000 SPI数据寄存器 //IAP/ISP 特殊功能寄存器

sfr IAP_DATA = 0xC2; //0000,0000 EEPROM数据寄存器 sfr IAP_ADDRH = 0xC3; //0000,0000 EEPROM地址高字节 sfr IAP_ADDRL = 0xC4; //0000,0000 EEPROM地址第字节 sfr IAP_CMD = 0xC5; //xxxx,xx00 EEPROM命令寄存器 sfr IAP_TRIG = 0xC6; //0000,0000 EEPRPM命令触发寄存器 sfr IAP_CONTR = 0xC7; //0000,x000 EEPROM控制寄存器 //PCA/PWM 特殊功能寄存器

sfr CCON = 0xD8; //00xx,xx00 PCA控制寄存器 sbit CF = CCON^7; sbit CR = CCON^6; sbit CCF2 = CCON^2; sbit CCF1 = CCON^1; sbit CCF0 = CCON^0;

sfr CMOD = 0xD9; //0xxx,x000 PCA 工作模式寄存器 sfr CL = 0xE9; //0000,0000 PCA计数器低字节 sfr CH = 0xF9; //0000,0000 PCA计数器高字节

sfr CCAPM0 = 0xDA; //0000,0000 PCA模块0的PWM寄存器 sfr CCAPM1 = 0xDB; //0000,0000 PCA模块1的PWM寄存器 sfr CCAPM2 = 0xDC; //0000,0000 PCA模块2的PWM 寄存器

sfr CCAP0L = 0xEA; //0000,0000 PCA模块0的捕捉/比较寄存器低字节 sfr CCAP1L = 0xEB; //0000,0000 PCA模块1的捕捉/比较寄存器低字节 sfr CCAP2L = 0xEC; //0000,0000 PCA模块2的捕捉/比较寄存器低字节 sfr PCA_PWM0 = 0xF2; //xxxx,xx00 PCA模块0的PWM寄存器 sfr PCA_PWM1 = 0xF3; //xxxx,xx00 PCA模块1的PWM寄存器 sfr PCA_PWM2 = 0xF4; //xxxx,xx00 PCA模块1的PWM寄存器

sfr CCAP0H = 0xFA; //0000,0000 PCA模块0的捕捉/比较寄存器高字节 sfr CCAP1H = 0xFB; //0000,0000 PCA模块1的捕捉/比较寄存器高字节 sfr CCAP2H = 0xFC; //0000,0000 PCA模块2的捕捉/比较寄存器高字节

31

//比较器特殊功能寄存器

sfr CMPCR1 = 0xE6; //0000,0000 比较器控制寄存器1 sfr CMPCR2 = 0xE7; //0000,0000 比较器控制寄存器2 //增强型PWM波形发生器特殊功能寄存器

sfr PWMCFG = 0xf1; //x000,0000 PWM配置寄存器 sfr PWMCR = 0xf5; //0000,0000 PWM控制寄存器 sfr PWMIF = 0xf6; //x000,0000 PWM中断标志寄存器

sfr PWMFDCR = 0xf7; //xx00,0000 PWM外部异常检测控制寄存器 #endif

2. STC15W4K32S4系列单片机I/O端口初始化文件(gpio.h)

(1)程序文件说明:该文件对STC15系列单片机的I/O端口进行初始化,将I/O端口的状态设置为准双向口,文件名称命名为:gpio.h,初始化I/O的函数为GPIO()。

(2)程序清单 void GPIO() //初始化I/O口 { P0M1=0; P0M0=0; P1M1=0; P1M0=0; P2M1=0; P2M0=0; P3M1=0; P3M0=0; P4M1=0; P4M0=0; P5M1=0; P5M0=0; }

3. STC15W4K32S4系列单片机学习板数码管驱动文件(595hc.h)

(1)程序文件说明:该程序文件是数码管595芯片驱动程序,命名为:595hc.h。显示缓冲区为Dis_buf[]数组,Dis_buf[0]是最高位,Dis_buf[7]是最低位;显示函数为display()。

(2)程序清单

/*------------- IO口定义---------------*/

sbit P_HC595_SER=P4^0; //pin 14 SER data input

sbit P_HC595_RCLK=P5^4; //pin 12 RCLk store (latch) clock sbit P_HC595_SRCLK=P4^3; //pin 11 SRCLK Shift data clock /*-------------段控制码、位控制码、显示缓冲区的定义 ---------------*/

uchar code

SEG7[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x7

32

1,0x00};

//“0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F、灭”的共阴极字形码

uchar code Scon_bit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //位控制码 uchar data Dis_buf[]={16,16,16,16,16,16,16,0}; //显示缓冲区定义 void Delay1ms() //@11.0592MHz { unsigned char i, j; _nop_(); _nop_(); _nop_(); i = 11; j = 190; do { while (--j); } while (--i); }

/*------------ 向595发送字节函数----------------*/ void F_Send_595(uchar x) { uchar i; for(i=0;i<8;i++) { x=x<<1; P_HC595_SER=CY; P_HC595_SRCLK=1; P_HC595_SRCLK=0; } }

/*------------ 数码管显示函数----------------*/ void display(void) { uchar i; for(i=0;i<8;i++) { F_Send_595(Scon_bit[i]); F_Send_595(SEG7[Dis_buf[i]]); P_HC595_RCLK=1;

33

}

P_HC595_RCLK=0; Delay1ms(); }

34

本文来源:https://www.bwwdw.com/article/k8xo.html

Top