2864编程
‘壹’ protues仿真中的EEPROM2864如何写入数据
protues仿真中对EEPROM2864写入数据,要用单片机。
这里,你要搞清一件事,你在网上看到的实验报告,用2864做彩灯,那是做实物实验,可以用单片机开发板先把彩灯的编码写到2864芯片中去,然后拔下来2864,再插到彩灯控制板上去。用2864做彩灯的好处是,不用单片机,更不用编写单片机程序,因为没有学过单片机确实不会编程。而又可以控制彩灯有很多种变化的花样,电路也简单。确实比用纯数字电路控制简单多了。可是,实验是不便用EPROM2764的,烧录数据困难,需要编程器。
再回到proteus仿真,做同样的电路,却无法实现,因为仿真时,那个2864需要用单片机往芯片里写彩灯编码,又要写单片机程序。过程反倒麻烦了,用单片机向2864里写编码,再读出来,再去控制彩灯,这2864倒成了多余的。因为,往2864里写编码和读编码省掉,直接用编码控制彩灯就行了。更主要是又用了单片机,再用2864就更意义啦。
那么仿真,也不用单片机,耍换成EPROM27C64才行,而编码是可以生成HEX代码文件,加载到27C64中,相当于用2864做实物一样的简单方便了。仿真图如下所示。
控制彩灯的编码数据,写成一个简单的C程序,就是一行定义数组的语句,把一组编码写到一对大括号内,然后用keil 编译成HEX代码文件就能加载到27C64中了。例如,仿真图中的控制代码数据,写成下面的一行语句就行了。
unsigned char code light[]=
{0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff,
};
‘贰’ 求2864EEPROM的写操作程序
2864可以直接写呀
用MOVX@ 指令就行了
MOVX @DPTR,A 将A的值写入到DPTR指定的存储器地址中。
‘叁’ 用51单片机设计可编程乐曲演奏器
............我也急
‘肆’ 单片机多点温度控制系统设计的程序设计
单片机的多点温度控制系统
DSl8820温度传感器的内部存储器包括9B高速暂存RAM和1B非易失性的可电擦除的E2PROM,后者存放高温度和低温度触发器TH,TL和结构寄存器,该字节第7位(TM)为0,低5位一直都是1,第6,5位(R1,R0)用来设置分辨率,如表1所示。
根据DSl8820的通信协议,主机控制DSl8820完成温度转换必须经过3个步骤:每一次读写之前都要对其进行复位,复位成功后发送1条ROM指令,最后发送RAM指令,这样才能对DSl8820进行预定的操作。复位要求主CPU将数据线下拉500μs,然后释放,DSl8820收到信号后等待16~60μs左右,后发出60~240μs的存在低脉冲,主CPU收到此信号表示复位成功。由于DSl8820采用的是单线进行控制与读取数据,因此对操作的时序要求非常严格,否则由于时序不匹配,将无法完成对器件的正确操作。
2.3控制执行那分
(1)壁挂炉燃烧系统控制。控制电路采用了脉冲继电器器件作为整个系统的总控部分,当所有居室温度均达到设定值时,停止壁挂炉的工作。该继电器的特点是:当线圈收到一个脉冲信号后,线圈通电,电磁铁吸合,带动触头闭合接通需要控制的电路,当下一个信号到来后,电磁铁吸合,触头断开,切断被控制的电源,因此其具有自锁和信号遥控功能。由于磁铁的作用,控制脉冲消失后滑片位置不发生变化,保持稳定状态,所以该器件具有功耗小、具有记忆功能。
(2)居室温度控制。各居室温度控制在燃烧控制系统工作前提下,根据各居室温度测量返回值,采用上海欧凯电磁阀制造有限公司生产的OK6515自保持脉冲电磁阀控制各回路的通断。脉冲电磁阀采用脉冲和永磁技术,只需通过控制器切换脉冲的电极触点来改变电磁阀的开关状态,当控制器发出电脉冲时,驱动阀芯克服永磁力产生上下移,使阀瓣到位后在永磁作用下处于自保持状态。
2.4图形液晶显示模块
为了能够提供形象直观的用户显示界面,系统采用图形液晶显示模块LCDl2864,其具有8位标准数据总线、6条控制线及电源线,可与CPU直接接口,显示各种字符及图形。考虑到系统中汉字的使用量少,因此选用不带汉字库的LCD。对于使用的汉字分别提取其字模并以二进制形式保存于内部FLASHROM中。
3系统软件设计
系统软件设计主要依据系统程序流程以及DSl8820的时序要求进行代码编写。为了降低开发难度,提高开发效率,系统开发中引入了μC/OS一Ⅱ嵌入式操作系统并移植了LCD显示驱动。另一方面,为了确保对DSl8820操作时序的精确性,对DSl8820进行初始化和读写代码仍采用汇编语言。
3.1系统数据结构
系统所需数据结构包括各测温元件的序列号表,汉字字模存储、系统运行时间表存储、各温控点的设定值及测量值、系统时间的存放及一些临时数据存储。
为了区别多个温度传感器,在系统初始化时读入传感器中的64位序列号,并将其存入程序存储空间,以便程序运行期间进行比对,共需64B。汉字字模采用16×16字库进行提取,其中每个汉字需32B,约15个字,为了方便程序功能的升级改进,在程序存储空间中按20个字进行空间分配,需要存储空间640B。系统运行时间表的设计以小时为设置单位,需要保存24个值;为了减少时间比较过程中的数据计算量以及方便编程,对每个值采用一个字节存储,这里共需24B存储空间,这里仍然使用程序存储空间进行存储,以便在系统掉电时设定值不会丢失。
3.2系统程序设计
系统程序设计主要使用KeilC5l进行编写,但由于对DSl8820器件的读写时序要求比较严格,故采用汇编代码,其中温度读取子程序主要代码如下:
‘伍’ c++编程错误列表及解决方案
C++常见编译/链接错误及其解决办法
1. 解决error LNK2005: ___crtExitProcess 已经在 LIBCMTD.lib(crt0dat.obj) 中定义
有的时候, 在 Debug 模式下编译没问题, 换到 Release 模式就发生一堆问题.
典型的例子, 就是因为 c++ runtime library 设定不同, 所造成的重复定义连结错误.
而另一个常见的例子是 专案与 library 使用不同的字符集合设定
(如: 一个用 Unicode Character Set, 另一个用 Multi-Byte Character Set)
这个错误发生原因, 有可能是
1. 你 link 的 lib 使用 C++ Multi-threaded DLL (/MD)
2. 而你的 source 使用的 C++ runtime library 是 Multi-threaded (/MT)
导致重复定义
解决方法:
两个使用相同的 C++ runtime library.例如都使用 static 的 Multi-threaded (/MT).
2. 错误 1error LNK2005: "private: __thiscall type_info::type_info(class type_info const &)" (??0type_info@@AAE@ABV0@@Z) 已经在 LIBCMT.lib(typinfo.obj) 中定义 MSVCRTD.lib
项目 -> 属性 -> c/C++ -> 代码生成 -> 运行时库 设置为: 多线程调试 DLL (/MDd)
被引用的库和调用的程序编译选项不同,需要改成一致后编译
3.#pragma once与 #ifndef的区别
为了避免同一个文件被include多次
1 #ifndef方式
2 #pragma once方式
在能够支持这两种方式的编译器上,二者并没有太大的区别,但是两者仍然还是有一些细微的区别。
方式一:
#ifndef __SOMEFILE_H__
#define __SOMEFILE_H__
... ... // 一些声明语句
#endif
方式二:
#pragma once
... ... // 一些声明语句
#ifndef的方式依赖于宏名字不能冲突,这不光可以保证同一个文件不会被包含多次,也能保证内容完全相同的两个文件不会被不小心同时包含。当然,缺点就是如果不同头文件的宏名不小心“撞车”,可能就会导致头文件明明存在,编译器却硬说找不到声明的状况
#pragma once则由编译器提供保证:同一个文件不会被包含多次。注意这里所说的“同一个文件”是指物理上的一个文件,而不是指内容相同的两个文件。带来的好处是,你不必再费劲想个宏名了,当然也就不会出现宏名碰撞引发的奇怪问题。对应的缺点就是如果某个头文件有多份拷贝,本方法不能保证他们不被重复包含。当然,相比宏名碰撞引发的“找不到声明”的问题,重复包含更容易被发现并修正。
方式一由语言支持所以移植性好,方式二 可以避免名字冲突
4.error LNK2019: 无法解析的外部符号 __imp__PathCombineW
PathCombine是Shell api 需要引入库#pragma comment( lib, "shlwapi.lib")
5.error C2662: "MyClass::GetName()”: 不能将“this”指针从“const MyClass”转换为“MyClass &”
bool MyClass::operator==(const MyClass* n1) const
{return GetName() == n1->GetName();}
原因是不能在const函数中调用对象的非const方法,MyClass中的GetName()必须是const的。
6.template 模板
模板声明和定义必须在同一个文件中,而且只有实例话模板类型时才编译模板实例
7.error C2275: “MyClass”: 将此类型用作表达式非法 MyClass.Instance();
原因:Instance是静态方法,用.引用会出错。应该是MyClass::Instance()
8.error LNK2019: 无法解析的外部符号 "public: __thiscall MyClass(void)
原因:只声明了构造函数,MyClass(); ,但未定义。 可以定义空函数,或者直接注释掉,使用默认构造函数。
9.error C2504: “testing”: 未定义基类
class PackToolTest : testing.Test {}
原因:Test是testing命名空间下的一个类,需要用域操作符,testing::Test
还有一个问题,缺少基类继承权限(public、protected、private)
10.error C2864: “MyClass::_nullpack”: 只有静态常量整型数据成员才可以在类中初始化
class MyClass {string _nullpack = "test";}
原因:c++ 中,成员变量不能在声明时初始化,而是在构造函数初始化列表中先初始化
11.error LNK2019: 无法解析的外部符号_WinMain@16int main()
原因:由于创建的是Win32 Project,和Win32 console Project的链接库不同
方法1:在程序最开始的地方加上以下语句
#pragma comment(linker, "/subsystem:console ")
方法2:project > > setting > > 在link 的project options 中将/subsystem:windows(console)删了
12.类似“已经在 msvcprtd.lib(MSVCP80D.dll) 中定义”问题
vs2005 Debug /Release需要分别配制
分析一下错误来源,会发现:
1. 错误来源主要是重复定义的问题,而且重复定义的基本上都是VC Runtime和Standard C++ Library中的函数
2. LIBCMT和LIBCPMT为Release下的Lib,本来不应该出现在Debug版本的链接的Lib中
3. 重复定义的问题主要出现在:LIBCMT, LIBCPMT, MSVCPRTD, MSVCRTD
来看看出问题的LIB是那些:
1. LIBCMT:C Runtime库的多线程静态链接的Release版本
2. LIBCPMT:C++ Standard Library的多线程静态链接的Release版本
3. MSVCPRTD:C++ Standard Library的多线程DLL的Debug版本
4. MSVCRTD:C Runtime Library的多线程DLL的Debug版本
当 前我们的配置是多线程DLL的Debug版,因此3和4是应该出现在link的列表中的,不属于多余。而后两者则是只是当多线程静态链接Release版 中才会出现。这提示我在项目中加入的ANTLR.LIB可能是造成这个问题的根源,因为静态库的编译选项很容易和主程序发生冲突,并且根据实际信息我们可 以看出ANTLR.LIB应该是用多线程静态链接的Release版本来编译的。
解决方法:
1、首先查看编译项目依赖的其他项目的运行时库是否一致
2、如果不一致,改为同样的运行时库,如在下编译的是:“多线程调试 DLL (/MDd)”,现在需要把所有的依赖项目的运行时库都改为一致的库,就OK了。
13.error C2143: 语法错误 : 缺少“;”(在“*”的前面)
原因:产生错误处,某类型未include,可能头文件名拼写错误、头文件名已更改
14.error C2572: “MyClass::Invoke”: 重定义默认参数 : 参数 2
string MyClass::Invoke(const CParam& paraObj, INVOKETYPE type = ASYN)
原因:默认参数,只需在声明时指定。方法定义的时候无需指定默认参数。
string MyClass::Invoke(const CParam& paraObj, INVOKETYPE type /*= ASYN*/)
{ ... }。。。。。
希望对你有用
‘陆’ 怎样往EEPROM2864中存入16进制数据。要靠软件编程还是可以硬件实现 这个问题你是怎么解决的。
找一个 EEPROM 写入器,与PC 连接后,用写入器自带的工具软件即可写入。
‘柒’ 怎样往EEPROM2864中存入16进制数据。要靠软件编程还是可以硬件实现
你好!不知问题是否已经解决?
看没有人回答,我还是根据自己的经验来说一点吧!
2864是一片128K的EEPROM存储芯片,要将数据存入此芯片中,
首先肯定是需要有硬件支持的,有了硬件再根据此芯片的时序要求和操作步骤进行软件编程,这样才能将数据存入。
而且,EEPROM中存储的数据本来就是16进制的,初始状态下全为0xFF。
不知道是否是你想要的答案!
‘捌’ 可编程彩灯控制器
用PLC的方式可以完成,但程序会很复杂!建议你用单片机的程序或许可以更好的实现这些功能!不过本人的单片机学的不好!
‘玖’ 用proteus仿真时用到eeprom2864,如何将数据写入eeprom2864中
方法如下:
1、在编程软件Micro/WIN的Data Blocek(数据块)中定义V数据区存储单元的初始值,下载数据块时,这些数值也被写入到相应的EEPROM单元中。
2、用特殊存储器SMB31、SMW32,用编程方法将V存储区的数据写入EEPROM
3、在System Block(系统块)中设置数据保持功能,可将MB0 - MB13的内容在CPU断电时自动写入到EEPROM中.