1024手机基地看电影,午夜福利视频导航,国产精品福利在线一区,亚洲欧美日韩另类成人,在线观看午夜日本理论片,成年超爽免费网站,国产精品成人免费,精品动作一级毛片,成人免费观看网站,97精品伊人久久大香蕉

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

QQ登錄

只需一步,快速開始

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

51單片機(jī)判斷低電平持續(xù)時(shí)間請(qǐng)問我的源碼哪里出錯(cuò)了?

[復(fù)制鏈接]
ID:718523 發(fā)表于 2020-5-29 00:47 | 顯示全部樓層 |閱讀模式
下面的代碼運(yùn)行的結(jié)果是LED錯(cuò)亂,感覺每個(gè)燈的閃爍是隨機(jī)的好像沒有規(guī)律并不是按照我的代碼執(zhí)行的。我要的結(jié)果是低電平持續(xù)時(shí)間1秒時(shí)D3閃兩下,持續(xù)時(shí)間是2秒時(shí)D2閃兩下,持續(xù)時(shí)間是3秒時(shí)D1閃兩下。大佬幫我看下吧。

單片機(jī)源程序如下:
  1. #include<reg51.h>  //  包含51單片機(jī)寄存器定義的頭文件
  2. #define uint unsigned int //unsigned是無符號(hào),int是整型。定義uint為無符號(hào)整型。
  3. unsigned char Countor; //設(shè)置全局變量,儲(chǔ)存定時(shí)器T0中斷次數(shù)
  4. sbit D0=P1^0;
  5. sbit D1=P1^1;
  6. sbit D2=P1^2;
  7. sbit D3=P1^3;

  8. /**************************************************************
  9. 函數(shù)功能:延時(shí) delayms(1000); 1秒
  10. **************************************************************/
  11. void Delay1ms()                //@12.000MHz
  12. {
  13.         unsigned char i, j;

  14.         i = 2;
  15.         j = 239;
  16.         do
  17.         {
  18.                 while (--j);
  19.         } while (--i);
  20. }

  21. void delayms(uint x)
  22. {
  23.         while(x--)Delay1ms();
  24. }

  25. /**************************************************************
  26. 函數(shù)功能:主程序
  27. **************************************************************/
  28. void main(void){
  29.         while(1){
  30.         while(D0==0);//等待眼前的低電平過去
  31.         while(D0==1);//等待下一個(gè)低電平來到
  32.                 if(D0 == 0){
  33.             EA=1;                  //開總中斷
  34.                 ET0=1;                 //定時(shí)器T0中斷允許         
  35.                 TMOD=0x01;             //使用定時(shí)器T0的模式2
  36.                 TH0=(65536-46083)/256; //定時(shí)器T0的高8位賦初值
  37.                 TL0=(65536-46083)%256; //定時(shí)器T0的高8位賦初值
  38.                 TR0=1;                 //啟動(dòng)定時(shí)器T0
  39.                 Countor=0;            //從0開始累計(jì)中斷次數(shù)
  40.                 //while(D0-1);//無限循環(huán)等待中斷
  41.                 while(D0==0);//等待低電平結(jié)束
  42.                 TR0=0;//關(guān)閉定時(shí)器                                 
  43.                 //T=N*65536+TH0*256+TL0; //N是定時(shí)器溢出次數(shù)

  44. if(Countor>=60)  //若累計(jì)滿20次,即計(jì)時(shí)滿1s
  45. {
  46.         D1=0;delayms(1000);D1=1;delayms(1000);D1=0;delayms(1000);D1=1;
  47.         Countor=0;  //將Countor清0,重新從0開始計(jì)數(shù)
  48.         
  49. }
  50. if(Countor>=40)  //若累計(jì)滿20次,即計(jì)時(shí)滿1s
  51. {
  52.         D2=0;delayms(1000);D2=1;delayms(1000);D2=0;delayms(1000);D2=1;
  53.         Countor=0;  //將Countor清0,重新從0開始計(jì)數(shù)
  54. }
  55. if(Countor>=20)  //若累計(jì)滿20次,即計(jì)時(shí)滿1s
  56. {
  57.         D3=0;delayms(1000);D3=1;delayms(1000);D3=0;delayms(1000);D3=1;
  58.         Countor=0;  //將Countor清0,重新從0開始計(jì)數(shù)
  59. }


  60.                                    }
  61.          }
  62.       
  63. }


  64. /**************************************************************
  65. 函數(shù)功能:定時(shí)器T0的中斷服務(wù)程序
  66. **************************************************************/
  67. void Time0(void) interrupt 1 using 0 //“interrupt”聲明函數(shù)為中斷服務(wù)函數(shù)
  68.                  //其后的1為定時(shí)器T0的中斷編號(hào);0表示使用第0組工作寄存器
  69. {
  70.    Countor++;   //中斷次數(shù)自加1               
  71.           TH0=(65536-46083)/256; //定時(shí)器T0的高8位重新賦初值
  72.         TL0=(65536-46083)%256; //定時(shí)器T0的高8位重新賦初值
  73. }
復(fù)制代碼



回復(fù)

使用道具 舉報(bào)

ID:660091 發(fā)表于 2020-5-29 09:14 | 顯示全部樓層
首先,你把初始化這些也放到while(1)里面去了
其次, Countor>20時(shí)就執(zhí)行第三個(gè)if(這個(gè)if里面把 Countor清零了),也就是前兩個(gè)if永遠(yuǎn)無法執(zhí)行,
回復(fù)

使用道具 舉報(bào)

ID:476599 發(fā)表于 2020-5-29 09:26 | 顯示全部樓層
你這個(gè)不管按下幾秒都是閃2下?感覺沒看明白,都是閃2下要區(qū)分嗎?
回復(fù)

使用道具 舉報(bào)

ID:389856 發(fā)表于 2020-5-29 10:56 | 顯示全部樓層
本帖最后由 墨梔 于 2020-5-29 13:00 編輯

定時(shí)器工作方式2只有低八位參與計(jì)數(shù),高八位存的是預(yù)置值,而且一般定時(shí)器計(jì)數(shù)器都會(huì)用工作方式1,方式2用于波特率發(fā)生器
回復(fù)

使用道具 舉報(bào)

ID:389856 發(fā)表于 2020-5-29 11:09 | 顯示全部樓層
發(fā)現(xiàn)你的程序邏輯是先等待當(dāng)前低電平過去,再對(duì)下一個(gè)低電平計(jì)時(shí),計(jì)時(shí)完循環(huán),如果判斷D0的時(shí)候是低電平,那就要等待這一個(gè)低電平過去,再對(duì)下個(gè)低電平計(jì)時(shí)。這種情況如果你的D0輸入不是一個(gè)高低電平時(shí)間等長的信號(hào),那就很可能出現(xiàn)亂閃的情況了
回復(fù)

使用道具 舉報(bào)

ID:401564 發(fā)表于 2020-5-29 19:15 | 顯示全部樓層
STC的51單片機(jī)都有設(shè)定成上升沿和下降沿中斷的
1:你把外部中斷設(shè)定成下降沿和上升沿中斷
2:進(jìn)入中斷之后先判斷觸發(fā)中斷的引腳電平:高電平就是上升沿觸發(fā),低電平就是上升沿觸發(fā)
3:如果是低電平就開始計(jì)時(shí),可以使用定時(shí)器,如果是高電平就停止計(jì)時(shí),然后退出中斷
這不就完事了嗎?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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