重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
目前找不到C51(我用的是STC8051)的程序入口函数编辑方法。
创新互联网站建设公司是一家服务多年做网站建设策划设计制作的公司,为广大用户提供了成都网站建设、成都网站制作,成都网站设计,1元广告,成都做网站选创新互联,贴合企业需求,高性价比,满足客户不同层次的需求一站式服务欢迎致电。
STM32的程序入口函数编辑方法
STM32的编辑方法就比较简单,首先新建一个工程,不导入任何运行时环境(Run-time Environment),然后导入Startup_stm32xxxx_xx.s(ASM起动文件),调试工程选项中C/C++选项卡里包含需要导入的库文件。
随后找到151行 IMPORT __main
把main改为自己想要设置的入口函数就行了。
其实很多人就由于自己不会自定义C语言工程的问题,而又想先自己动手写代码实现“到手即用”,所以简单听老师对于程序的针对性讲解,默认按照main写入口函数,其实main这个名字就是商业化的结果,一些知名厂商是给你留下一个编辑空间改入口函数的,可惜大家都不知道,而且Keil5出了那么多年都不搞官方汉化,唉,亏死了很多英语词汇不足的业余程序爱好者。
然后很多人第一印象以为谭浩强是C语言之父,草,不就是早期写《C程序设计》然后被各个大学纷纷膜拜然后按图索骥的作者嘛,最忌讳应试教育搞出了填鸭式教育法让大家失去自主探索的机会。
函数定义好以后,要被其它函数调用了才能被执行。C
语言的函数是能相互调用的,
但在调用函数前,必须对函数的类型进行说明,就算是标准库函数也不例外。标准库函数的
说明会被按功能分别写在不一样的头文件中,使用时只要在文件最前面用#include
预处理语
句引入相应的头文件。如前面一直有使用的
printf
函数说明就是放在文件名为
stdio.h
的
头文件中。调用就是指一个函数体中引用另一个已定义的函数来实现所需要的功能,这个时候函
数体称为主调用函数,函数体中所引用的函数称为被调用函数。一个函数体中能调用数个
其它的函数,这些被调用的函数同样也能调用其它函数,也能嵌套调用。笔者本人认为
主函数只是相对于被调用函数而言。在
c51
语言中有一个函数是不能被其它函数所调用的,
它就是
main
主函数。调用函数的一般形式如下:
函数名
(实际参数表)
“函数名”就是指被调用的函数。实际参数表能为零或多个参数,多个参数时要用逗
号隔开,每个参数的类型、位置应与函数定义时所的形式参数一一对应,它的作用就是把参
数传到被调用函数中的形式参数,如果类型不对应就会产生一些错误。调用的函数是无参函
数时不写参数,但不能省后面的括号。
在以前的一些例子我们也能看不一样的调用方式:
1.函数语句
如
printf
("Hello
World!n");
这是在
我们的第一个程序中出现的,它以
"Hello
World!n"为参数调用
printf
这个库函数。在这里函数调用被看作了一条语句。
2.函数参数
“函数参数”这种方式是指被调用函数的返回值当作另一个被调用函数的实际参
数,如
temp=StrToInt(CharB(16));CharB
的返回值作为
StrToInt
函数的实际参数传递。
3.函数表达式
而在上一篇的例子中有
temp
=
Count();这样一句,这个时候函数的调用作为一个运算
对象出现在表达式中,能称为函数表达式。例子中
Count()返回一个
int
类型的返回
值直接赋值给
temp。注意的是这种调用方式要求被调用的函数能返回一个同类型的值,
不然会出现不可预料的错误。
前面说到调用函数前要对被调用的函数进行说明。标准库函数只要用#include
引入已
写好说明的头文件,在程序就能直接调用函数了。如调用的是自定义的函数则要用如下形
式编写函数类型说明
类型标识符
函数的名称(形式参数表);
这样的说明方式是用在被调函数定义和主调函数是在同一文件中。你也能把这些写到
文件名.h
的文件中用#include
"文件名.h"引入。如果被调函数的定义和主调函数不是在同
一文件中的,则要用如下的方式进行说明,说明被调函数的定义在同一项目的不一样文件之上,
其实库函数的头文件也是如此说明库函数的,如果说明的函数也能称为外部函数。
extern
类型标识符
函数的名称(形式参数表);
函数的定义和说明是完全不一样的,在编译的角度上看函数的定义是把函数编译存放在
ROM
的某一段地址上,而函数说明是告诉编译器要在程序中使用那些函数并确定函数的地
址。如果在同一文件中被调函数的定义在主调函数之前,这个时候能不用说明函数类型。也就
是说在
main
函数之前定义的函数,在程序中就能不用写函数类型说明了。能在一个函
数体调用另一个函数(嵌套调用),但不允许在一个函数定义中定义另一个函数。还要注意
的是函数定义和说明中的“类型、形参表、名称”等都要相一致。
有bit这个类型吗?
typedef int BOOL;
typedef unsigned int type_s;
typedef void(*funty)();
typedef type_s *type_s_point;
typedef BOOL(*bit_fun)(funty,type_s_point,type_s);
funty a;
type_s_point b;
bit_fun t_t;
BOOL pp(funty e,type_s_point f,type_s g)
{
e=0;
f=0;
g=0;
return 0;
}
void main()
{
t_t=pp;
(*t_t)(a,b,10);
}
delay函数是带参数的,编译时是利用寄存器传递参数的,中断程序中调用delay函数时,不定义寄存器区时,系统就会用同一个区的寄存器传递参数,所以不会错。而你人为定义了寄存器区,使得中断程序和delay使用了两个寄存器区,那就出错了。如果delay函数不带参数就不会出错了,所以,子函数还是不要改变寄存器区,由系统自动分配就好了。
先将TFT.c刈除,然后在添加进项目.
需要看TFT.c中的写法,如果没有实体就会link不到.
用定时器功能,设置定时器0的工作方式为方式1,然后定时50ms,再设置控制变量,设置变量要为整型,定时器初值设为TH0(65536-50000)/256、TL0=(65536-50000)%256,这种赋初值的晶振要求为12MHz,每次定时器溢出时控制变量加一,当控制变量加到2400时,定时已经达到两分钟这时你需要将控制变量清零然后运行你需要运行的代码即可,我有时间会给你上代码的
代码如下:
#include reg52.h
unsigned count;
void init();
void program();
void main()
{
init();
while(1)
{
if (count==2400)
{
count=0;
program();
}
}
}
//初始化函数设置定时器0的工作方式
void init()
{
TMOD=0x01; //设置定时器工作在方式0
TH0=(65536-50000)/256; //设置初值使其50ms产生一次中断
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void program()
{
//自定义函数
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256; //产生一次中断重新赋一次初值
count++; //记录中断的次数,每2400次中断为2分钟
}