[讨论] PIC16F877A单片机时间监控程序怎么写,求高人

guacheshi   2015-12-24 22:21 楼主
#include
__CONFIG(0x3b31);
#define uint unsigned int
char chongya;
char fuwei;
void delay(uint x)
{
uint a,b;
for(a=x;a>0;a--)
    for (b=100;b>0;b--);
}
void main(void)
{
     TRISA=0xFF;               //设置RA口输入
    PORTA=0x00;               //设置RA口输出低电平  
TRISB=0xFF;               //设置RB口输入
    PORTB=0x00;               //设置RB口输出低电平
TRISC=0xFF;               //设置RC口输入
    PORTC=0x00;               //设置RC口输出低电平
    TRISD=0x00;               //设置RD口输出
    PORTD=0xFF;               //设置RD口输出低电平
    TRISE=0x00;               //设置RE口输出
    PORTE=0xfF;               //设置RE口输出
while(1)
{
   if((PORTB&0x02)==0X00&&(PORTB&0x04)==0X00)  //冲压开始
   {
    chongya=1;          //进入冲压循环
   }
while(chongya==1)      //下行循环
   {
    if((PORTB&0x02)==0X00&&(PORTB&0x04)==0X00)   //       RB1上死点信号
   {
    PORTD=0B11111110;       // 下行低压
   }
    if((PORTB&0x01)==0x00)  // RB0下死点信号
   {
    PORTD=0b11101101;  // 上行低压
   }
    chongya=0;
    }
}
}
这是一个控制机械往复运动的程序,想加个时间监控,可写了几次都不对,所以请高人指点。
用TRM02定时器监控 "while(chongya==1)      //下行循环"的运行时间超过3秒输出个报警信息,3秒钟以内清零以便下次监控。
现在用的是4M晶振打算换到12M。希望高人留下联系方式帮助解决了也得表示表示呀。先谢谢了。


回复评论 (3)

程序的状态比较乱,这样不方便处理信号,也不方便修改。你把流程理清楚了,程序自然也就出来了。

控制时间,可以用定时器设置标志位,也可以用计数器。

象 if((PORTB&0x02)==0X00&&(PORTB&0x04)==0X00) 最好改成
if(((PORTB&0x02)==0X00)&&((PORTB&0x04)==0X00))避免不同编译器引起歧义。
点赞  2015-12-24 22:49
   if((PORTB&0x02)==0X00&&(PORTB&0x04)==0X00)  //冲压开始
   {
     chongya=1;          //进入冲压循环
   }
while(chongya==1)      //下行循环
   {
     if((PORTB&0x02)==0X00&&(PORTB&0x04)==0X00)   //       RB1上死点信号
   {
     PORTD=0B11111110;       // 下行低压
   }
①这一段是同一个功能,但作为两步写,编译优化后可能产生异常
②另外,如果用T2作为定时器,你本身的标志位chongya和fuwei是可以作为判断的(建议作为位标志判断)
③如果是判断PB1和PB2引脚的电平状态,那么
if((PORTB&0x02)==0X00&&(PORTB&0x04)==0X00) 最好改为:
if( (!(PORTB&0x02)) &&(!(PORTB&0x04)) )方式判断最好.下同.
点赞  2015-12-26 15:24
谢谢大家指正,刚开始写程序,经验欠缺,多谢各位指正,另外,用定时器来做那个定时我也试过,就是那个标志位,好像不起作用,每次的时间不同,搞了半天也没搞出来。希望有人能帮我写下。谢谢
点赞  2015-12-27 16:47
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复