找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 5669|回復(fù): 15
收起左側(cè)

急求答案。。。。“萃辛耍。!

[復(fù)制鏈接]
ID:67905 發(fā)表于 2014-10-26 19:10 | 顯示全部樓層 |閱讀模式
5黑幣
小車上方有寬窄不同的障礙物,要求小車數(shù)出寬的障礙物個(gè)數(shù)并顯示。怎樣讓每次發(fā)生低電平時(shí)計(jì)數(shù)器計(jì)數(shù),而恢復(fù)高點(diǎn)平時(shí)不計(jì)數(shù)呢?我的程序可以讓它在第一次低電平時(shí)開始計(jì)數(shù),但是當(dāng)電平恢復(fù)高電平時(shí)還在計(jì)數(shù)停不下來(lái)。
#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        //定時(shí)器中斷1
{
     num++;
   TL1 = 0x9C;  //設(shè)置定時(shí)初值
TH1 = 0xFF;  //設(shè)置定時(shí)初值 //定時(shí)100us=0.1ms
}
void Timer1_int()  //定時(shí)器1初始化
{
/* TMOD|=0x10;
TH1=(65536-65436)/256;
TL1=(65536-65436)%256;   //定時(shí)100us=0.1ms
EA=1;
TR1=1;
ET1=1; */
AUXR &= 0xBF;  //定時(shí)器時(shí)鐘12T模式
TMOD &= 0x0F;  //設(shè)置定時(shí)器模式
TMOD |= 0x10;  //設(shè)置定時(shí)器模式
TL1 = 0x9C;  //設(shè)置定時(shí)初值
TH1 = 0xFF;  //設(shè)置定時(shí)初值
TF1 = 0;  //清除TF1標(biāo)志  
// TR1 = 1;  //定時(shí)器1開始計(jì)時(shí)
ET1=1;
}
void write_com(char com) //輸入命令函數(shù)
{
RS=0;
RW=0;
EP=0;
P0=com;
delay(5);
EP=1;
delay(5);
EP=0;
}
void write_date(char date)//輸入數(shù)據(jù)函數(shù)
{
RS=1;
RW=0;
EP=0;
P0=date;
delay(5);
EP=1;
delay(5);
EP=0;
}
void write_init()//初始化函數(shù)
{
   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;  //低電平觸發(fā)中斷
EX1=1;
write_init();
while(1)
{ EA=1;
Timer1_int();  
   if (num>=1000)
   {  
     kuan++;   // kuan/2是托盤個(gè)數(shù)
  num=0;
      TR1=0;
geshu=kuan/2;
}
     display();
// delay(5);
}
}

回復(fù)

使用道具 舉報(bào)

ID:66032 發(fā)表于 2014-10-27 17:54 | 顯示全部樓層
一定要用這個(gè)stc12c5a60s2嗎? 用PIC的話, 我可以幫你寫一個(gè),外部中斷做不準(zhǔn), 最好是用CCP模塊的捕獲方法,因?yàn)檫M(jìn)入中斷程序會(huì)消耗時(shí)鐘周期。
回復(fù)

使用道具 舉報(bào)

ID:67992 發(fā)表于 2014-10-28 11:22 | 顯示全部樓層
我初學(xué)一月,說(shuō)不對(duì)別怪。樓主程序目的想檢測(cè)低電平持續(xù)時(shí)間,用外中斷不好處理。如用低電平觸發(fā),低電平不退出則程序死在外中斷服務(wù)程序里,其它任務(wù)做不了,包括定時(shí)中斷服務(wù)也不做。如用下降觸發(fā),則觸發(fā)后定時(shí)器計(jì)時(shí),到設(shè)定時(shí)間(1S吧?)才停止計(jì)時(shí),成了觸發(fā)式一秒定時(shí)器,當(dāng)然也可以改兩秒三秒。檢測(cè)低電平持續(xù)時(shí)間,應(yīng)該在電平持續(xù)時(shí)間內(nèi)定時(shí)器計(jì)時(shí),高電平關(guān)閉,再算時(shí)間,對(duì)吧?
回復(fù)

使用道具 舉報(bào)

ID:67992 發(fā)表于 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        //定時(shí)器中斷1
{
     num++;
     TL1 = 0x9C;  //設(shè)置定時(shí)初值
     TH1 = 0xFF;  //設(shè)置定時(shí)初值 //定時(shí)100us=0.1ms
}
void Timer1_int()  //定時(shí)器1初始化
{
        AUXR &= 0xBF;  //定時(shí)器時(shí)鐘12T模式
        TMOD &= 0x0F;  //設(shè)置定時(shí)器模式
        TMOD |= 0x10;  //設(shè)置定時(shí)器模式
        TL1 = 0x9C;  //設(shè)置定時(shí)初值
        TH1 = 0xFF;  //設(shè)置定時(shí)初值
        ET1=1;
        EA=1;
}
void write_com(char com) //輸入命令函數(shù)
{
                RS=0;
                RW=0;
                EP=0;
                P0=com;
                delay(5);
                EP=1;
                delay(5);
                EP=0;
}
void write_date(char date)//輸入數(shù)據(jù)函數(shù)
{
        RS=1;
        RW=0;
        EP=0;
        P0=date;
        delay(5);
        EP=1;
        delay(5);
        EP=0;
}
void write_init()//初始化函數(shù)
{
    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是托盤個(gè)數(shù)
              num=0;
              TR1=0;
              geshu=kuan;
            }
              display();
        }
}
回復(fù)

使用道具 舉報(bào)

ID:66032 發(fā)表于 2014-10-28 11:53 | 顯示全部樓層
老實(shí)說(shuō)我從未用過(guò)這個(gè)stc12c5a60s2; 你說(shuō)的對(duì),用捕獲的方法 要么檢測(cè)低電平持續(xù)時(shí)間, 或者檢測(cè)高電平持續(xù)時(shí)間, 然后運(yùn)用算法計(jì)算這樣的時(shí)間有多少個(gè)即可。
如果用外部中斷+定時(shí)器應(yīng)該也可以,但是比較粗略:
用一個(gè)外部中斷做觸發(fā),一定要用電平觸發(fā), 不可以用上升沿和下降沿,因?yàn)槲矬w開始時(shí)如果是上升沿, 那么結(jié)束時(shí)是下降沿, 反之依然。 一旦觸發(fā)就打開定時(shí)器timer(定時(shí)器先要關(guān))開始計(jì)時(shí), 當(dāng)下一個(gè)電平改變后停止計(jì)時(shí)器,當(dāng)接下來(lái)的電平再次改變時(shí),定時(shí)器又打開,反復(fù) 計(jì)算出這段時(shí)間, 用算法計(jì)算這樣有多少個(gè)即可。
回復(fù)

使用道具 舉報(bào)

ID:67992 發(fā)表于 2014-10-28 15:53 | 顯示全部樓層
不好意思,上面給的程序有問(wèn)題,重新改過(guò)如下:
#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        //定時(shí)器中斷1
{
     num++;
//         printexp1("num",num);
     TL1 = 0x9C;  //設(shè)置定時(shí)初值
     TH1 = 0xFF;  //設(shè)置定時(shí)初值 //定時(shí)100us=0.1ms
}
void Timer1_int()  //定時(shí)器1初始化
{
        AUXR &= 0xBF;  //定時(shí)器時(shí)鐘12T模式
        TMOD &= 0x0F;  //設(shè)置定時(shí)器模式
        TMOD |= 0x10;  //設(shè)置定時(shí)器模式
        TL1 = 0x9C;  //設(shè)置定時(shí)初值
        TH1 = 0xFF;  //設(shè)置定時(shí)初值
        ET1=1;
        EA=1;
}
void write_com(char com) //輸入命令函數(shù)
{
                RS=0;
                RW=0;
                EP=0;
                P0=com;
                delay(5);
                EP=1;
                delay(5);
                EP=0;
}
void write_date(char date)//輸入數(shù)據(jù)函數(shù)
{
        RS=1;
        RW=0;
        EP=0;
        P0=date;
        delay(5);
        EP=1;
        delay(5);
        EP=0;
}
void write_init()//初始化函數(shù)
{
    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是托盤個(gè)數(shù)
              num=0;
              TR1=0;
              geshu=kuan;
            }
                else
                {
                  num=0;
              TR1=0;
                }

              display();
        }
}
回復(fù)

使用道具 舉報(bào)

ID:67905 發(fā)表于 2014-10-29 14:08 | 顯示全部樓層
dgahz 發(fā)表于 2014-10-28 11:22
我初學(xué)一月,說(shuō)不對(duì)別怪。樓主程序目的想檢測(cè)低電平持續(xù)時(shí)間,用外中斷不好處理。如用低電平觸發(fā),低電平不 ...

對(duì),就是這意思
回復(fù)

使用道具 舉報(bào)

ID:67905 發(fā)表于 2014-10-29 14:12 | 顯示全部樓層
dgahz 發(fā)表于 2014-10-28 15:53
不好意思,上面給的程序有問(wèn)題,重新改過(guò)如下:
#include "stc.h"
//#include "uart.h"

可是燒到板上,LCD什么都不顯示啊
回復(fù)

使用道具 舉報(bào)

ID:67905 發(fā)表于 2014-10-29 14:30 | 顯示全部樓層
mqwu 發(fā)表于 2014-10-27 17:54
一定要用這個(gè)stc12c5a60s2嗎? 用PIC的話, 我可以幫你寫一個(gè),外部中斷做不準(zhǔn), 最好是用CCP模塊的捕獲方 ...

是啊,因?yàn)槠渌K要用PCA,所以必須得用它,實(shí)際上我們用的是stc12c5a16s2
回復(fù)

使用道具 舉報(bào)

ID:67992 發(fā)表于 2014-10-29 16:10 | 顯示全部樓層
#include "stc.h"
//#include "uart.h"
這些是我調(diào)試用的,和你的程序沒關(guān)系,凡是打//的可刪掉。
回復(fù)

使用道具 舉報(bào)

ID:67992 發(fā)表于 2014-10-29 16:13 | 顯示全部樓層
有東西擋住傳感器時(shí)間長(zhǎng)點(diǎn),會(huì)加1,短時(shí)間不會(huì)。
回復(fù)

使用道具 舉報(bào)

ID:67992 發(fā)表于 2014-10-29 16:16 | 顯示全部樓層
前提你的傳感器被擋住能輸出低電平。
回復(fù)

使用道具 舉報(bào)

ID:67992 發(fā)表于 2014-10-29 16:37 | 顯示全部樓層
把main里的 uart_ini();刪掉,復(fù)制時(shí)我忘在前面打//了。
回復(fù)

使用道具 舉報(bào)

ID:67905 發(fā)表于 2014-10-30 20:55 | 顯示全部樓層
我就是刪掉了之后,發(fā)現(xiàn)還是不顯示。找不到其他的問(wèn)題了。
回復(fù)

使用道具 舉報(bào)

ID:67992 發(fā)表于 2014-10-30 21:31 | 顯示全部樓層
編譯通過(guò)沒有?有沒有和其它模塊組合一起用?如果單用它是沒問(wèn)題的。我下載試過(guò),正常顯示,你改用你的頭文件,不要用我的試試。
回復(fù)

使用道具 舉報(bào)

ID:67992 發(fā)表于 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        //定時(shí)器中斷1
{
     num++;
     TL1 = 0x9C;  //設(shè)置定時(shí)初值
     TH1 = 0xFF;  //設(shè)置定時(shí)初值 //定時(shí)100us=0.1ms
}
void Timer1_int()  //定時(shí)器1初始化
{
        AUXR &= 0xBF;  //定時(shí)器時(shí)鐘12T模式
        TMOD &= 0x0F;  //設(shè)置定時(shí)器模式
        TMOD |= 0x10;  //設(shè)置定時(shí)器模式
        TL1 = 0x9C;  //設(shè)置定時(shí)初值
        TH1 = 0xFF;  //設(shè)置定時(shí)初值
        ET1=1;
        EA=1;
}
void write_com(char com) //輸入命令函數(shù)
{
                RS=0;
                RW=0;
                EP=0;
                P0=com;
                delay(5);
                EP=1;
                delay(5);
                EP=0;
}
void write_date(char date)//輸入數(shù)據(jù)函數(shù)
{
        RS=1;
        RW=0;
        EP=0;
        P0=date;
        delay(5);
        EP=1;
        delay(5);
        EP=0;
}
void write_init()//初始化函數(shù)
{
    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();
        }
}
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表