#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 来说,要写入新的内容第一步就是擦除)
所以,只要你重新烧写单片机程序就是替换原来的程序了
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)