一、C语言,单片机主要运用到那些?
在单片机的开发应用中,已逐渐开始引入高级语言,
C语言就是其中的一种。对用惯了汇编的人来说,总觉得高级语言’可控性’不好,不如汇编那样随心所欲。
但是只要我们掌握了一定的C语言知识,有些东西还是容易做出来的,以下是笔者实际工作中遇到的几个问题,希望对初学C51者有所帮助。
一、C51热启动代码的编制
对于工业控制计算机,往往设有有看门狗电路,当看门狗动作,使计算机复位,这就是热启动。
热启动时,一般不允许从头开始,这将导致现有的已测量到或计算到的值复位,导致系统工作异常。
因而在程序必须判断是热启动还是冷启动,常用的方法是:确定某内存单位为标志位(如0x7f位和0x7e位),
启动时首先读该内存单元的内容,如果它等于一个特定的值(例如两个内存单元的都是0xaa),就认为是热启动,
否则就是冷启动,程序执行初始化部份,并将0xaa赋与这两个内存单元。
根据以上的设计思路,编程时,设置一个指针,让其指向特定的内存单元如0x7f,然后在程序中判断,程序如下:
void main()
{ char data *HotPoint=(char *)0x7f;
if((*HotPoint==0xaa)&&(*(--HotPoint)==0xaa))
{ /*热启动的处理 */
}
else
{ HotPoint=0x7e; /*冷启动的处进
*HotPoint=0xaa;
*(++HotPoint)=0xaa;
}
/*正常工作代码*/
}
然而实际调试中发现,无论是热启动还是冷启动,开机后所有内存单元的值都被复位为0,当然也实现不了热启动的要求。这是为什么呢?原来,用C语言编程时,开机时执行的代码并非是从main()函数的第一句语句开始的,在main()函数的第一句语句执行前要先执行一段’起始代码’。正是这段代码执行了清零的工作。C编译程序提供了这段起始代码的源程序,名为CSTARTUP.A51,打开这个文件,可以看到如下代码:
.
IDATALEN EQU 80H ; the length of IDATA memory in bytes.
.
STARTUP1:
IF IDATALEN <> 0
MOV R0,#IDATALEN - 1
CLR A
IDATALOOP: MOV @R0,A
DJNZ R0,IDATALOOP
ENDIF
.
可见,在执行到判断是否热启动的代码之前,起始代码已将所有内存单元清零。如何解决这个问题呢?好在启动代码是可以更改的,方法是:修改startup.a51源文件,然后用编译程序所附带的a51.exe程序对 startup.a51编译,得到startup.obj文件,然后用这段代码代替原来的起始代码。具体步骤是(设C源程序名为HOTSTART.C):
修改startup.a51源文件(这个文件在C51LIB目录下)。
执行如下命令:
A51 startup.a51 得到startup.obj文件。将此文件拷入HOTSTART.C所在目录。
将编好的C源程序用C51.EXE编译好,得到目标文件HOTS
TART.OBJ。
用 L51 HOTSTART, STARTUP.OBJ 命令连接,得到绝对目标文件HOTSTART。
用 OHS51 HOTSTART 得到HOTSTART.HEX文件,即可。
对于startup.a51的修改,根据自已的需要进行,如将IDATALEN EQU 80H中的80H改为70H,就可以使6F到7F的16字节内存不被清零。
二、直接调用EPROM中已固化的程序
笔者用的仿真机,由6位数码管显示,在内存DE00H处放显示子程序,只要将要显示的数放入显示缓冲区,然后调用这个子程序就可以使用了,汇编指令为:
LCALL 0DEOOH
在用C语言编程时,如何实现这一功能呢?C语言中有指向函数的指针这一概念,可以利用这种指针来实现用函数指针调用函数。指向函数的指针变量的定义格式为:
类型标识符 (*指针变量名)();
在定义好指针后就可以给指针变量赋值,使其指向某个函数的开始存地址,然后用
(*指针变量名)()即可调用这个函数。如下例:
void main(void)
{
void (*DispBuffer)(); /*定义指向函数指针*/
DispBuffer=0xde00; /*赋值*/
for(;;)
{ Key();
DispBuffer();
}
}
三、将浮点数转化为字符数组
笔者在编制应用程序时有这样的要求:将运算的结果(浮点数)存入EEPROM中。我们知道,浮点数在C语言中是以IEEE格式存储的,一个浮点数占用四个字节,例如浮点数34.526存为(160,26,10,66)这四个数。要将一个浮点数存入EEPROM,实际上就是要存这四个数。那么如何在程序中得到一个浮点数的组成数呢?
浮点数在存储时,是存储连续的字节中的,只要设法找到存储位置,就可以得到这些数了。可以定义一个void的指针,将此指针指向需要存储的浮点数,然后将此指针强制转化为char型,这样,利用指针就可以得到组成该浮点数的各个字节的值了。具体程序如下:
#define uchar unsigned char#define uint unsigned intvoid FtoC(void)
{ float a;
uchar i,*px
uchar x[4]; /*定义字符数组,准备存储浮点数的四个字节*、
void *pf;
px=x; /*px指针指向数组x*/
pf=&a; /*void 型指针指向浮点数首地址*/
a=34.526;
for(i=0;i<4;i++)
{ *(px+i)=*((char *)pf+i); /*强制void 型指针转成char型,因为*/
} /*void型指针不能运算*/
}
如果已将数存入EEPROM,要将其取出合并,方法也是一样,可参考下面的程序。
#define uchar unsigned char#define uint unsigned int
void CtoF(void)
{ float a;
uchar i,*px
uchar x[4]={56,180,150,73};
void *pf;
px=x;
pf=&a;
for(i=0;i<4;i++)
{ *((char *)pf+i)=*(px+i);
}
}
以上所用C语言为FRANKLIN C51 VER 3.2。
二、单片机运用的是C语言,为什么不用C++呢?
学习单片机要有数字电路,模拟电路,计算机原理等课程作为基础的。学会C语言固然是好的。但是千万不要以为单片机的编程语言只是C语言。汇编语言非常重要,因为它是一中面向机器的语言,可以明确表明程序在芯片里如何运行的。只是计算机的根。等汇编语言搞懂以后,再考虑用C来写程序比较好。有时要用两种语言混合编程的。因为C语言的可移植性比较强。而汇编语言的代码效率最高。这样可以结合两种语言的优势编程。 至于你说单片机编程为什么不用C++?我想反问一句。即使你用C++写出来的程序,你能保证一定有编译器能编译它吗?其实吧,别说是单片机一般的系统软件都是用C语言写的程序,只有非常大型的程序,才有可能用C++.举个生活中的例子:如果你从家里到公司里去上班。一般的出行方式是:
1.坐公车
2.骑车
3.自己开车
4.坐地铁
5.走过去。如果谁要跟你说坐直升飞机去上班怎么样?你只能说这个有点不太正常吧。要不这个人太有钱了。打苍蝇的话用苍蝇拍子就行了。如果用巡航导弹打的话,岂不成了笑话吗?满意请采纳!!
三、怎么把C语言拷贝到单片机上?
1.使用单片机开发环境,将C程序编译成目标文件,并且将所需要的文件夹以及程序复制到单片机中。
2.在单片机上建立C程序的文件夹,将C程序复制到该文件夹下面。
3.根据需要,在单片机上配置C程序编译器,并通过编译命令编译C程序,生成目标文件,把目标文件拷贝到指定的文件夹下面。
4.把目标文件拷贝到相应的单片机芯片上面,并把C程序加载到单片机中。
四、单片机c语言和c语言区别?
单片机C语言和标准C语言之间存在一些差异,主要区别在于它们的应用场景和功能。
应用场景:单片机C语言主要用于嵌入式系统的编程,如单片机、微控制器等。这些设备通常具有有限的存储空间、处理能力和通信接口,因此需要优化代码和资源使用。而标准C语言则更常用于通用计算机编程,如操作系统、应用程序等。
库函数:标准C语言具有更丰富的库函数,可以提供更多的功能和便利性。例如,标准C语言提供了大量的输入输出函数、字符串处理函数、数学函数等。而单片机C语言通常需要手动编写这些函数,或者使用特定于设备的库函数,以适应设备的特殊需求。
数据类型:标准C语言具有更多的数据类型,如结构体、数组、指针等。这些数据类型可以帮助程序员更好地组织和管理代码。而单片机C语言通常需要手动管理内存和数据类型,以便在有限的存储空间和处理器能力下运行。
编译器:标准C语言可以使用更多的编译器进行编译,如GCC、Clang等。这些编译器可以生成可执行文件,适用于不同的操作系统和硬件平台。而单片机C语言通常需要使用特定于设备的编译器进行编译,以适应设备的硬件架构和指令集。
总之,单片机C语言和标准C语言在应用场景、库函数、数据类型和编译器等方面存在差异。在编写单片机程序时,需要根据具体设备和需求选择适合的编程语言。
五、单片机c语言编程论文
单片机C语言编程论文
近年来,随着技术的不断进步和社会的快速发展,单片机技术在各个领域中起着越来越重要的作用。而单片机C语言编程作为一种常见的程序开发语言,具有易学易用、灵活性强等优点,受到了广大开发者的青睐。本论文将对单片机C语言编程进行深入研究和探讨,旨在帮助读者了解单片机C语言编程的基本原理、应用场景以及未来发展方向。
一、单片机C语言编程的基本原理
单片机C语言编程是通过使用C语言在单片机上实现各种功能。C语言是一种高级编程语言,具有结构化、模块化等特点,使得程序的编写更加便捷和高效。单片机是一种集成了运算器、存储器和I/O接口等功能的微型计算机,通过单片机的引脚来控制外部电路,从而实现各种功能。
在单片机C语言编程中,首先需要了解C语言的基本语法和控制语句,如变量声明、循环结构、条件判断等,这些都是编写单片机程序的基础。同时,还需要熟悉单片机的硬件特性和寄存器的操作方法,以便能够充分发挥单片机的功能和性能。
在编写单片机C语言程序时,还需要注意一些特殊的编程技巧,如节省内存空间、提高程序执行效率等。此外,由于单片机资源有限,对于一些复杂的算法和数据结构,需要进行适当的优化和简化,以满足单片机的性能要求。
二、单片机C语言编程的应用场景
单片机C语言编程在各个领域中都有广泛的应用。以下是一些常见的应用场景:
1. 嵌入式系统开发
嵌入式系统是指集成了计算机硬件和软件的特定功能系统,其核心部分通常采用单片机进行控制和管理。单片机C语言编程在嵌入式系统开发中起到了至关重要的作用,开发者可以使用C语言编程来实现各种功能,如控制设备、采集数据、通信等。
2. 智能家居
随着人工智能技术的发展,智能家居正在逐渐普及。通过单片机C语言编程,可以实现智能家居中的各种功能,如智能照明、智能安防、智能家电控制等。C语言的灵活性和强大的功能使得开发者能够轻松地构建智能家居系统,并实现各种个性化的需求。
3. 工业控制
在工业领域中,单片机C语言编程广泛应用于工业控制系统中。通过编写C语言程序,可以实现工厂自动化、设备监控、过程控制等功能,提高生产效率和产品质量。
4. 电子设备开发
单片机C语言编程也是电子设备开发中常用的方法。通过使用C语言,开发者可以实现各种电子设备的驱动程序、控制程序等。C语言的易学易用性使得开发者能够快速地开发出高质量的电子设备。
三、单片机C语言编程的未来发展方向
随着技术的不断进步和需求的不断增长,单片机C语言编程在未来将继续发展和壮大。以下是一些可能的发展方向:
1. 更高级的编程语言
虽然C语言作为一种高级编程语言已经很受欢迎,但随着技术的发展,可能会出现更高级的编程语言。新的编程语言可能会更加注重开发效率和代码复用性,从而进一步简化和优化单片机程序的开发过程。
2. AI与单片机结合
人工智能技术的快速发展给单片机编程带来了新的机遇。将AI技术与单片机C语言编程相结合,可以实现更智能、更高效的单片机系统。例如,通过机器学习算法让单片机能够自主学习和优化程序,提高系统的性能和适应性。
3. 云端与单片机的连接
随着云计算和物联网技术的普及,将单片机与云端进行连接已成为可能。通过云端与单片机的连接,可以实现数据的远程传输、远程控制等功能,为单片机应用提供更大的灵活性和便利性。
总之,单片机C语言编程作为一种常见的程序开发方法,具有广泛的应用前景和发展空间。通过深入学习和掌握单片机C语言编程,开发者可以在各个领域中发挥巨大的作用,并为社会的快速发展做出贡献。
六、led单片机c语言编程
LED单片机C语言编程
单片机(Microcontroller)是一种集成了处理器(Microprocessor)核心与各种外围设备的芯片。在嵌入式系统中,我们经常使用单片机来控制各种硬件设备。
而C语言是一种高级程序语言,让开发者能够以更直观、便捷的方式进行编程。对于单片机编程来说,C语言也是非常常用的工具。
为什么选择LED单片机C语言编程?
在嵌入式系统中,LED(Light Emitting Diode)是最常见的输出设备之一。通过对LED的控制,我们可以实现各种闪烁、亮度调节等效果。
而单片机则是控制LED的核心部件。通过单片机的输入输出引脚,我们可以控制LED的状态,从而达到我们想要的效果。
而为什么选择C语言编程呢?首先,C语言是一种功能强大、灵活性高的编程语言。它可以处理低级硬件,以及执行复杂的算法和逻辑。而在单片机编程中,我们常需要对硬件进行底层控制,使用C语言可以更加方便地实现这些操作。
此外,C语言也具有较高的可移植性。无论是在不同型号的单片机还是不同的开发板上,我们都可以使用C语言来编写代码。这样一来,我们可以更轻松地将代码迁移到不同的硬件平台上,提高开发效率。
LED单片机C语言编程的基础知识
在开始LED单片机C语言编程之前,我们需要掌握一些基础知识。
首先,我们需要了解LED的工作原理。LED是一种半导体器件,当电流通过LED时,能够发出可见光。LED通常有两个引脚,一个是正极(Anode),另一个是负极(Cathode)。为了控制LED的亮灭,我们需要将正极连接到单片机的输出引脚,将负极连接到单片机的地引脚。
其次,我们需要熟悉单片机的引脚布局。对于不同型号的单片机,其引脚布局会有所差异。我们需要查阅相关资料,了解每个引脚的功能和特性。
最后,我们需要学习如何使用C语言来控制单片机的引脚。单片机通常具有多个输入输出引脚,我们可以通过编写C语言代码来设置这些引脚的状态,从而控制LED的亮灭。
LED单片机C语言编程的实例
下面我们将通过一个实例来演示LED单片机C语言编程的过程。
实例背景
假设我们有一块开发板,上面连接了一个LED。我们希望通过单片机来控制LED的亮灭,实现一个闪烁效果。
实例步骤
- 首先,我们需要了解开发板上连接LED的引脚号。假设LED连接在开发板的第1号引脚上。
- 然后,我们编写C语言程序,在程序中设置第1号引脚为输出引脚。
- 接下来,我们使用循环语句来控制LED的亮灭。通过设置第1号引脚的输出电平,我们可以实现LED的闪烁效果。
示例代码
<>
<head>
<script>
function blinkLED() {
var led = document.getElementById("led");
if (led.style.backgroundColor === "red") {
led.style.backgroundColor = "black";
} else {
led.style.backgroundColor = "red";
}
}
</script>
</head>
<body>
<h1>LED单片机C语言编程示例</h1>
<div id="led" style="width: 50px; height: 50px; background-color: black;"></div>
<button onclick="blinkLED()">闪烁</button>
</body>
</html>
上述代码中,我们使用了和JavaScript来模拟LED的闪烁效果。通过点击按钮,我们可以控制LED的亮灭。这个示例演示了LED单片机C语言编程的基本原理。
总结
LED单片机C语言编程是嵌入式系统开发中常见的任务。通过掌握C语言编程基础知识,我们可以灵活地控制LED的亮灭,实现各种效果。同时,C语言也具有较高的可移植性,使我们能够更轻松地将代码迁移到不同的硬件平台上。
关于LED单片机C语言编程的更多知识和技巧,我们还有很多可以学习和探索的地方。希望通过本文的介绍,能够让读者对LED单片机C语言编程有一个初步的了解,为进一步的学习打下基础。
七、单片机c语言编程示例
单片机C语言编程是嵌入式系统开发中的重要一环。通过学习和掌握C语言编程技巧,开发人员可以有效地实现对单片机的控制和管理。本文将以实例的形式介绍单片机C语言编程的基础知识和应用示例,帮助读者深入理解并掌握这一领域的技术。
基础知识准备
在开始学习单片机C语言编程之前,我们需要对以下基础知识有所了解:
- 单片机:单片机是一种集成电路,具有处理器、内存、IO端口等功能模块,可以独立运行。
- C语言:C语言是一种通用的高级编程语言,具有灵活性和高效性,极适合用于单片机等嵌入式系统的开发。
- 编程工具:为了进行单片机C语言编程,我们需要安装相应的编程工具,例如Keil C51、IAR Embedded Workbench等。
单片机C语言编程示例
以下是几个常见的单片机C语言编程示例,帮助读者更好地掌握和应用这一技术:
LED灯控制
LED灯控制是单片机C语言编程中最基础和常见的示例之一。我们可以通过控制单片机的IO端口输出电平来实现LED灯的开关控制。
#include <reg52.h>
sbit LED = P1^0;
void main()
{
LED = 0; // 将LED灯置为亮
while(1)
{
LED = ~LED; // 点亮和熄灭LED灯
Delay(); // 延时
}
}
上述代码通过引用reg52.h头文件,定义了单片机的IO端口和LED变量。在主函数中,通过不断翻转LED变量的值来控制LED灯的亮灭,并通过延时函数实现LED灯的闪烁效果。
温度传感器读取
温度传感器读取是单片机C语言编程中的另一个常见示例。通过连接温度传感器到单片机的ADC输入端口,我们可以实时读取环境的温度并进行处理。
#include <reg52.h>
sbit ADC_CS = P1^0; // 温度传感器的片选信号
sbit ADC_CLK = P1^1; // 温度传感器的时钟信号
sbit ADC_DOUT = P1^2; // 温度传感器的数据输出信号
unsigned char GetTemperature()
{
unsigned char dataH, dataL;
unsigned int temperature;
ADC_CS = 0; // 使能温度传感器
ADC_CLK = 0; // 温度传感器时钟置低
ADC_CLK = 1; // 第一个上升沿,起始位
ADC_CLK = 0;
dataH = ShiftIn(); // 高8位数据
dataL = ShiftIn(); // 低8位数据
temperature = (dataH << 8) | dataL;
ADC_CS = 1; // 禁用温度传感器
return temperature;
}
void main()
{
unsigned int temperature;
while(1)
{
temperature = GetTemperature();
// 根据温度值进行相应处理
Delay();
}
}
上述代码中,通过定义ADC_CS、ADC_CLK和ADC_DOUT三个IO端口变量,实现对温度传感器的读取控制。通过ShiftIn函数获取传感器输出的高8位和低8位数据,并进行处理。
蜂鸣器控制
蜂鸣器控制示例演示了如何通过单片机的IO端口控制蜂鸣器的发声。
#include <reg52.h>
sbit Buzzer = P1^0;
void Beep()
{
Buzzer = 1; // 发声
Delay();
Buzzer = 0; // 停止发声
Delay();
}
void main()
{
while(1)
{
Beep();
}
}
上述代码中,通过控制Buzzer变量控制蜂鸣器的发声和停止发声,并通过延时函数控制发声时间和停顿时间。
总结
单片机C语言编程是嵌入式系统开发中的重要一环。通过学习和应用单片机C语言编程,开发人员可以灵活控制和管理单片机,实现各种功能和应用。
本文介绍了单片机C语言编程的基础知识,并给出了LED灯控制、温度传感器读取和蜂鸣器控制等示例代码,帮助读者更好地理解和应用这一技术。
通过不断学习和实践,相信读者可以更加熟练地运用单片机C语言编程,开发出更多具有实际价值的嵌入式系统。
八、单片机c语言在什么上编译?
使用单片机专用的编译器,比如AVR单片机要用ICC for AVR、AVR Studio 等。
然后在选项中选择单片机型号,比如ATmega16、ATmega128。
最后要查询单片机所对应的库,也就是头文件。
包含对应的头文件,头文件中有定义好的单片机的变量名和函数,写程序要用到,比如引脚可能定义为PORTA,这些要记住,不可以写其他的变量名。
具体写程序,和普通的C程序没有什么区别。
九、C语言与单片机C语言的区别急求?
单片机c语言比起普通C语言增加了一些基本的指令,变量的赋值是16进制,当然单片机c语言只牵涉到普通c语言的基础部分。具体体现在:
1、单片机中C的语法一般都对 ANSI C有些扩展,及一些特殊写法 如C51扩展的 data xdata bit sbit 一类的,还有一些中断程序写法 void int() interrput 1 一类的。
2、C是一门语言,由对应平台的编译器编译成对应平台汇编的程序,各平台的汇编不一样,当然编译器也不一样 DOS上的TC2 TC3 WINDOWS上的VC 8051的C51都有自已的编译器 。具体区别是由编译器决的,只能参考对应的编译手册,即使同种平台不同的编译器对C的扩展也有不同。
3、单片机c语言编程是基于C语言的单片机编程。单片机的C语言采用C51编译器(简称C51)。由C51产生的目标代码短,运行速度高,存储空间小,符合C语言的ANSI标准,生成的代码遵循Intel目标文件格式,而且可与A51汇编语言PL/M51语言目标代码混合使用。
C51本质就是C,是为在单片机上使用C而出来的,如果C不牢固,还是多掌握一点C再学C51,不过新增的知识也不少,而且基本上跟C无关。
4、C只是一种高级语言。它除具有一般高级语言的功能特性外,它可以很好的操作底层的硬件接口。在C语言的基础上,如果你把一些单片机的端口或特殊功能寄存器加于定义,使之方便于在 写语句的时候,直接直观的编写。这样就差不多是单片机C语言。
C语言的特性差不多都可以用于单片机C语言,因为它们的编译机理都是一样的。
十、c语言中的链表实际运用?
C语言中的链表可以用于实现复杂的数据结构,如栈、队列、图、二叉树等,还可以用于实现字符串的存储、图形的绘制、多线程的实现等。