久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: 急求答案啊!!!!拜托了!!! [打印本頁]

作者: 踏雪有痕    時間: 2014-10-26 19:10
標題: 急求答案啊!!!!拜托了!!!
小車上方有寬窄不同的障礙物,要求小車數出寬的障礙物個數并顯示。怎樣讓每次發生低電平時計數器計數,而恢復高點平時不計數呢?我的程序可以讓它在第一次低電平時開始計數,但是當電平恢復高電平時還在計數停不下來。
#include<stc12c5a60s2.h>
#define uint unsigned int
#define uchar unsigned char
sbit  chuanganqi=P3^3;
sbit RS=P2^5;
sbit RW=P2^6;
sbit EP=P2^7;
unsigned int geshu,kuan,num;
void delay(int z)
{
   int i,j;
   for(i=z;i>0;i--)
     for(j=1000;j>0;j--);
}
void zhongduan1() interrupt 2   //外部中斷1
{
TR1=0;
Timer1_int();
   TR1=1;
}
void zhongduan2() interrupt 3        //定時器中斷1
{
     num++;
   TL1 = 0x9C;  //設置定時初值
TH1 = 0xFF;  //設置定時初值 //定時100us=0.1ms
}
void Timer1_int()  //定時器1初始化
{
/* TMOD|=0x10;
TH1=(65536-65436)/256;
TL1=(65536-65436)%256;   //定時100us=0.1ms
EA=1;
TR1=1;
ET1=1; */
AUXR &= 0xBF;  //定時器時鐘12T模式
TMOD &= 0x0F;  //設置定時器模式
TMOD |= 0x10;  //設置定時器模式
TL1 = 0x9C;  //設置定時初值
TH1 = 0xFF;  //設置定時初值
TF1 = 0;  //清除TF1標志  
// TR1 = 1;  //定時器1開始計時
ET1=1;
}
void write_com(char com) //輸入命令函數
{
RS=0;
RW=0;
EP=0;
P0=com;
delay(5);
EP=1;
delay(5);
EP=0;
}
void write_date(char date)//輸入數據函數
{
RS=1;
RW=0;
EP=0;
P0=date;
delay(5);
EP=1;
delay(5);
EP=0;
}
void write_init()//初始化函數
{
   write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
}
void display()
{
write_com(0x80+0x00);
write_date(geshu/1000+0x30);
write_com(0x80+0x01);
write_date(geshu%1000/100+0x30);
write_com(0x80+0x02);
write_date(geshu%1000%100/10+0x30);
write_com(0x80+0x03);
write_date(geshu%10+0x30);
}
void main()
{
IT1=1;  //低電平觸發中斷
EX1=1;
write_init();
while(1)
{ EA=1;
Timer1_int();  
   if (num>=1000)
   {  
     kuan++;   // kuan/2是托盤個數
  num=0;
      TR1=0;
geshu=kuan/2;
}
     display();
// delay(5);
}
}


作者: mqwu    時間: 2014-10-27 17:54
一定要用這個stc12c5a60s2嗎? 用PIC的話, 我可以幫你寫一個,外部中斷做不準, 最好是用CCP模塊的捕獲方法,因為進入中斷程序會消耗時鐘周期。
作者: dgahz    時間: 2014-10-28 11:22
我初學一月,說不對別怪。樓主程序目的想檢測低電平持續時間,用外中斷不好處理。如用低電平觸發,低電平不退出則程序死在外中斷服務程序里,其它任務做不了,包括定時中斷服務也不做。如用下降觸發,則觸發后定時器計時,到設定時間(1S吧?)才停止計時,成了觸發式一秒定時器,當然也可以改兩秒三秒。檢測低電平持續時間,應該在電平持續時間內定時器計時,高電平關閉,再算時間,對吧?
作者: dgahz    時間: 2014-10-28 11:28
#include "stc.h"
#define uint unsigned int
#define uchar unsigned char
sbit  chuanganqi=P3^3;
sbit  RS=P2^5;
sbit  RW=P2^6;
sbit  EP=P2^7;
unsigned int geshu,kuan,num;
void Timer1_int();
void delay(int z)
{
   int i,j;
   for(i=z;i>0;i--)
     for(j=1000;j>0;j--);
}
void zhongduan2() interrupt 3        //定時器中斷1
{
     num++;
     TL1 = 0x9C;  //設置定時初值
     TH1 = 0xFF;  //設置定時初值 //定時100us=0.1ms
}
void Timer1_int()  //定時器1初始化
{
        AUXR &= 0xBF;  //定時器時鐘12T模式
        TMOD &= 0x0F;  //設置定時器模式
        TMOD |= 0x10;  //設置定時器模式
        TL1 = 0x9C;  //設置定時初值
        TH1 = 0xFF;  //設置定時初值
        ET1=1;
        EA=1;
}
void write_com(char com) //輸入命令函數
{
                RS=0;
                RW=0;
                EP=0;
                P0=com;
                delay(5);
                EP=1;
                delay(5);
                EP=0;
}
void write_date(char date)//輸入數據函數
{
        RS=1;
        RW=0;
        EP=0;
        P0=date;
        delay(5);
        EP=1;
        delay(5);
        EP=0;
}
void write_init()//初始化函數
{
    write_com(0x38);
        write_com(0x0c);
        write_com(0x06);
        write_com(0x01);
}
void display()
{
                write_com(0x80+0x00);
                write_date(geshu/1000+0x30);
                write_com(0x80+0x01);
                write_date(geshu%1000/100+0x30);
                write_com(0x80+0x02);
                write_date(geshu%1000%100/10+0x30);
                write_com(0x80+0x03);
                write_date(geshu%10+0x30);
}
void main()
{         
    Timer1_int();
   write_init();
        while(1)
        {          while(chuanganqi==0)
                {
                         TR1=1;
                }
             TR1=0;
           if (num>=1000)
           {  
              kuan++;   // kuan是托盤個數
              num=0;
              TR1=0;
              geshu=kuan;
            }
              display();
        }
}
作者: mqwu    時間: 2014-10-28 11:53
老實說我從未用過這個stc12c5a60s2; 你說的對,用捕獲的方法 要么檢測低電平持續時間, 或者檢測高電平持續時間, 然后運用算法計算這樣的時間有多少個即可。
如果用外部中斷+定時器應該也可以,但是比較粗略:
用一個外部中斷做觸發,一定要用電平觸發, 不可以用上升沿和下降沿,因為物體開始時如果是上升沿, 那么結束時是下降沿, 反之依然。 一旦觸發就打開定時器timer(定時器先要關)開始計時, 當下一個電平改變后停止計時器,當接下來的電平再次改變時,定時器又打開,反復 計算出這段時間, 用算法計算這樣有多少個即可。
作者: dgahz    時間: 2014-10-28 15:53
不好意思,上面給的程序有問題,重新改過如下:
#include "stc.h"
//#include "uart.h"
#define uint unsigned int
#define uchar unsigned char
sbit  chuanganqi=P3^3;
sbit  RS=P2^6;
sbit  RW=P2^5;
sbit  EP=P2^7;
unsigned int geshu,kuan,num;
void Timer1_int();
void delay(int z)
{
   int i,j;
   for(i=z;i>0;i--)
     for(j=1000;j>0;j--);
}
void zhongduan2() interrupt 3        //定時器中斷1
{
     num++;
//         printexp1("num",num);
     TL1 = 0x9C;  //設置定時初值
     TH1 = 0xFF;  //設置定時初值 //定時100us=0.1ms
}
void Timer1_int()  //定時器1初始化
{
        AUXR &= 0xBF;  //定時器時鐘12T模式
        TMOD &= 0x0F;  //設置定時器模式
        TMOD |= 0x10;  //設置定時器模式
        TL1 = 0x9C;  //設置定時初值
        TH1 = 0xFF;  //設置定時初值
        ET1=1;
        EA=1;
}
void write_com(char com) //輸入命令函數
{
                RS=0;
                RW=0;
                EP=0;
                P0=com;
                delay(5);
                EP=1;
                delay(5);
                EP=0;
}
void write_date(char date)//輸入數據函數
{
        RS=1;
        RW=0;
        EP=0;
        P0=date;
        delay(5);
        EP=1;
        delay(5);
        EP=0;
}
void write_init()//初始化函數
{
    write_com(0x38);
        write_com(0x0c);
        write_com(0x06);
        write_com(0x01);
}
void display()
{
                write_com(0x80+0x00);
                write_date(geshu/1000+0x30);
                write_com(0x80+0x01);
                write_date(geshu%1000/100+0x30);
                write_com(0x80+0x02);
                write_date(geshu%1000%100/10+0x30);
                write_com(0x80+0x03);
                write_date(geshu%10+0x30);
}
void main()
{         
        uart_ini();
    Timer1_int();
   write_init();
        while(1)
        {          while(chuanganqi==0)
                {
                         TR1=1;
                }
             TR1=0;
           if (num>=1000)
           {  
              kuan++;
//                 printexp1("kuan",kuan);   // kuan是托盤個數
              num=0;
              TR1=0;
              geshu=kuan;
            }
                else
                {
                  num=0;
              TR1=0;
                }

              display();
        }
}
作者: 踏雪有痕    時間: 2014-10-29 14:08
dgahz 發表于 2014-10-28 11:22
我初學一月,說不對別怪。樓主程序目的想檢測低電平持續時間,用外中斷不好處理。如用低電平觸發,低電平不 ...

對,就是這意思
作者: 踏雪有痕    時間: 2014-10-29 14:12
dgahz 發表于 2014-10-28 15:53
不好意思,上面給的程序有問題,重新改過如下:
#include "stc.h"
//#include "uart.h"

可是燒到板上,LCD什么都不顯示啊
作者: 踏雪有痕    時間: 2014-10-29 14:30
mqwu 發表于 2014-10-27 17:54
一定要用這個stc12c5a60s2嗎? 用PIC的話, 我可以幫你寫一個,外部中斷做不準, 最好是用CCP模塊的捕獲方 ...

是啊,因為其他模塊要用PCA,所以必須得用它,實際上我們用的是stc12c5a16s2
作者: dgahz    時間: 2014-10-29 16:10
#include "stc.h"
//#include "uart.h"
這些是我調試用的,和你的程序沒關系,凡是打//的可刪掉。
作者: dgahz    時間: 2014-10-29 16:13
有東西擋住傳感器時間長點,會加1,短時間不會。
作者: dgahz    時間: 2014-10-29 16:16
前提你的傳感器被擋住能輸出低電平。
作者: dgahz    時間: 2014-10-29 16:37
把main里的 uart_ini();刪掉,復制時我忘在前面打//了。
作者: 踏雪有痕    時間: 2014-10-30 20:55
我就是刪掉了之后,發現還是不顯示。找不到其他的問題了。
作者: dgahz    時間: 2014-10-30 21:31
編譯通過沒有?有沒有和其它模塊組合一起用?如果單用它是沒問題的。我下載試過,正常顯示,你改用你的頭文件,不要用我的試試。
作者: dgahz    時間: 2014-10-30 21:49
#include<stc12c5a60s2.h>
#define uint unsigned int
#define uchar unsigned char
sbit  chuanganqi=P3^3;
sbit  RS=P2^6;
sbit  RW=P2^5;
sbit  EP=P2^7;
unsigned int geshu,kuan,num;
void Timer1_int();
void delay(int z)
{
   int i,j;
   for(i=z;i>0;i--)
     for(j=1000;j>0;j--);
}
void zhongduan2() interrupt 3        //定時器中斷1
{
     num++;
     TL1 = 0x9C;  //設置定時初值
     TH1 = 0xFF;  //設置定時初值 //定時100us=0.1ms
}
void Timer1_int()  //定時器1初始化
{
        AUXR &= 0xBF;  //定時器時鐘12T模式
        TMOD &= 0x0F;  //設置定時器模式
        TMOD |= 0x10;  //設置定時器模式
        TL1 = 0x9C;  //設置定時初值
        TH1 = 0xFF;  //設置定時初值
        ET1=1;
        EA=1;
}
void write_com(char com) //輸入命令函數
{
                RS=0;
                RW=0;
                EP=0;
                P0=com;
                delay(5);
                EP=1;
                delay(5);
                EP=0;
}
void write_date(char date)//輸入數據函數
{
        RS=1;
        RW=0;
        EP=0;
        P0=date;
        delay(5);
        EP=1;
        delay(5);
        EP=0;
}
void write_init()//初始化函數
{
    write_com(0x38);
        write_com(0x0c);
        write_com(0x06);
        write_com(0x01);
}
void display()
{
                write_com(0x80+0x00);
                write_date(geshu/1000+0x30);
                write_com(0x80+0x01);
                write_date(geshu%1000/100+0x30);
                write_com(0x80+0x02);
                write_date(geshu%1000%100/10+0x30);
                write_com(0x80+0x03);
                write_date(geshu%10+0x30);
}
void main()
{         
        uart_ini();
    Timer1_int();
   write_init();
        while(1)
        {          while(chuanganqi==0)
                {
                         TR1=1;
                }
             TR1=0;
           if (num>=1000)
           {  
              kuan++;
              num=0;
              TR1=0;
              geshu=kuan;
            }
                else
                {
                  num=0;
              TR1=0;
                }
              display();
        }
}




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 日韩精品成人网 | 伊人二区 | 欧美一区精品 | 中文字幕一区二区三区四区 | 日韩av在线免费 | 国产精品久久久久影院色老大 | 黄色免费在线观看网站 | 一区二区三区欧美 | www.97zyz.com| 国产精品成人一区二区三区 | 91看片视频 | 国产成人免费视频网站高清观看视频 | 欧美精品中文字幕久久二区 | 国产成人网 | 国产精品一区二 | 久久亚洲精品久久国产一区二区 | 日韩精品一区二区三区在线播放 | 日韩欧美精品一区 | 91天堂网| 国产真实精品久久二三区 | 亚洲日韩中文字幕一区 | 精品久久久久久久 | 日韩欧美在线视频 | 国产综合精品一区二区三区 | www.毛片| 亚洲欧美少妇 | 三级成人在线观看 | 亚洲一区二区中文字幕 | 99re视频在线 | 欧美日韩久久 | 91在线视频| 成人性生交a做片 | 夜夜爽99久久国产综合精品女不卡 | 亚洲二区视频 | 久久一日本道色综合久久 | 国产中文字幕在线 | 一本一道久久a久久精品蜜桃 | 午夜影院网站 | 午夜a v电影 | 成人午夜视频在线观看 | 久久成人国产精品 |