⑴ 如何修改单片机的源程序
使用编程软件如(keil,iar软件)编写和修改程序。选择产生hex文件后,利用程序下载软件flashmagic等(单片机不同而不同)下载程序到单片机。单片机上电运行即可!找本单片机书籍,应该就有很详细的介绍!
⑵ 单片机上载出来的程序怎么样修改
D8751H是51内核的单片机。读出来的程序应该是HEX文件。
如果没有加密的话可以用伟福编译器的反编译功能反编译成为.asm文件。就可以修改了!
⑶ 如何修改单片机的程序
你问这样的问题说明你还不了解单片机,回去好好看书。简单说一下,单片机本身是一个硬件,但它需要软件的支持才能运行工作,软件就是用户编写的程序然后编译成机器可以识别的代码,然后烧录到这个硬件的存储器中,修改单片机的程序这种说法也对也不对,对呢是说修改用户编写的源程序是对的,但单片机程序存储器里的内容就不是修改了,而是擦除然后重新烧录的过程,你想调整单片机的功能或其中的参数的话就需要再此单片机的开发环境下面编写程序,然后编译成为机器代码,最后烧录到单片机的程序存储器中就完成了。
⑷ 单片机 ,一个单片机的程序能改吗.
答:
1.要看你的单片机的型号,有一些单片机是OTP型的(OneTimePrograming的缩写,中文意思就是一次性编程),这种单片机只可以编程一次,编程完毕便不可以读出,一般在商品成品中多见,常用的AT89C51系列,AT89S51系列,STC89C51系列,还有很多型号单片机都是可以重复编程,一般都可以重复编程达1000次以上(AT89C51系列,AT89S51系列1k次,,STC89C51系列100k次(技术资料上是这样说的)).
2.单片机编程,一般都用 汇编 和 C语言 外,还可以用机器语言(这个想是没有人用了).(这点不是太懂,见笑,我一般用C语言,用keil编译调试很方便,程序也易读).
3.一般单片机都有相应的程序下载工具,这里所说的工具并不复杂,AT89S51系列用SPI下载,STC单片机都用串口下载.这两者单片机的下载工具都可以自己做.如果你处于单片机入门阶段,本人建议用AT和STC的单片机.
⑸ 单片机问题,改程序
#include <reg52.h>
#define DATPIN P0 //定义IO口
#define POSPIN P2 //定义IO口
sbit KEY0 = P3^2; //定义按键
sbit KEY1 = P3^3; //定义按键
unsigned char num0,num1,flag; //按键0和1按下次数
//共阳显示码
unsigned char code ledca[]={0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
//共阳位置码
unsigned char code posca[]={0x01,0x02,0x04,0x08,0x10,
0x20,0x40,0x80};
void delayms(unsigned int); //毫秒延时
void display(unsigned char,unsigned char); //LED显示
void ext0() interrupt 0
{
while(!key0);
flag=~flag;
}
void ext1() interrupt 2
{
while(!key1);
if(flag)num1++;
else num0++;
}
void main()
{
EX0=1;
EX1=1;
EA=1;
IT0=1; //边沿触发
IT1=1; //边沿触发
flag=0;
while(1)
{
display(num0%10,0);
display(num0/10,1);
display(num1%10,2);
display(num1/10,3);
}
} //毫秒延时
void delayms(unsigned int t)
{
unsigned int i,j;
for (j=0;j<t;j++)
{
for (i=0;i<123;i++)
{ }
}
}
//LED显示,第1个参数为显示数据,第2个为显示位置
void display(unsigned char dat,unsigned char pos)
{
POSPIN=posca[pos];
DATPIN=ledca[dat];
delayms(5);
POSPIN=0x00;
}
⑹ 修改一个简单的单片机程序
让我想想
我修改了一下,把R2的赋值循环一次变小1(变少多少按你需要自己定咯,想变化快点就对这部分修改,当然,不可以用djnz咯),标星号部分是我改的 ,不懂可以HI我
ZWMADDR EQU 8002H
ZXMADDR EQU 8004H
ORG 0000H
ST: LJMP total;*************
ORG 0100H
total:;************
MOV R2,#25H ;****************
MAIN: MOV R3,#01H
MOV R4,#00H
LOOP: MOV DPTR,#CHAR
MOV A,R4
MOVC A,@A+DPTR
MOV DPTR,#ZXMADDR
MOVX @DPTR,A
MOV A,R3
MOV DPTR,#ZWMADDR
MOVX @DPTR,A
djnz r2,exit;***************
LCALL DELAY
MOV A,R3
RL A
MOV R3,A
CJNE R3,#40H,NEXT
MOV R3,#01H
NEXT: INC R4
CJNE R4,#10H,LOOP
SJMP MAIN
exit:;**************
sjmp $ ;************
DELAY: PUSH 02H
LP1: PUSH 02H
LP2: PUSH 02H
LP3: DJNZ R2,LP3
POP 02H
DJNZ R2,LP2
POP 02H
DJNZ R2,LP1
POP 02H
DJNZ R2,DELAY
RET
CHAR: DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H
DB 7FH, 6FH, 77H, 7CH, 39H, 5EH, 79H, 71H
END
⑺ 怎样修改这个单片机程序
程序已经修改好了。但是还是建议尽量自己修改。不懂再来问。嘿嘿嘿
#include <reg52.h>
unsigned char code F_Rotation[4]={0xf1,0xf2,0xf4,0xf8}; //正转表格
unsigned char code B_Rotation[4]={0xf8,0xf4,0xf2,0xf1}; //反转表格
sbit an1=P1^0;
sbit an2=P1^1;
void Delay(unsigned int i)//延时
{
while(--i);
}
void main()
{
unsigned char i;
if(!an1) // 如果按下按键1则执行下面的程序 实现电机正转
{
P0=0x71;//显示 F 标示正转
for(i=0;i<4;i++) //4相
{
P1=F_Rotation[i]; //输出对应的相 可以自行换成反转表格
Delay(500); //改变这个参数可以调整电机转速 ,数字越小,转速越大
}
}
if(!an2) // 如果按下按键2则执行下面的程序 实现电机反转
{
P0=0x7C;//显示 b 标示反转
for(i=0;i<4;i++) //4相
{
P1=B_Rotation[i]; //输出对应的相
Delay(500); //改变这个参数可以调整电机转速 ,数字越小,转速越大
}
}
}
⑻ 单片机解密的程序能修改吗
单片机解密的程序理论上是可以修改的,可实际做起来太难了。因为解密出来的是机器码程序,需要反汇编成汇编程序,然后再去读懂这些程序,才行做修改。如果原程序是用C语言写的,经编译后的机器码程序,解密出来,再反编译得到的汇编程序是很难读懂的,更别说是修改了。如果原程序并不长,并是用汇编语言写的,解密后反编译的程序还可以读懂,但需要有很强的编写汇编语言程序的功底才能读得懂。所以,一般情况下,解密出来的程序就是为了要机器码,并不是为了修改的,而是把解密的机器码程序直接烧写到自己的单片机中去就得了。这要求在硬件上是完成与原来的电路一样才行。
⑼ 单片机源程序怎么修改
如果你只有hex文件的话,那么抱歉了,那是修改不了的。如果不是那就打开工程再进行编程就行了呀。。。
⑽ 帮忙修改一个单片机程序
具体做什么用的,你要说明一下,我给你大概举出了你的错误,你自己看下然后更改一下程序,具体怎么改,要知道功能才能帮你改,谢谢、、、
#include"reg52.h"
sbit lone=P1^5;//外接什么?
sbit ltwo=P1^6;//外接什么?
sbit start=P3^0; //外接按键吗?
sbit stop=P3^1;//外接按键吗?
/*
sbit AUTO=P3^2; //没有用到
sbit hand=P3^3; //没有用到
sbit forward=P3^4; //没有用到
sbit reverse=P3^5; //没有用到
sbit acceleration=P3^6;// 没有用到
sbit deceleration=P3^7;//没有用到
sbit direction=P1^0; //zhuanfan //没有用到
*/
sbit RS=P1^1; //on off
sbit PMW=P1^2; //kong
int CYCLE,PWM_ON,count;
void initial() //变量初始化程序
{
CYCLE=20;
PWM_ON=0;
count=0;
}
void DelayMs(unsigned char z) //延时程序
{
unsigned int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void nit_Timer0(void) //中断初始化程序
{
TMOD=0x01;
TH0=(65536-2000)/256;//这是等于20ms
TL0=(65536-2000)%256;
EA=1;
ET0=1;
TR0=1;
}
void Timer0_isr(void) interrupt 1
{
TH0=(65536-2000)/256;
TL0=(65536-2000)%256;
if(count==PWM_ON)//如果定时等于on的时间说明作用时间结束,输出低电平
//如果stop信号没有得到的话,那么可以得到,初值count=0,PWM_ON=0;PMW=0;
//count++ =>count=1;PWM_ON没有改变还是等于0,所以不管count增加多少等式都不会成立。
{
PMW=0;
}
else if(count==CYCLE)//反之低电平时间结束后返回高电平
//当count=20,CYCLE=20,所以这条语句成立
{
count=0;
if(PWM_ON!=0)//如果开启时间是0保持原来状态
//这条语句一直不成立,因为PWM_ON始终等于O
{
PMW=1;
}
}
count++;
}
/*void accelerate() //因为这个函数没有调用到,所以不起作用
{
if(PWM_ON==CYCLE)
{
}
else
{
PWM_ON++;
}
}*/
mian()
{
initial();
Iint_Timer0();
while(1)
{
if(!stop)
{
DelayMs(5)//去抖动电路
if(!stop)
{
lone=1;
PWM_ON=0;
ltwo=1;
//PWM_ON=0;重复多余
while(start)
{
RS=0;
}
}
}
}
}