单片微机原理与接口技术实验指导
实验一 用户程序的编辑、编译与仿真调试
1. 实验目的
(1)学会给keil C集成开发环境添加STC系列单片机型号、头文件以及在线仿真驱动数据库。
(2)学会用keil C集成开发环境编辑、编译用户程序,并生成用户程序的机器代码。
(3)学会用keil C集成开发环境模拟仿真调试用户程序。
2. 预习与思考
预习3.1节内容,并根据实验内容制定好实验步骤。
3. 实验电路原理及硬件连线
本实验只需PC机和keil C集成开发环境工具,无须其它硬件电路。
2. 4. 实验内容
1
(1)实验程序功能与参考程序
本实验程序功能是一流水灯控制,控制信号从P1口输出,低电平驱动,轮流点亮P1控制的LED灯,时间间隔为1s,参考程序如下:
#include #include #include #define uchar unsigned char #define uint unsigned int uchar x=0xfe; /*---------1000ms延时函数,从STC-ISP工具中获得---------*/ void Delay1000ms() //@11.0592MHz { 2 unsigned char i, j, k; _nop_(); _nop_(); i = 43; j = 6; k = 203; do { do { while (--k); } while (--j); 3 } while (--i); } /*------------主函数---------------*/ void main(void) { GPIO(); while(1) { P1=x; Delay1000ms(); x=_crol_(x,1); } 4 } (2)用Keil Vision2开发工具输入、编辑与编译上述实验程序,并生成该程序的机器代码。 (3)用Keil Vision2开发工具的软件模拟仿真功能调试本实验程序。 5. 程序调试及效果分析 (1)从项目文件夹中,查看生成的机器代码,默认情况下,其默认文件名取决于哪里。 (2)用Keil Vision2开发工具的软件模拟仿真功能调试本实验程序的效果。 6. 实验报告要求 (1)总结给Keil Vision2开发工具添加STC系列单片机型号、头文件以及STC在线仿真驱动数据库的方法。 (2)总结应用Keil Vision2开发工具编辑、编译用户程序,生成用户程序机器代码的操作步骤。 实验二 用户程序的在线编程与在线仿真 1. 实验目的 5 (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 6 #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; 7 do { while (--j); } while (--i); } /*------------xms延时函数---------------*/ void delay(uint x) //@11.0592MHz { uint i; for(i=0;i Delay1ms(); 8 } } /*------------主函数---------------*/ void main(void) { GPIO(); while(1) { P17 = 0; delay(1000); P17 = 1; P16 = 0; 9 delay(1000); P16 = 1; P47 = 0; delay(1000); P47 = 1; P46 = 0; delay(1000); P46 = 1; } } 4. 实验电路原理及硬件连线 本实验基于STC15开发板上实施,硬件线路包括STC单片机与PC机USB接口的通信线路,以及 10 LED7、LED8、LED9、LED10等LED灯。 5. 实验内容 (1)用Keil Vision2开发工具编辑、编译demo.c程序,并生成机器代码。 (2)用STC_ISP在线编程工具给STC15单片机开发板下载用户程序,运行用户程序,验证程序功能是否符合程序要求。 (3)应用Keil Vision2开发工具与STC15实验板进行用户程序的在线仿真调试,验证程序功能是否符合程序要求。 6. 程序调试及效果分析 (1)在系统调试,分析程序运行效果。 (2)在线仿真调试,分析程序运行效果。 7. 实验报告要求 (1)总结STC单片机在线编程的操作步骤与在系统调试方法。 (2)总结STC单片机在线仿真方法。 11 (3)总结STC单片机在线仿真有什么优势? 实验三 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 12 ORG 0003H LJMP INT0_ISR ORG 0013H LJMP INT1_ISR MAIN: LCALL GPIO SETB IT0 SETB IT1 SETB EX0 SETB EX1 SETB EA SJMP $ ;调用初始化程序 13 INT0_ISR: CPL P1.7 RETI INT1_ISR: CPL P4.7 RETI $include(gpio.inc) END (2)int01.c #include #include ;STC15 I/O口的初始化文件 //包含支持IAP15W4K58S4单片机的头文件 //I/O初始化文件 14 #define uchar unsigned char #define uint unsigned int void ex01_init() { IT0=1; IT1=1; EX0=1; EX1=1; EA=1; } void main() { 15 GPIO(); ex01_init(); while(1); } void int0_isr() interrupt 0 { P17=~P17; } void int1_isr() interrupt 2 { P47=~P47; } 16 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)总结按键输入外部中断请求信号存在的问题与解决方法。 17 实验四 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 18 LJMP MAIN ORG 001BH LJMP T1_ISR MAIN: LCALL GPIO MOV R3,#20 MOV TMOD,#00H MOV TH1,#3CH MOV TL1,#0B0H SETB ET1 SETB EA SETB TR1 ;调用初始化程序 ;置50ms计数循环初值 ;设定时器1为方式0定时 ;置50ms定时器初值 ;开放T1中断 ;启动T1 19 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 $include(gpio.inc) END ;STC15 I/O口的初始化文件 20 (2)Flash.c #include #include #include #define uchar unsigned char #define uint unsigned int uchar i = 0; void main(void) { GPIO(); //初始化函数 TMOD=0x00; TH1=0x3c; 21 TL1=0xb0; ET1=1; EA=1; TR1=1; while(1); } void T1_isr() interrupt 3 { i++; if(i==20) { i=0; 22 P16=~P16; //LED灯的驱动取反输出 P17=~P17; P46=~P46; P47=~P47; } } 4. 实验电路原理及硬件连线 基于STC15开发板,采用数码管显示秒表值。 5. 实验内容 完成SECOND.ASM与second.c程序的编辑、编译与调试。 6. 程序调试及效果分析 (1)调试SECOND.ASM程序,观察与记录程序运行结果。 23 (2)调试second.c程序,观察与记录程序运行结果。 7. 实验报告要求 (1)以IAP15W4K58S4单片机定时器/计数器方式0的电路结构,分析IAP15W4K58S4单片机定时器/计数器的工作原理。 (2)分析FLASH.ASM.ASM与flash.c的程序功能。 实验五 IAP15W4K58S4单片机双机通信的应用编程与调试 1. 实验目的 (1)巩固串行通信的基本概念与基本知识。 (2)掌握IAP15W4K58S4单片机串行口1工作方式的设置与应用编程。 2. 预习与思考 (1)预习9.1节内容,掌握串行通信的基本知识。 (2)预习9.2节内容,掌握IAP15W4K58S4单片机串行口1的工作方式与应用编程。 24 (3)分析例参考程序UART.ASM与uart.c,根据程序功能制定程序的调试方案。 3. 实验电路原理及硬件连线 (1)UART.ASM $include(stc15.inc) ORG 0000H LJMP MAIN ORG 0023H LJMP S_ISR MAIN: LCALL GPIO LCALL UARTINIT SETB ES ;STC15新增特殊功能寄存器的定义文件,详见附录六25 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 ;设置发送间隔 26 JNB RI, S_QUIT CLR RI MOV A, SBUF ANL A, #00001100B CJNE A, #00H, NEXT1 CLR P1.7 SETB P1.6 SETB P4.7 SETB P4.6 SJMP S_QUIT NEXT1: CJNE A, #04H, NEXT2 27 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 28 NEXT3: SETB P1.7 SETB P1.6 SETB P4.7 CLR P4.6 S_QUIT: POP ACC RETI UARTINIT: MOV SCON,#50H ORL AUXR,#40H ANL AUXR,#0FEH ;******************,从STC-ISP工具中获得 ;8位数据,可变波特率 ;定时器1时钟为Fosc,即1T ;串口1选择定时器1为波特率发生器 29 ANL TMOD,#0FH ;设定定时器1为16位自动重装方式 MOV TL1,#0E0H ;设定定时初值 MOV TH1,#0FEH ;设定定时初值 CLR ET1 SETB TR1 RET DELAY100MS: NOP NOP NOP PUSH 30H PUSH 31H ;禁止定时器1中断 ;启动定时器1 ;@11.0592MHz ,从STC-ISP工具中获得 30 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 31 $include(gpio.inc) ;STC15 I/O口的初始化文件 END (2)uart.c #include #include #include #define uchar unsigned char #define uint unsigned int uchar temp; uchar temp1; void Delay100ms() //@11.0592MHz { 32 unsigned char i, j, k; _nop_(); _nop_(); i = 5; j = 52; k = 195; do { do { while (--k); } while (--j); 33 } while (--i); } void UartInit(void) //****************** { 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 34 } void main() { GPIO(); UartInit(); ES=1; EA=1; while(1) { temp=P3; temp=temp&0x0c; SBUF=temp; 35 while(TI==0); TI=0; Delay100ms(); } } void uart_isr() interrupt 4 { if(RI==1) { RI=0; temp1=SBUF; switch(temp1&0x0c) 36 { 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. 实验内容 37 (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)双机通信的调试结果与分析。 38 (3)用串行口2实现双机通信,画出用串行口实现双机通信的电路图,列出实验程序与调试记录,分析调试结果。 实验六 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程序的功能。 39 3. 实验参考程序(ad.c) #include #include #include #define uchar unsigned char #define uint unsigned int #include <595hc.h> uint adc_value; //定义无符号字符型变量adc_value用于保存ADC值 void main(void) //主程序 { uint i; //定义整型变量i用于适当延时 ADC_CONTR|=0x80; //打开A/D转换电源 40 for(i=0;i<1000;i++); //适当延时 P1ASF=0x02; //设置ADC1(P1.1)为模拟量输入功能 CLK_DIV|=0x20; //ADRJ=1,设置A/D转换结果的存储格式 ADC_CONTR=0x; //选择选择输入通道ADC1(P1.1)并启动A/D转换 EADC=1; //打开ADC中断 EA=1; //打开CPU总中断 while(1) { Dis_buf[7]= adc_value%10; //秒值送显示缓冲区 Dis_buf[6]= adc_value/10%10; Dis_buf[7]= adc_value/100%10; //秒值送显示缓冲区 Dis_buf[6]= adc_value/1000%10; 41 display(); // 调显示函数 } } void ADC_int(void) interrupt 5 //ADC中断服务子程序 { ADC_CONTR=0x81; //将ADC_FLAG清0 adc_value= ADC_RES*256+ADC_RESL; //保存10位A/D转换结果,范围为0~1023 ADC_CONTR=0x; //重新启动A/D转换 } 4. 实验电路原理及硬件连线 将STC15实验板W1电位器的中间抽头(P5.5)接AD转换的输入端P1.1,转换后结果送数码管显示(0~1023)。 42 5. 实验内容 (1)完成ad.c程序的编辑、编译与调试。 (2)如果AD模块采用查询方式进行转换,编写程序并验证效果。 (3)如果AD模块采用定时方式进行转换,编写程序并验证效果。 6. 程序调试及效果分析 (1)通过编译软件keil编写源程序代码,编译通过没有错误,生成十六进制目标文件。 (2)通过STC单片机下载软件STC-ISP将十六进制目标文件下载到STC学习板的单片机芯片IAP15W4K58S4,验证实验效果。 (3)调节W1,观察数码管的显示值并记录。 7. 实验报告要求 (1)总结IAP15W4K58S4单片机AD转换模块的软、硬件设计原理与方法; (2)写出所作实验程序的源代码,给每行语句加上详细的注释,在预习报告的基础上完善程序流程图; 43 (3)叙述程序调试过程中遇到的问题以及解决方法,写出本次实验的收获和心得体会。 实验七 键盘与数码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) 44 #include \"stc15.h\" //包含单片机头文件 #include \"GPIO.h\" //包含初始化I/O端口头文件 #include #define uchar unsigned char #include \"595hc.h\"//包含数码管显示头文件 sbit SW17 = P3^2; //定义按键- sbit SW18 = P3^3; //定义按键+ void Delay(unsigned int v) { while(v!=0) v--; } 45 void main(void) //主程序 { signed int i=0; //为了i能小于0,定义i为有符号变量,初始值0 GPIO(); //初始化I/O端口为准双向口while(1) { if(SW17==0) //按键- { Delay(10000); //按键消抖 if(SW17==0) { i--; //变量i减1 46 if(i<0){i=99;} //判断如果i小于0就回到99 while(SW17==0); //等待按键松开 } } if(SW18==0) //按键+ { Delay(10000); //按键消抖 if(SW18==0) { i++; //变量i加1 if(i>99){i=0;} //判断如果i大于99就回到0 while(SW18==0); //等待按键松开 47 } } Dis_buf[6]=i/10;//数码管显示十位数据 Dis_buf[7]=i%10;//数码管显示个位数据 display(); } } 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。 48 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编写源程序代码,编译通过没有错误,生成十六进制目标文件。 (2)通过STC单片机下载软件STC-ISP将十六进制目标文件下载到STC学习板的单片机芯片 49 IAP15W4K58S4,验证实验效果。 (3)程序对按键进行识别,并对变量加一或减一操作,通过数码管的显示可观察。 (4)修改C语言源程序里面相关参数,观察实验效果的变化。 7. 实验报告要求 (1)总结按键与LED数码管显示的软、硬件设计原理与方法; (2)写出所作实验程序的源代码,给每行语句加上详细的注释,在预习报告的基础上完善程序流程图; (3)叙述程序调试过程中遇到的问题以及解决方法,写出本次实验的收获和心得体会。 附录: 常用文件 说明:本附录中包好STC15系列单片机特殊功能寄存器定义的头文件(STC15.INC和stc15.h)、STC15单片机I/O的初始化文件(GPIO.INC、gpio.h)以及STC15实验板数码管的驱动函数(595HC.INC、595hc.h),其中STC15系列单片机特殊功能寄存器定义的头文件可利用STC-ISP在线编程软件获取。 一、汇编部分 50 1. STC新增特殊功能寄存器的定义文件(STC15.INC) (1)程序文件说明:该文件包含STC15系列单片机新增特殊功能寄存器的地址定义,文件名称命名为:STC15.INC。 (2)程序清单 P4 DATA 0C0H P5 DATA 0C8H P6 DATA 0E8H P7 DATA 0F8H P0M0 DATA 0x94 P0M1 DATA 093H P1M0 DATA 092H P1M1 DATA 091H ; 1111,1111 端口4 ; xxxx,1111 端口5 ; 0000,0000 端口6 ; 0000,0000 端口7 ; 0000,0000 端口0模式寄存器0 ; 0000,0000 端口0模式寄存器1 ; 0000,0000 端口1模式寄存器0 ; 0000,0000 端口1模式寄存器1 51 P2M0 DATA 096H ; 0000,0000 端口2模式寄存器0 P2M1 DATA 095H ; 0000,0000 端口2模式寄存器1 P3M0 DATA 0B2H ; 0000,0000 端口3模式寄存器0 P3M1 P4M0 P4M1 P5M0 P5M1 P6M0 P6M1 P7M0 P7M1 DATA DATA DATA DATA DATA DATA DATA DATA DATA 0B1H 0B4H 0B3H 0CAH 0C9H 0CCH 0CBH 0E2H 0E1H ; 0000,0000 端口3模式寄存器1 ; 0000,0000 端口4模式寄存器0 ; 0000,0000 端口4模式寄存器1 ; 0000,0000 端口5模式寄存器0 ; 0000,0000 端口5模式寄存器1 ; 0000,0000 端口6模式寄存器0 ; 0000,0000 端口6模式寄存器1 ; 0000,0000 端口7模式寄存器0 ; 0000,0000 端口7模式寄存器1 52 ;系统管理特殊功能寄存器 AUXR DATA 08EH ; 0000,0000 辅助寄存器 AUXR1 DATA 0A2H ; 0000,0000 辅助寄存器1 P_SW1 DATA 0A2H CLK_DIV DATA 097H BUS_SPEED DATA 0A1H P1ASF DATA 09DH P_SW2 DATA 0BAH ;中断特殊功能寄存器 IE2 DATA 0AFH IP2 DATA 0B5H INT_CLKO DATA 08FH ; 0000,0000 外设端口切换寄存器1 ; 0000,0000 时钟分频控制寄存器 ; xx10,x011 总线速度控制寄存器 ; 0000,0000 端口1模拟功能配置寄存器 ; 0xxx,x000 外设端口切换寄存器 ; 0000,0000 中断控制寄存器2 ; xxxx,xx00 中断优先级寄存器2 ; 0000,0000 外部中断与时钟输出控制寄存器 53 ;定时器特殊功能寄存器 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 S3BUF DATA 0ADH S4CON DATA 084H S4BUF DATA 085H SADDR DATA 0A9H SADEN DATA 0B9H ;ADC 特殊功能寄存器 ADC_CONTR DATA 0BCH ADC_RES DATA 0BDH ; 0000,0000 串口3控制寄存器 ; xxxx,xxxx 串口3数据寄存器 ; 0000,0000 串口4控制寄存器 ; xxxx,xxxx 串口4数据寄存器 ; 0000,0000 从机地址寄存器 ; 0000,0000 从机地址屏蔽寄存器 ; 0000,0000 A/D转换控制寄存器 ; 0000,0000 A/D转换结果高8位 55 ADC_RESL DATA 0BEH ; 0000,0000 A/D转换结果低2位 ;SPI 特殊功能寄存器 SPSTAT DATA 0CDH ; 00xx,xxxx SPI状态寄存器 SPCTL DATA 0CEH SPDAT DATA 0CFH ;IAP/ISP 特殊功能寄存器 IAP_DATA DATA 0C2H IAP_ADDRH DATA 0C3H IAP_ADDRL DATA 0C4H IAP_CMD DATA 0C5H IAP_TRIG DATA 0C6H IAP_CONTR DATA 0C7H ; 0000,0100 SPI控制寄存器 ; 0000,0000 SPI数据寄存器 ; 0000,0000 EEPROM数据寄存器 ; 0000,0000 EEPROM地址高字节 ; 0000,0000 EEPROM地址第字节 ; xxxx,xx00 EEPROM命令寄存器 ; 0000,0000 EEPRPM命令触发寄存器 ; 0000,x000 EEPROM控制寄存器 56 ;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 CL DATA 0E9H CH DATA 0F9H CCAPM0 DATA 0DAH CCAPM1 DATA 0DBH ; ; ; ; ; 0xxx,x000 PCA 工作模式寄存器 ; 0000,0000 PCA计数器低字节 ; 0000,0000 PCA计数器高字节 ; 0000,0000 PCA模块0的PWM寄存器 ; 0000,0000 PCA模块1的PWM寄存器 57 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 PCA_PWM0 DATA 0F2H PCA_PWM1 DATA 0F3H PCA_PWM2 DATA 0F4H CCAP0H DATA 0FAH CCAP1H DATA 0FBH CCAP2H DATA 0FCH ;比较器特殊功能寄存器 CMPCR1 DATA 0E6H ; 0000,0000 PCA模块2的捕捉/比较寄存器低字节 ; xxxx,xx00 PCA模块0的PWM寄存器 ; xxxx,xx00 PCA模块1的PWM寄存器 ; xxxx,xx00 PCA模块1的PWM寄存器 ; 0000,0000 PCA模块0的捕捉/比较寄存器高字节 ; 0000,0000 PCA模块1的捕捉/比较寄存器高字节 ; 0000,0000 PCA模块2的捕捉/比较寄存器高字节 ; 0000,0000 比较器控制寄存器1 58 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 59 MOV P0M0,#0 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 60 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,071 61 H ; black - H J K L N o P U t G Q r M y DB H 000H,040H,076H,01EH,070H,038H,037H,05CH,073H,03EH,078H,03dH,067H,050H,037H,06E 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 62 MOV P_HC595_SER,C 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入栈 63 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 出栈 65 POP 00H POP DPL POP DPH RET DELAY1MS: PUSH 30H PUSH 31H MOV 30H,#9 MOV 31H,#150 NEXT: DJNZ 31H,NEXT DJNZ 30H,NEXT ;R0 出栈 ;DPL出栈 ;DPH出栈 ;@11.0592MHz 66 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 67 sfr B = 0xF0; //0000,0000 B寄存器 sfr PSW = 0xD0; //0000,0000 程序状态字 sbit CY = PSW^7; sbit AC sbit F0 sbit RS1 sbit RS0 sbit OV sbit P sfr SP sfr DPL sfr DPH = PSW^6; = PSW^5; = PSW^4; = PSW^3; = PSW^2; = PSW^0; = 0x81; //0000,0111 堆栈指针 = 0x82; //0000,0000 数据指针低字节 = 0x83; //0000,0000 数据指针高字节 68 //I/O 口特殊功能寄存器 sfr P0 = 0x80; //1111,1111 端口0 sbit P00 = P0^0; sbit P01 sbit P02 sbit P03 sbit P04 sbit P05 sbit P06 sbit P07 sfr P1 sbit P10 = P0^1; = P0^2; = P0^3; = P0^4; = P0^5; = P0^6; = P0^7; 0x90; = P1^0; //1111,1111 端口1 69 = sbit P11 = P1^1; sbit P12 = P1^2; sbit P13 = P1^3; sbit P14 sbit P15 sbit P16 sbit P17 sfr P2 sbit P20 sbit P21 sbit P22 sbit P23 = P1^4; = P1^5; = P1^6; = P1^7; 0xA0; = P2^0; = P2^1; = P2^2; = P2^3; //1111,1111 端口2 70 = sbit P24 = P2^4; sbit P25 = P2^5; sbit P26 = P2^6; sbit P27 sfr P3 sbit P30 sbit P31 sbit P32 sbit P33 sbit P34 sbit P35 sbit P36 = P2^7; 0xB0; = P3^0; = P3^1; = P3^2; = P3^3; = P3^4; = P3^5; = P3^6; //1111,1111 端口3 71 = sbit P37 = P3^7; sfr P4 = 0xC0; //1111,1111 端口4 sbit P40 = P4^0; sbit P41 sbit P42 sbit P43 sbit P44 sbit P45 sbit P46 sbit P47 sfr P5 sbit P50 = P4^1; = P4^2; = P4^3; = P4^4; = P4^5; = P4^6; = P4^7; 0xC8; = P5^0; //xxxx,1111 端口5 72 = sbit P51 = P5^1; sbit P52 = P5^2; sbit P53 = P5^3; sbit P sbit P55 sbit P56 sbit P57 sfr P6 sbit P60 sbit P61 sbit P62 sbit P63 = P5^4; = P5^5; = P5^6; = P5^7; 0xE8; = P6^0; = P6^1; = P6^2; = P6^3; //0000,0000 端口6 73 = sbit P = P6^4; sbit P65 = P6^5; sbit P66 = P6^6; sbit P67 sfr P7 sbit P70 sbit P71 sbit P72 sbit P73 sbit P74 sbit P75 sbit P76 = P6^7; 0xF8; = P7^0; = P7^1; = P7^2; = P7^3; = P7^4; = P7^5; = P7^6; //0000,0000 端口7 74 = sbit P77 = P7^7; sfr P0M0 = 0x94; //0000,0000 端口0模式寄存器0 sfr P0M1 = 0x93; //0000,0000 端口0模式寄存器1 sfr P1M0 sfr P1M1 sfr P2M0 sfr P2M1 sfr P3M0 sfr P3M1 sfr P4M0 sfr P4M1 sfr P5M0 0x92; 0x91; 0x96; 0x95; 0xB2; 0xB1; 0xB4; 0xB3; 0xCA; //0000,0000 端口1模式寄存器0 //0000,0000 端口1模式寄存器1 //0000,0000 端口2模式寄存器0 //0000,0000 端口2模式寄存器1 //0000,0000 端口3模式寄存器0 //0000,0000 端口3模式寄存器1 //0000,0000 端口4模式寄存器0 //0000,0000 端口4模式寄存器1 //0000,0000 端口5模式寄存器0 75 = = = = = = = = = sfr P5M1 = 0xC9; //0000,0000 端口5模式寄存器1 sfr P6M0 = 0xCC; //0000,0000 端口6模式寄存器0 sfr P6M1 = 0xCB; //0000,0000 端口6模式寄存器1 sfr P7M0 = 0xE2; sfr P7M1 = 0xE1; //系统管理特殊功能寄存器 sfr PCON = 0x87; sfr AUXR = 0x8E; sfr AUXR1 = 0xA2; sfr P_SW1 = 0xA2; sfr CLK_DIV = 0x97; sfr BUS_SPEED = 0xA1; //0000,0000 端口7模式寄存器0 //0000,0000 端口7模式寄存器1 //0001,0000 电源控制寄存器 //0000,0000 辅助寄存器 //0000,0000 辅助寄存器1 //0000,0000 外设端口切换寄存器1 //0000,0000 时钟分频控制寄存器 //xx10,x011 总线速度控制寄存器 76 sfr P1ASF = 0x9D; //0000,0000 端口1模拟功能配置寄存器 sfr P_SW2 = 0xBA; //0xxx,x000 外设端口切换寄存器 //中断特殊功能寄存器 sfr IE sbit EA sbit ELVD sbit EADC sbit ES sbit ET1 sbit EX1 sbit ET0 sbit EX0 0xA8; = IE^7; = IE^6; = IE^5; = IE^4; = IE^3; = IE^2; = IE^1; = IE^0; //0000,0000 中断控制寄存器 77 = sfr IP = 0xB8; //0000,0000 中断优先级寄存器 sbit PPCA = IP^7; sbit PLVD = IP^6; sbit PADC sbit PS sbit PT1 sbit PX1 sbit PT0 sbit PX0 sfr IE2 sfr IP2 sfr INT_CLKO = IP^5; = IP^4; = IP^3; = IP^2; = IP^1; = IP^0; 0xAF; = 0xB5; = 0x8F; //0000,0000 中断控制寄存器2 //xxxx,xx00 中断优先级寄存器2 //0000,0000 外部中断与时钟输出控制寄存器78 = //定时器特殊功能寄存器 sfr TCON = 0x88; //0000,0000 T0/T1控制寄存器 sbit TF1 = TCON^7; sbit TR1 sbit TF0 sbit TR0 sbit IE1 sbit IT1 sbit IE0 sbit IT0 sfr TMOD sfr TL0 = TCON^6; = TCON^5; = TCON^4; TCON^3; TCON^2; TCON^1; TCON^0; = 0x; //0000,0000 T0/T1模式寄存器= 0x8A; //0000,0000 T0低字节 79 = = = = sfr TL1 = 0x8B; //0000,0000 T1低字节 sfr TH0 = 0x8C; //0000,0000 T0高字节 sfr TH1 = 0x8D; //0000,0000 T1高字节 sfr T4T3M sfr T3T4M sfr T4H sfr T4L sfr T3H sfr T3L sfr T2H sfr T2L sfr WKTCL = 0xD1; //0000,0000 T3/T4模式寄存器 = 0xD1; //0000,0000 T3/T4模式寄存器 = 0xD2; //0000,0000 T4高字节 0xD3; //0000,0000 T4低字节 = 0xD4; //0000,0000 T3高字节 0xD5; //0000,0000 T3低字节 = 0xD6; //0000,0000 T2高字节 0xD7; //0000,0000 T2低字节 = 0xAA; //0000,0000 掉电唤醒定时器低字节80 = = = sfr WKTCH = 0xAB; //0000,0000 掉电唤醒定时器高字节 sfr WDT_CONTR = 0xC1; //0000,0000 看门狗控制寄存器 //串行口特殊功能寄存器 sfr SCON sbit SM0 sbit SM1 sbit SM2 sbit REN sbit TB8 sbit RB8 sbit TI sbit RI = 0x98; //0000,0000 串口1控制寄存器 = SCON^7; = SCON^6; = SCON^5; = SCON^4; = SCON^3; = SCON^2; SCON^1; = SCON^0; 81 = 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数据寄存器 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位 82 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控制寄存器 83 //PCA/PWM 特殊功能寄存器 sfr CCON = 0xD8; //00xx,xx00 PCA控制寄存器 sbit CF = CCON^7; sbit CR sbit CCF2 sbit CCF1 sbit CCF0 sfr CMOD sfr CL sfr CH sfr CCAPM0 sfr CCAPM1 = CCON^6; = CCON^2; = CCON^1; = CCON^0; = 0xD9; //0xxx,x000 PCA 工作模式寄存器 = 0xE9; //0000,0000 PCA计数器低字节 = 0xF9; //0000,0000 PCA计数器高字节 = 0xDA; //0000,0000 PCA模块0的PWM寄存器 = 0xDB; //0000,0000 PCA模块1的PWM寄存器 84 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的捕捉/比较寄存器高字节 //比较器特殊功能寄存器 sfr CMPCR1 = 0xE6; //0000,0000 比较器控制寄存器1 85 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口 86 { P0M1=0; P0M0=0; P1M1=0; P1M0=0; P2M1=0; P2M0=0; P3M1=0; P3M0=0; P4M1=0; P4M0=0; P5M1=0; 87 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,0x71,0 88 x00}; //“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; 90 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]); 91 F_Send_595(SEG7[Dis_buf[i]]); P_HC595_RCLK=1; P_HC595_RCLK=0; Delay1ms(); } } 92 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- efsc.cn 版权所有 赣ICP备2024042792号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务