登录
首页 单片机论坛
回帖 发帖
正文

主题:求大神帮忙看看怎样改

点击:496 回复:2

#include
void delaym(unsigned int t)// 延时子程序,入口参数ms,延迟时间=t*1ms,t=0~65535
{
         unsigned char j;//j=0~255
         while(t--)
          {
           for(j = 0; j < 125; j++);//j进行的内部循环,1次延迟8us
          }
}
unsigned char a[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
void main()
{
 unsigned char i;
    while(1)
   {
    for(i=0;i<8;i++)
    {
     P0=a;
   delaym(1000);//调用延迟程序1000*1ms=1秒
     }
for(i=0;i<8;i++)
    {
     P1=a;
   delaym(1000);//调用延迟程序1000*1ms=1秒
     }
for(i=0;i<8;i++)     {
     P2=a;
   delaym(1000);//调用延迟程序1000*1ms=1秒
     }
for(i=0;i<8;i++)
{      P3=a;    delaym(1000);//调用延迟程序1000*1ms=1秒      }
   }
}
}
1怎样实现P0.1 0.2 0.3.....P1.0 P1.2....P2.0.....P3.0.....P3.7让它们亮一分钟灭一分钟
2  P0.0......P3.7这是第一次循环     P0.0......P3.7这是第二次循环   怎样实现第一次循环完延时一个小时再循环第二次循环
16-07-23 14:48
下面的程序完成的功能如下:
1、每隔1秒分别点亮P2.0~P2.7
2、当P2.7点亮完了后,就停10秒,然后继续执行第一步的内容。
#include
int num;
int runFlag;
int arrayelement;
unsigned char a[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
void InitTimer0(void)
{
TMOD=0x00;
TH0=0x1C;
TL0=0x66;
EA=1;
ET0=1;
TR0=1;
}
void main()
{
InitTimer0();
num=0;
runFlag=1;
arrayelement=0;
while(1)
{
if (runFlag) {
if(num==200){
P2=a[arrayelement];
arrayelement++;
num=0;
if (arrayelement>7){
   arrayelement=0;
 runFlag=0;
           P2=0xFF;}
        }
}
else{
 if(num==2000){
runFlag=1;
num=0;}
}

}
}
void Timer0Interrupt(void) interrupt 1
{
TH0=0x1C;
TL0=0x66;
num++;
}
16-07-24 14:37
楼主的程序将时间都花在循环计数上面了;你用定时断来计数虚拟定时器;不要让程弃于等等待;虚拟定时器可以这样实现:用一个定时器作1ms或者100US中断;每中断一次将软件定时器加1;主程序每次扫描结束将软件定时器的定时值保存为扫描周期时间清零软件定时器;
虚拟定时器占用个字1个位:其中1个字来存储计数、1个位来存储定时器是否溢出
如果虚拟定时器被使能且未溢出则虚拟计数加上扫描周期时间;然后比较计数器是否溢出;如果溢出则将标志位置1;直到虚拟定时器被禁能时虚拟定时器标志位置0;
16-12-10 17:22

工控新闻

更多新闻资讯