
电子竞赛之C语言应用教学课件.ppt
39页凌阳大学计划凌阳大学计划.twSUNPLUSTechnology for Easy Living电子竞赛电子竞赛之之C语言应用凌阳大学计划凌阳大学计划.twSUNPLUSTechnology for Easy Living前言Ø这个ppt的重点在于讲述如何使用C语言来对SPCE061A单片机进行编程Ø希望这个ppt对同学们有所帮助 凌阳大学计划凌阳大学计划.twSUNPLUSTechnology for Easy Living目录Ø凌阳C语言简介Ø凌阳C语言基础 ØC和汇编混合编程Ø用C来直接控制硬件 凌阳大学计划凌阳大学计划.twSUNPLUSTechnology for Easy Living凌阳C语言简介凌阳大学计划凌阳大学计划.twSUNPLUSTechnology for Easy Living用C语言编程的优点Ø寄存器分配、数据类型等由编译器管理Ø编程及调试的时间减少,大大缩短开发周期Ø明显增加软件可读性,便于改进和扩充 凌阳大学计划凌阳大学计划.twSUNPLUSTechnology for Easy Living用C语言可以很方便地对SPCE061A进行编程ØIDE直接提供了C语言的开发环境,C函数和汇编函数可以方便地进行相互调用。
ØSoftware LibrariesStandard C libraryHardware librarySACM ( Sunplus audio coding method)凌阳大学计划凌阳大学计划.twSUNPLUSTechnology for Easy Living凌阳C语言基础凌阳大学计划凌阳大学计划.twSUNPLUSTechnology for Easy LivingunSP GCC认可的基本数据类型及其值域数据类型数据长度(bit)值域char16-32768~32767short,int16-32768~32767long32-2147483648~2147483647 unsigned char160~65535unsigned shortunsigned int160~65535 unsigned long320~4294967295 float,double32以IEEE格式表示的32位浮点数 凌阳大学计划凌阳大学计划.twSUNPLUSTechnology for Easy Living数据类型应该注意的地方Øchar和unsigned char为16位这与一般机器使用的GCC数据类型之间有一些差别。
Øfloat与double均存储为32位浮点数unSP汇编的float与double分别是32位与64位浮点数 凌阳大学计划凌阳大学计划.twSUNPLUSTechnology for Easy Living关于变量的signed和unsignedØ如果使用signed和unsigned两种数据类型,将使存储空间成倍增长因为使用signed和unsigned两种数据类型的库函数是不同的,使用signed和unsigned,就得同时使用这两种格式类型的库函数,Ø最好采用unsigned格式在编程时,如果只强调程序的运算速度而又不进行负数运算时,最好采用unsigned格式凌阳大学计划凌阳大学计划.twSUNPLUSTechnology for Easy Living关于实参求值顺序ØunSP IDE和Turbo C一样,实参的求值顺序是从右到左的,如下例: i=3;printf("%d,%d",i,i++); 输出 4,3 凌阳大学计划凌阳大学计划.twSUNPLUSTechnology for Easy Living一个例子凌阳大学计划凌阳大学计划.twSUNPLUSTechnology for Easy LivingC和汇编混合编程凌阳大学计划凌阳大学计划.twSUNPLUSTechnology for Easy Living混合编程的三个方面ØC调用汇编函数Ø汇编调用C函数 ØC中嵌入汇编 凌阳大学计划凌阳大学计划.twSUNPLUSTechnology for Easy LivingC调用汇编函数Ø要求汇编函数名也以下划线“_”为前缀因为C编译器产生的所有标号都以下划线“_”为前缀。
Ø在进行参数传递时,参数以相反的顺序(从右到左)被压入栈中 Ø汇编函数的16位返回值存放在寄存器R1中32位的返回值存入寄存器对R1、R2中;其中低字在R1中,高字在R2中凌阳大学计划凌阳大学计划.twSUNPLUSTechnology for Easy LivingC调用汇编的小例子extern int ADD();int main(void){int i,j,SUM;i=2;j=3;SUM=ADD(i,j);return 0;} .CODE.PUBLIC _ADD_ADD:.PROCPUSH BP TO [SP];BP = SP + 1;R1 = [BP+3]; //取得第一个参数R2 = [BP+4]; //取得第二个参数R1 += R2;POP BP FROM [SP];RETF;.ENDP 凌阳大学计划凌阳大学计划.twSUNPLUSTechnology for Easy Living汇编调用C小例子EXTERNAL _ADD;.RAM.VAR SUM.CODE.PUBLIC _main;_main:R1 = 3;PUSH R1 TO [SP]; //第2个参数 //入栈R1 = 2;PUSH R1 TO [SP]; //第1个参数 //入栈CALL _ADD;[SUM]=R1;SP+=2; //恢复SP指针.END C函数:int ADD(int i,int j){i=i+j;return i;} 凌阳大学计划凌阳大学计划.twSUNPLUSTechnology for Easy LivingC中嵌入汇编Ø汇编指令格式:asm (““汇编指令模板汇编指令模板”:输出参数:输入参数:输出参数:输入参数) 凌阳大学计划凌阳大学计划.twSUNPLUSTechnology for Easy Living利用嵌入式汇编写端口寄存器 Ø在C对P_IOA_Dir赋值0x1234,则嵌入汇编的实现方式如下:asm(“.define P_IOA_Dir 0x7002”);int main(void){asm("[P_IOA_Dir] = %0" : : "r"(0x1234)); } 凌阳大学计划凌阳大学计划.twSUNPLUSTechnology for Easy Living利用嵌入式汇编读端口寄存器 Ø把P_IOA_Dir的值读出并保存在C中的一个int变量j里 ,则嵌入汇编的方式如下:asm(“.define P_IOA_Dir 0x7002”);int main(void){ int j;asm("%0 = [P_IOA_Dir]": "=r"(j)); } 凌阳大学计划凌阳大学计划.twSUNPLUSTechnology for Easy Living用C来直接控制硬件 凌阳大学计划凌阳大学计划.twSUNPLUSTechnology for Easy Living使用纯C对寄存器进行操作#define P_IOA_Dir (volatile unsigned int *)0x7002int main(void){int j;* P_IOA_Dir=0x1234; j= * P_IOA_Dir; } 凌阳大学计划凌阳大学计划.twSUNPLUSTechnology for Easy Living用C进行IO设置Ø//设置A口为带下拉电阻的输入 *P_IOA_Dir =0;*P_IOA_Attrib =0;*P_IOA_Data =0; Ø//设置B口为同相低电平输出 *P_IOA_Dir =0xffff;*P_IOB_Attrib =0xffff;*P_IOB_Data =0; 凌阳大学计划凌阳大学计划.twSUNPLUSTechnology for Easy Living用C进行系统时钟设置 #define P_SystemClock (volatile unsigned int *)0x7013Ø *P_SystemClock = System_InformationØSystem Information = CPU Clock + 32K Mode + 32K Status + Fosc PLL频率睡眠状态32K方式CPUclk选择b15~b8b7~b5b4b3b2~b0凌阳大学计划凌阳大学计划.twSUNPLUSTechnology for Easy Living用C进行系统时钟设置 ØCPU Clock的取值可以是以下几种: C_Fosc FoscC_Fosc_Div_2 Fosc/2C_Fosc_Div_4 Fosc/4C_Fosc_Div_8 Fosc/8 (默认值)C_Fosc_Div_16 Fosc/16C_Fosc_Div_32 Fosc/32C_Fosc_Div_64 Fosc/64C_Sleep Stop (睡眠)凌阳大学计划凌阳大学计划.twSUNPLUSTechnology for Easy Living用C进行系统时钟设置 Ø32K Hz Mode 的取值可以是以下几种:C_StrongMode强振模式C_AutoMode 弱振模式 (默认值)Ø32K Hz Sleep Status的取值可以是以下几种:C_32K_Work 睡眠时,32K时钟仍工作 (默认)C_32K_Off 睡眠时,32K时钟停止工作凌阳大学计划凌阳大学计划.twSUNPLUSTechnology for Easy Living用C进行系统时钟设置 ØFosc的取值可以是以下几种:C_Fosc_24M 24.576M (默认值)C_Fosc_20M 20.480MC_Fosc_32M 32.768MC_Fosc_40M 40.960MC_Fosc_49M 49.152M 凌阳大学计划凌阳大学计划.twSUNPLUSTechnology for Easy Living用C进行系统时钟设置 Ø这个例子是进行系统时钟设置。
读者可以选择不同的Fosc_CLK和CPU_CLK,观察发光二极管亮灭快慢 Ø硬件连接:A口低八位接八个共阳的发光二极管Ø现象:根据Fosc_CLK和CPU_CLK的不同,观察发光二极管亮灭速度也不同凌阳大学计划凌阳大学计划.twSUNPLUSTechnology for Easy Living用C进行系统时钟设置 Ø程序代码#include "SPCE061V004.H"void Delay();#define Fosc_CLK_RATE C_Fosc_49M; //Fosc#define CPU_CLK_RATE C_Fosc_Div_2; //CPUClk凌阳大学计划凌阳大学计划.twSUNPLUSTechnology for Easy Living用C进行系统时钟设置 main(){unsigned int Fosc_CLK,CPU_CLK; *P_IOA_Dir = 0x00FF; // IOA: [7..0] output *P_IOA_Attrib = 0x00FF; *P_IOA_Data = 0;凌阳大学计划凌阳大学计划.twSUNPLUSTechnology for Easy Living用C进行系统时钟设置 Fosc_CLK = Fosc_CLK_RATE;CPU_CLK = CPU_CLK_RATE; *P_SystemClock = Fosc_CLK|CPU_CLK; 凌阳大学计划凌阳大学计划.twSUNPLUSTechnology for Easy Living用C进行系统时钟设置 while(1) { *P_IOA_Data = 0x00FF; //LED off Delay(); *P_IOA_Data = 0; //LED on Delay(); } }凌阳大学计划凌阳大学计划.twSUNPLUSTechnology for Easy Living用C写中断程序Ø在IDE162下,中断服务程序只能用汇编(包括嵌入式汇编)来写。
Ø在IDE180下,用户多了一种选择,那就是可以用C来写中断凌阳大学计划凌阳大学计划.twSUNPLUSTechnology for Easy Living用C写中断程序CASM功能INT_OFF()int off禁止所有中断INT_IRQ()int irq仅允许irq中断INT_FIQ()int fiq仅允许fiq中断INT_FIQ_IRQ() int fiq,irq允许fiq和irq中断IRQ_OFF()irq off禁止irq中断IRQ_ON()irq on允许irq中断FIQ_OFF()fiq off禁止fiq中断FIQ_ON()fiq on允许fiq中断凌阳大学计划凌阳大学计划.twSUNPLUSTechnology for Easy Living用C写中断程序Ø要求:定时0.5s,使A口的8个二极管闪烁Ø分析:定时0.5s采用哪个时基信号比较方便呢?SPCE061A单片机时基信号频率丰富,有2Hz、4Hz、 8Hz、 16Hz、 32Hz、 64Hz、 128Hz、256Hz、512Hz、1024H、2048Hz、4096Hz等多种频率我们可以很明显的看出2Hz时基信号中断是最方便的。
只要触发2Hz的时基信号中断,就可以达到0.5s的定时目的凌阳大学计划凌阳大学计划.twSUNPLUSTechnology for Easy Living用C写中断程序#include“SPCE061V004.H”#include“unSPMACRO.h”main(){INT_OFF();*P_IOA_Dir=0x00FF; *P_IOA_Attrib=0x00FF;*P_IOA_Data=0x0000;*P_INT_Ctrl=C_IRQ5_2Hz;//Setup interrupt INT_IRQ(); while(1) *P_Watchdog_Clear = C_WDTCLR;}凌阳大学计划凌阳大学计划.twSUNPLUSTechnology for Easy Living用C写中断程序#include"SPCE061V004.H"unsigned int g_uiOutput=0x0000;void IRQ5(void) __attribute__ ((ISR));void IRQ5(void){if(*P_INT_Ctrl&C_IRQ5_2Hz){//IRQ5_2Hz*P_IOA_Data=g_uiOutput;g_uiOutput^= 0xffff;*P_INT_Clear=C_IRQ5_2Hz;}} 凌阳大学计划凌阳大学计划.twSUNPLUSTechnology for Easy Living结语Ø从前面的例子可以看出,对硬件的设置和操作都是通过往硬件寄存器的地址里写入或读出数据实现的。
Ø其它设置,如AD、DA、Timer、UART、SIO等,都只是对相应的硬件寄存器进行操作而已,不再举例Ø欲了解更多关于用C对SPCE061A进行编程的信息,请到凌阳大学计划网站()下载《C语言在凌阳十六位单片机中的应用》凌阳大学计划凌阳大学计划.twSUNPLUSTechnology for Easy Living谢谢大家。












