帮忙修改一个单片机程序

帮忙修改一个单片机程序,第1张

具体做什么用的,你要说明一下,我给你大概举出了你的错误,你自己看下然后更改一下程序,具体怎么改,要知道功能才能帮你改,谢谢、、、
#include"reg52h"
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; //kongzhi
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;
}
}
}
}
}

不知道你的 #define LEN 4 有什么用,还有就是你怎么把LED[ ]输出到单片机上去的,你应该是把LED[ ]赋值给单片机的输出口吧如P0,P1(这要看你是怎样接的)什么的
我给你改了下,你看看怎么样:
#include <AT89X52H>
#include<stdioh>
void main()
{
unsigned int LED[8] = {0}; //先给第一个数赋值0,后面的都默认为0,如果不赋值不同的机器会有不同的数的吧,而且你最好养成赋初值的习惯吧
unsigned int she[4]={1,2,3,4};
unsigned int i;
unsigned int w;
unsigned int m;
unsigned int n;
for(i=0; i<4; i++ ) // i 不能等于4,因为she[]一共才有4个,最多才是she[3]
{
m=(she[i]-1)/8; //整除8
n=(she[i]-1)%8+1;//除8的余数
switch(n)
{
case 1:w=0x80;break;
case 2:w=0x40;break;
case 3:w=0x20;break;
case 4:w=0x10;break;
case 5:w=0x08;break;
case 6:w=0x04;break;
case 7:w=0x02;break;
case 8:w=0x01;break;
}
LED[m]=LED[m]+w;
}
//下面的是我在VC2010上弄的(把头文件改为C++的头文件),能看到输出是 240(0xf0),0 0 0 0 0 0 0
/ for(i=0; i!=8; i++ )
{
cout << LED[i] << endl;
}/
}

把函数中TH1,TL1,TR1,ET1,里面的都改成0,这个是定时器0的寄存器,然后TH0,和TL0的初值也要修改;下面有初始化和中断函数了,把你亮灯的 *** 作添加进去就OK,具体看下面:
#include <reg51h>

void InitTimer0(void) //初始化定时器0
{
TMOD = 0x01;
TH0 = 0x0D8;
TL0 = 0x0F0;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void main(void)
{
InitTimer0();
}
void Timer0Interrupt(void) interrupt 1 //定时器0中断程序
{
TH0 = 0x0D8;
TL0 = 0x0F0;
//add your code here!
}

显示子程序和T0中断程序有错。程序修改如下

#include<reg51h>

#define uint unsigned int

#define uchar unsigned char

sbit LSA=P2^2;

sbit LSB=P2^3;

sbit LSC=P2^4;

sbit led1=P2^0;

uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

void delayms(uint);

void display();//显示程序不用带参数

uchar shi,ge,num,num1,num2;

void main()

{

TMOD=0x11;

TH0=(65535-45872)/256;

TL0=(65535-45872)%256;

TH1=(65535-45872)/256;

TH1=(65535-45872)%256;

EA=1;

ET0=1;

ET1=1;

TR0=1;

TR1=1;

while(1)

{

display();

}

}

void display()//显示程序不用带参数

{

shi=num/10;

ge=num%10;

LSA=0; LSB=0; LSC=0;

P0=table[shi];

delayms(5);

LSA=1;LSB=0;LSC=0;

P0=table[ge];

delayms(5);

}

void delayms(uint zms)

{

uint i,j;

for(i=zms;i>0;i--)

for(j=110;j>0;j--);

}

void T0_time()interrupt 1

{

TH0=(65535-45872)/256;

TL0=(65535-45872)%256;

num1++;//不是num

if(num1==4)

{

num1=0; led1=~led1;

}

}

void T1_time()interrupt 3

{

TH1=(65535-45872)/256;

TL1=(65535-45872)%256;

num2++;

if(num2==20)

{

num2=0; num++;

if(num==60) num=0;

}

}

仿真结果

一般的单片机程序在烧写的过程中
第一步是擦除原来的内容(通常代码都是存储在单片机的 flash 区域,
对于 flash 来说,要写入新的内容第一步就是擦除)
所以,只要你重新烧写单片机程序就是替换原来的程序了


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12805987.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-28
下一篇 2023-05-28

发表评论

登录后才能评论

评论列表(0条)

保存