390 likes | 618 Views
电子竞赛 之 C 语言应用. 这个 ppt 的重点在于讲述如何使用 C 语言来对 SPCE061A 单片机进行编程。 希望这个 ppt 对同学们有所帮助。. 前言. 凌阳 C 语言简介 凌阳 C 语言基础 C 和汇编混合编程 用 C 来直接控制硬件. 目录. 凌阳 C 语言简介. 寄存器分配、数据类型等由编译器管理。 编程及调试的时间减少,大大缩短开发周期。 明显增加软件可读性,便于改进和扩充。. 用 C 语言编程的优点. IDE 直接提供了 C 语言的开发环境, C 函数和汇编函数可以方便地进行相互调用。 Software Libraries
E N D
电子竞赛 之 C语言应用
这个ppt的重点在于讲述如何使用C语言来对SPCE061A单片机进行编程。这个ppt的重点在于讲述如何使用C语言来对SPCE061A单片机进行编程。 希望这个ppt对同学们有所帮助。 前言
凌阳C语言简介 凌阳C语言基础 C和汇编混合编程 用C来直接控制硬件 目录
寄存器分配、数据类型等由编译器管理。 编程及调试的时间减少,大大缩短开发周期。 明显增加软件可读性,便于改进和扩充。 用C语言编程的优点
IDE直接提供了C语言的开发环境,C函数和汇编函数可以方便地进行相互调用。IDE直接提供了C语言的开发环境,C函数和汇编函数可以方便地进行相互调用。 Software Libraries Standard C library Hardware library SACM ( Sunplus audio coding method) 用C语言可以很方便地对SPCE061A进行编程
char和unsigned char为16位 这与一般机器使用的GCC数据类型之间有一些差别。 float与double均存储为32位浮点数 unSP汇编的float与double分别是32位与64位浮点数。 数据类型应该注意的地方
如果使用signed和unsigned两种数据类型,将使存储空间成倍增长。如果使用signed和unsigned两种数据类型,将使存储空间成倍增长。 因为使用signed和unsigned两种数据类型的库函数是不同的,使用signed和unsigned,就得同时使用这两种格式类型的库函数, 最好采用unsigned格式。 在编程时,如果只强调程序的运算速度而又不进行负数运算时,最好采用unsigned格式。 关于变量的signed和unsigned
unSP IDE和Turbo C一样,实参的求值顺序是从右到左的,如下例: i=3;printf("%d,%d",i,i++); 关于实参求值顺序 输出 4,3
C调用汇编函数 汇编调用C函数 C中嵌入在线汇编 混合编程的三个方面
要求汇编函数名也以下划线“_”为前缀 因为C编译器产生的所有标号都以下划线“_”为前缀。 在进行参数传递时,参数以相反的顺序(从右到左)被压入栈中。 汇编函数的16位返回值存放在寄存器R1中。32位的返回值存入寄存器对R1、R2中;其中低字在R1中,高字在R2中。 C调用汇编函数
在线汇编指令格式: asm (“汇编指令模板”:输出参数:输入参数) C中嵌入在线汇编
在C对P_IOA_Dir赋值0x1234,则嵌入汇编的实现方式如下:在C对P_IOA_Dir赋值0x1234,则嵌入汇编的实现方式如下: asm(“.define P_IOA_Dir 0x7002”); int main(void) { asm("[P_IOA_Dir] = %0" : : "r"(0x1234)); } 利用嵌入式汇编写端口寄存器
把P_IOA_Dir的值读出并保存在C中的一个int变量j里 ,则嵌入汇编的方式如下: asm(“.define P_IOA_Dir 0x7002”); int main(void) { int j; asm("%0 = [P_IOA_Dir]" : "=r"(j)); } 利用嵌入式汇编读端口寄存器
#define P_IOA_Dir (volatile unsigned int *)0x7002 int main(void) { int j; * P_IOA_Dir=0x1234; j= * P_IOA_Dir; } 使用纯C对寄存器进行操作
//设置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; 用C进行IO设置
#define P_SystemClock (volatile unsigned int *)0x7013 *P_SystemClock = System_Information System Information = CPU Clock + 32K Mode + 32K Status + Fosc 用C进行系统时钟设置
CPU Clock的取值可以是以下几种: C_Fosc Fosc C_Fosc_Div_2 Fosc/2 C_Fosc_Div_4 Fosc/4 C_Fosc_Div_8 Fosc/8 (默认值) C_Fosc_Div_16 Fosc/16 C_Fosc_Div_32 Fosc/32 C_Fosc_Div_64 Fosc/64 C_Sleep Stop (睡眠) 用C进行系统时钟设置
32K Hz Mode 的取值可以是以下几种: C_StrongMode 强振模式 C_AutoMode 弱振模式 (默认值) 32K Hz Sleep Status的取值可以是以下几种: C_32K_Work睡眠时,32K时钟仍工作 (默认) C_32K_Off 睡眠时,32K时钟停止工作 用C进行系统时钟设置
Fosc的取值可以是以下几种: C_Fosc_24M 24.576M (默认值) C_Fosc_20M 20.480M C_Fosc_32M 32.768M C_Fosc_40M 40.960M C_Fosc_49M 49.152M 用C进行系统时钟设置
这个例子是进行系统时钟设置。读者可以选择不同的Fosc_CLK和CPU_CLK,观察发光二极管亮灭快慢。这个例子是进行系统时钟设置。读者可以选择不同的Fosc_CLK和CPU_CLK,观察发光二极管亮灭快慢。 硬件连接:A口低八位接八个共阳的发光二极管 现象:根据Fosc_CLK和CPU_CLK的不同,观察发光二极管亮灭速度也不同 用C进行系统时钟设置
程序代码 #include "SPCE061V004.H" void Delay(); #define Fosc_CLK_RATE C_Fosc_49M; //Fosc #define CPU_CLK_RATE C_Fosc_Div_2; //CPUClk 用C进行系统时钟设置
main() { unsigned int Fosc_CLK,CPU_CLK; *P_IOA_Dir = 0x00FF; // IOA: [7..0] output *P_IOA_Attrib = 0x00FF; *P_IOA_Data = 0; 用C进行系统时钟设置
Fosc_CLK = Fosc_CLK_RATE; CPU_CLK = CPU_CLK_RATE; *P_SystemClock = Fosc_CLK|CPU_CLK; 用C进行系统时钟设置
while(1) { *P_IOA_Data = 0x00FF; //LED off Delay(); *P_IOA_Data = 0; //LED on Delay(); } } 用C进行系统时钟设置
在IDE162下,中断服务程序只能用汇编(包括嵌入式汇编)来写。在IDE162下,中断服务程序只能用汇编(包括嵌入式汇编)来写。 在IDE180下,用户多了一种选择,那就是可以用C来写中断。 用C写中断程序
要求:定时0.5s,使A口的8个二极管闪烁。 分析:定时0.5s采用哪个时基信号比较方便呢?SPCE061A单片机时基信号频率丰富,有2Hz、4Hz、8Hz、16Hz、32Hz、64Hz、128Hz、256Hz、512Hz、1024H、2048Hz、4096Hz等多种频率。我们可以很明显的看出2Hz时基信号中断是最方便的。只要触发2Hz的时基信号中断,就可以达到0.5s的定时目的。 用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; } 用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; }} 用C写中断程序
从前面的例子可以看出,对硬件的设置和操作都是通过往硬件寄存器的地址里写入或读出数据实现的。从前面的例子可以看出,对硬件的设置和操作都是通过往硬件寄存器的地址里写入或读出数据实现的。 其它设置,如AD、DA、Timer、UART、SIO等,都只是对相应的硬件寄存器进行操作而已,不再举例。 欲了解更多关于用C对SPCE061A进行编程的信息,请到凌阳大学计划网站(www.unsp.com.cn)下载《C语言在凌阳十六位单片机中的应用》。 结语