在单片机的开发和应用中,高级语言已经逐渐被引入。
c语言就是其中之一。对于习惯于组装的人来说,他们总是觉得可控性高级语言的不好,所以不如汇编自由。
但是,只要我们有一定的c语言知识,有些东西还是很容易做出来的。以下是笔者在实际工作中遇到的一些问题,希望对c51初学者有所帮助。
一、c51热启动代码的编译
对于工业控制计算机,通常有一个看门狗电路。当看门狗动作时,计算机复位,这是热启动。
一般情况下,热态启动时不允许从零开始,这会导致现有的测量值或计算值被重置,从而导致系统运行异常。
所以当一个程序必须判断是热启动还是冷启动时,常见的方法有:确定某个内存单元为标志位(如0x7f位和0x7e位),
启动时,首先读取存储单元的内容,如果它等于特定值(例如,两个存储单元都是0xaa),则认为是热启动。
否则就是冷启动,程序执行初始化部分,给这两个存储单元赋值0xaa。
按照上面的设计思路,在编程的时候,设置一个指针指向某个特定的存储单元,比如0x7f,然后在程序中进行判断。该计划如下:
voidmain()
{chardata*hotpoint(char*)0x7f
if((*hotpoint0xaa)ampamp(*(-hotpoint)0xaa))
{/*热启动的处理*/
}
其他
{hotpoint0x7e/*冷启动进度
*hotpoint0xaa
*(热点)0xaa
}
/*正常工作代码*/
}
但在实际调试中发现,无论是热启动还是冷启动,启动后所有存储单元的值都被重置为0,当然也无法实现热启动的要求。这是为什么呢?原来用c语言编程时,启动时执行的代码并不是从main()函数的第一句开始,而a开始代码应该在main()函数的第一句执行之前执行。正是这个代码执行清除工作。c编译器提供了这个初始代码的源程序,命名为cstartup。a51打开这个文件,可以看到下面的代码:
。
idatal:
如果idatalenltgt0
movr0,#伊达伦-1
clra
idataloop:·mov
djnzr0,idata环
endif
。
可以看出,初始代码在执行代码判断是否热启动之前,已经清空了所有的存储单元。如何解决这个问题?幸运的是,可以通过修改startup.a51的源文件,然后用编译器附带的a51.exe程序编译startup.a51得到startup.obj文件,再用这段代码替换原来的启动代码,来改变启动代码。具体步骤是(设c源程序命名为hotstart。c):
修改startup.a51源文件(该文件位于c51lib目录中)。
执行以下命令:
a51startup.a51获取startup.obj文件。将该文件复制到hotstart的目录中。c
用c51.exe编译编译好的c源程序,得到目标文件hots。
酸酸的。obj.
使用命令l51hotstart,startup进行连接。obj获得绝对目标文件热启动。
获得快速启动。带ohs51热启动的十六进制文件。
startup.a51的修改要根据自己的需求进行。例如,如果idatal:。
lcall0deooh
用c语言编程如何实现这个功能?c语言中有一个函数指针的概念,可以用函数指针来调用函数。函数指针变量的定义格式为:
类型标识符(*指针变量名)()
定义指针后,可以给指针变量赋值以指向函数的起始地址,然后使用
(*指针变量名)()可以调用这个函数。例如:
无效总管(无效)
{
void(*dispbuffer)()/*定义指向函数的指针*/
dispbuffer0xde00/*赋值*/
用于()
{密钥()
调度缓冲区()
}
}
3、将浮点数转换成字符数组
作者在编写应用程序时有这样一个要求:运算结果(浮点数)存储在eeprom中。我们知道,浮点数在c语言中是以ieee格式存储的,一个浮点数占用四个字节。例如,浮点数34.526存储为四个数字(160,26,10,66)。要求在eeprom中存储一个浮点数,其实就是存储这四个数。那么如何在程序中得到一个浮点数的组成呢?
存储浮点数时,它们存储在连续的字节中。只要你试着找到存放地点,就能得到这些数字。可以定义一个void的指针,将指针指向要存储的浮点数,然后将指针强制转换为char类型,这样就可以使用指针得到构成浮点数的每个字节的值。具体程序如下:
#defineucharunsignedchar#defineuintunsignedintvoidftoc(void)
浮动a
uchari,*px
ucharx[4]/*定义了一个字符数组,准备存储4个字节的浮点数*,
void*pf
pxx/*px指针指向数组x*/
pfampa/*void指针指向浮点数的第一个地址*/
a34.526
用于(ioilt4i)
{*(pxi)*((char*)pfi)/*强制将void指针改为char,因为*/
}/*void指针不能操作*/
}
如果号码已经存在eeprom中,就要取出来合并,方法相同。请参考以下程序。
#defineuchar无符号char#defineuint无符号int
voidctof(无效)
浮动a
uchari,*px
ucharx[4]{56,180,150,73}
void*pf
pxx
普法帕
用于(ioilt4i)
{*((char*)pfi)*(pxi)
}
}
上面使用的c语言是富兰克林c51v
什么是单片机?
答::单片机因将其主要部件集成在一个芯片上而得名,具体来说就是将中央处理器、随机存取存储器rom(只读存储器、中断系统、定时器/计数器、i/o(输入/输出)接口电路等主要微机部件集成在一个芯片上。虽然单片机只是一个芯片,但从组成和功能上来说,它具有计算机系统的属性,所以简称为单片机(scmc)。
单一的单片机的发展历史并不长,但单片机发展很快,种类太多,从1位、4位、8位到16位、32位单片机,集成度更高,功能更强,应用更广。如今,高速单片机已经发展到300m。
单片机的分类及应用领域
1.单片机的分类
根据控制应用的需要,单片机可分为通用型和专用型。通用单片机是一种基础芯片,内部资源丰富,性能全面,适用性强,可以覆盖多种应用需求。用户可以根据自己的需求为不同的应用设计控制系统,即一般的单片机都有一个重新设计的过程。
通过用户的进一步设计,可以形成以通用单片机为核心,配以其它外围电路的应用控制系统。
2.单片机的应用领域
(1)工业自动化。工业生产的自动化可以使工业系统处于最佳状态,提高经济效益,提高产品质量,降低操作人员的劳动强度。因此,自动化技术已广泛应用于机械、电子、电力、石油、化工、纺织、食品等轻重工业领域。在工业自动化技术中,无论是过程控制技术、数据采集与测控技术,还是生产线上的机器人技术,都需要单片机的参与。在工业自动化领域,机电一体化技术将发挥越来越重要的作用。在这项集机械、微电子和计算机技术于一体的综合技术中,单片机将发挥越来越重要的作用。
(2)仪器仪表。现代仪器仪表的自动化、智能化要求越来越高,最好用单片机来实现。随着单片机的使用,将加速仪器仪表的数字化、智能化、多功能化和柔性化。
性化的发展。而且,单片机的使用还有助于提高仪器的精度和准确度,简化结构,减小体积和质量,便于携带和使用。还具有降低成本、增强抗干扰能力、便于增加显示、报警和自诊断等功能。
(3)家用电器。智能化是家电的发展趋势,也是家电产品的进一步提高。;智能化需要单片机的参与,所以厂家经常标榜"计算机控制与应用提高自己产品的档次,如洗衣机、冰箱、空调、微波炉、电视机和视听设备等。"计算机与电子产品这里说的其实是单片机。
幸福在于知足上海2019年7月25日。