51单片机的程序移植到avr单片机应该怎样移植 注意什么问题 ?
avr单片机c语言 icc编译器不支持位操作
可以改 比如第一句DS1302_clk-1 |=(1<<7) 是都是ds1302-clk=1;
ds1302——clk置0时可以这样写; DS1302_clk_0 &=~(1<<7) ;
其他的一样,这个位 操作很重要,建议还是找本书 研读一下,以后都会用
硬件改了引脚,在程序中,有关用sbit 定义的引脚,就要重新定义了。
还有原程序中,有延时子程序的,要根据实际测试进行修改了,因STC15是1T的单片机,延时要变短了。
其它的问题,就要根据实际运行情况查找原因现修改了。
最后要问一句,换了STC15,芯片的引脚排列是有变化的,那还是原来的板子吗?
头文件不需要自己写,每种编译器有自带的头文件,只要#include就可以了,不过要include对。
二、51单片机(包括STC的)程序移植到AVR平台上需要注意事项
1) 头文件, 寄存器名,寄存器设置代码都是要相应修改的。
2) IO端口的位操作要做相应的调整。
3) 中断服务函数的格式也有不同,需做相应调整 。
4) 51单片机的端口寄存器复位值为1,因此作为输出端口时,即使程序中不作设置,也会输出高电平, 而AVR单片机中端口寄存 器PORTX 复位值为0, 因此51单片机的程序移植到avr单片机中时一定要注意端口初始化代码, 假设51程序中没有进行初始化,那么端口默认为高, 到了avr中,如果照搬原来的程序,端口就变成低电平,可能导致系统不能正常运行,而且不好查出来问题.
5) 由于两者对于长字节数据存放的方式不同,从地址到高地址, 51平台上依次存放高字节和低字节, AVR上依次存低字节和高字节, 所以如果程序中涉及到采用联合体或是依次访问内存地址的方法对长字节数据进行分离的话,就要注意低地址里读取的是高字节还是低字节了。比如: union UNI_2BYTE {uint dat; uchar tab[2]; }wdat;
在这个联合体wdat中, 成员dat是个占2个字节长度的整形数, 那么wdat.tab[0]表示dat的低地址的那一个字节,如果是在keil c中, 由于规定低地址存放高字节, 那么wdat.tab[0]就是dat的高字节; 如果是在IARAVR或者ICCAVR中,由于低地址存放低字节, 那么wdat.tab[0]就是dat的低字节。
一楼的说法基本没有错。
先要选择好编译器,C编译器如GCC,ICC,CVAVR,IAR等,看你选哪种编译器,汇编编译器如AVR Studio。
头文件不需要自己写,每种编译器有自带的头文件,你只要#include就可以了。不过要include对。
51程序(针对keil编译器)和AVR程序(上述的一些编译器,如GCC)最主要的不同:
1,因为51的io口为准双向io,所以对io口的操作不用设置io的方向,而AVR是双向io,每次对io操作,如输出输入都要对io的方向进行设置。
2,关键字不同,code是keil c51的非标准写法,如果AVR要使用常量,可以用const关键字取代。还有data关键字取消,也就是说什么data, idata,xdata,pdata都不可以使用。相对来说avr的编译器比较接近标准c。
3,51可以位操作,但是avr基本不使用位操作,因为avr可以位操作的区域比较少,所以sbit,bit什么的只有在51出现,avr不可以使用,除非你自己定义一个结构体。
4,中断的写法,这个每个编译器基本都不一样,呵呵,比如iar会使用#pragma关键字,gcc有固定的函数入口ISR(中断向量)。
avr比51强大很多,比如移植spi的程序,你可以自己写个avr的spi程序来取代,而不用像51一样io模拟。以上是我暂时能想到的比较大的区别,移植起来首先要注意的地方,如果还有疑问,你可以追问的。
如果是C语言的话,有限关键字会有改变,头文件要重新写,函数的一些写法会有所改变,AVR的编译器很多,每种编译器都有自己的独特写法,要先了解编译器后在做移植,成功率会更高。
单片机 ,一个单片机的程序能改吗.
1.要看你的单片机的型号,有一些单片机是OTP型的(OneTimePrograming的缩写,中文意思就是一次性编程),这种单片机只可以编程一次,编程完毕便不可以读出,一般在商品成品中多见,常用的AT89C51系列,AT89S51系列,STC89C51系列,还有很多型号单片机都是可以重复编程,一般都可以重复编程达1000次以上(AT89C51系列,AT89S51系...
将51单片机的程序移植到MSP430,在51里对一个I\/O操作(位寻址方式)的部分...
MSP430里,置1为|=,置0为&=~,取反为^。配置IO口要先要配置输入还是输出,然后再是输出高低。P1DIR|=BIT0;即是将P1^0设为输出。P1DIR&=~BIT1;即是将P1^1设为输入。然后,将P1^0分别置高、置低、取反的操作为:P1OUT|=BIT0;P1OUT&=~BIT0;P1OUT^=BIT0;
改一个单片机的程序~ 求大神们帮帮忙~跪谢~
if ((P1&0x10)==0) P0=_cror_(P0,1); \/\/K1 else if((P1&0x20)==0) P0=_crol_(P0,1);} \/\/主程序 void main(){ uchar Recent_Key; \/\/最近按键 P0=0xfe;Recent_Key=0xff;while(1){ if(Recent_Key!=P1){ Recent_Key=P1;Move_LED();DelayMS(10);\/\/保存最近按键 } } }...
单片机如何把文件加载到proteus里
怎么把keil里的文件加载到proteus1、首先在电脑上用proteus软件打开目标文件。然后用鼠标左键双击51单片机图标,如图所示。然后在出现的窗口中,点击下图中的文件夹图标。然后在电脑文件夹中找到编译好的HEX文件导入。2、keil里编译时,设置输出文件为.HEX文件格式。然后在proteus中打开CPU属性,在程序设定栏...
老师好,请问一块单片机如何调用另一块单片机的端口电机的程序各输哪些...
首先,我们需要在Master单片机上编写代码来发送I2C命令。这里是一个简单的示例:include <reg51.h> include "I2C.h" \/\/ I2C通信库 define SLAVE_ADDRESS 0x50 \/\/ Slave单片机的I2C地址 void main() { unsigned char command = 0x01; \/\/ 要发送的命令 I2C_Init(); \/\/ 初始化I2C I2C_...
单片机一般能重复写多少次程序?每次下载一个新的程序进去是不是将原来...
STC 系列单片机,官网公布 ,擦写次数10万次以上。新的程序 写入 下载 过程 首先 擦除 程序存储器,再 写入新的程序。可以 上 官网 看看,应该有更多 需要 了解的信息。
1.单片机实验:若将40H的内容改为OFH,程序应将如何修改?(写出原始程序...
首先,需要明确的是40H和OFH都是16进制数。40H对应10进制数为64,而OFH对应10进制数为15。因此,如果将40H的内容改为OFH,相当于将内存地址为40H的单元中存储的数值由64变为15。假设原始程序如下:```ORG 0H ;指定程序起始地址 MOV A, 40H ;将40H的内容移动到寄存器A中 ADD A, #10H ...
从1加到100的程序单片机
CLR P3.1 LCALL DELAY SETB P3.1 MOV A,R1 LCALL CHANGE CLR P3.0 LCALL DELAY SETB P3.0 CLR A DJNZ R4,LOOP1 CHANGE: MOVC A,@A+DPTR MOV P2,A RET DELAY: mov R6,#20 D1: MOV R7,#248 DJNZ R7,DJNZ R6,D1 RET TABLE: DB 3FH,06H,5BH,4FH,...
求一个单片机程序
求一个单片机程序 利用AVR单片机片内的ADC对模拟输入进行转换,并在LED数码管上显示结果。PS:实验条件⑴SL-AVRAD编程开发实验板(2)AVR系列单片机ATMega16(L)(3)AVR单片机的C语言编译器WinAVR(4)AVR单片... 利用AVR单片机片内的ADC对模拟输入进行转换,并在LED数码管上显示结果。 PS:实验条件⑴ SL-AVRAD编程开发...
51单片机,将1个C语言短程序改为汇编,很快的。加分
MAIN:LCALL DIS SJMP MAIN DELAY_MS:MOV R2,#250 DELAYM:NOP NOP DJNZ R2,DELAYM DJNZ R7,DELAY_MS RET DELAY:MOV R2,#10 DJNZ R2,RET DIS:MOV DPTR,#TABLE7 MOV R0,#0 MOV R3,#1 DISLP:MOV A,R0 MOVC A,@A+DPTR MOV P0,A MOV A,R3 RL A MOV R3,A CPL A MOV P1,A LCA...
滕蚀紫丹: 如果是C语言的,有限关键字会有改变,头文件要重新写,函数的一些写法会有所改变,AVR的编译器很多,每种编译器都有自己的独特写法,要先了解编译器后在做移植,成功率会更高. 另外,先要选择好编译器,C编译器如GCC,ICC,...
合作市19580248404: 请问用在51单片机上的程序直接编程到AVR的单片机里可以吗? - ?
滕蚀紫丹: 不可以,连长的最像51的mega16都不可以,首先avr不可以直接位寻址.如p1.1=0;可以这么写,但不可以写pa.1=0;虽然都可以用C语言编写.AVR端口是真正的双向端口,不像51伪双向.这也是AVR的一项优势,只是操作时大家注意DDRn...
合作市19580248404: 如何将一个单片机C51程序变成适用于单片机AVR程序 - ?
滕蚀紫丹: c 语言什么时候都是c语言,只要你的51的不是kill的就可以了,因为kill的有一些他自己定义的变量等等,你只要把你包含的头文件改掉,还有中间使用的io口的名字改对应该就可以的!
合作市19580248404: 51单片机程序怎么改成ATmega16的 - ?
滕蚀紫丹: 这个是没办法改的,改动特别大.两种芯片虽然从某种层次上来说,是大部分相同的.但是也可以说是截然不同的,因为其架构不一样,一个是51,一个是AVR,最具体的体现是,寄存器、操作、和指令集都不一样.
合作市19580248404: 买的开发板是兼容51和avr的,有avr转接板,但是如何使用才能用上AVR呢?纯菜鸟. - ?
滕蚀紫丹: 接上转接板,把AVR单片机插上去,一般在板子上会有个51和AVR的转换插针,把它插在AVR的位置就可以,另外,复位按键一般也是各用各的.
合作市19580248404: 如何将51单片机学习板转化成avr板 - ?
滕蚀紫丹: 首先你的开发板要支持AVR,最主要是两者的复位电平不一样,然后可以买的转接板就可以,不支持的话你就得自已做块转接板了!
合作市19580248404: 怎么从51单片机转到avr啊 - ?
滕蚀紫丹: 单片机都很简单.51如果你已经学精通了,那么你学avr也不难.可以从图书馆顺便借本AVR相关的书,先熟悉寄存器,把各个模块熟悉了.然后按照书中的实验跟着做,做个一遍就会了,重要的在于多些程序,可以的话和师兄一起做点项目,参加一些比赛.你可能觉得我说得很简单,但是事实就是这样的.不一定要有人教哈,自学,然后不懂得可以去论坛上找资料,问人哈.我从51刚学完,参加飞思卡尔的比赛,直接入手xs128了.3天学会最小系统,然后开始编程写程序.可能一开始是有些麻烦,因为有很多寄存器要设置,一开始也要查书和英文文档的,但是后来熟悉就很快了.这真的是经验之谈,如果你肯付出一切都很简单的.
合作市19580248404: stm32 的程序可以直接用在avr上面么? - ?
滕蚀紫丹: 51比较好学,不过功能也有限,当然应付简单的应用没有问题 AVR通用性比较好,型号也比较多,但是目前价格涨的让人怕.MSP430低功耗,常用在水表电表等测量场合,当然也可以用在机电控制场合,但他只能用在3.3v,与一些5v器件相连需要考虑电平是否兼容的问题.ARM比普通单片机速度快,功能强大些,但成本也较高.现在新推出的基于ARM7内核的stm32成本较低,有替代高端单片机的潜力.而高端的ARM9、ARM11主要用于智能手机等需要运行复杂程序的场合.当然,功能越复杂,开发就越难.我觉得学习应该循序渐进,学学MSP430或者AVR,当然STM32也行,直接学高端的ARM有些拔高了
合作市19580248404: 一个单片机程序从KEIL C51 转到AVR遇到一大堆问题,大家给看看是怎么回事吧.急切求教 - ?
滕蚀紫丹: 其实,51和ICCavr的差异还是很多的,包括端口设置、寄存器设置等等.51可以位操作,但是ICC中不行.给你段随便设置的ICC程序,你...
合作市19580248404: 刚刚入门51单片机,但板子烧了,想学AVR - ?
滕蚀紫丹: 51与AVR的区别不是很大,AVR又比51高级一点.建议还是学AVR好了.我也是在学习AVR.如果你决定好了学AVR的话,在百度HI我.我可以免费且热情的提供AVR芯片的中文资料;一共十五讲的《AVR视频教程-尹延辉》;AVR的编程软件;AVR的ISP下载器DIY方案;AVR的JTAG仿真器DIY方案;AVR MEGA16的学习板原理图和洞洞板布板电子文档;还有我写的例程.哈哈哈,是不是看得流口水了,唉,擦一擦先吧.在百度HI我.