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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2986|回復: 15
打印 上一主題 下一主題
收起左側

一個簡單的單片機入門程序,用C編寫.不知道錯在哪?希望大佬指點

[復制鏈接]
跳轉到指定樓層
樓主
   利用P1口輸出高低電平,控制繼電器的開合,以實現對外部裝置的控制。
1)利用定時計數器0定時0.5秒,在定時時間到時,通過P1.2控制繼電器每隔0.5秒通斷1次,以便控制LED燈的閃爍。
         2)利用定時計數器1設置為計數模式,通過P3.5所接的按鈕開關給出計數脈沖,每檢測到一個脈沖,控制繼電器通斷1次,以便切換連接在P1.2引腳的LED燈狀態。
  我的理解:繼電器只是個幌子,其實就是一個LED燈,上面兩個要求分開來用兩個程序做我都能實現,問題是放到一個程序中再仿真,什么現象也沒有.
總程序如下,不知道錯在哪,希望大佬指點
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int

sbit P1_0=P1^0;
sbit P3_5=P3^5;
void delayms(uint xms)
{
        uint i,j;
        for(i=0;i<xms;i++)
                for(j=0;j<110;j++) ;
}

void main(void)
{
        TMOD=0x61;                                   //置定時器0工作方式1,計數器1工作方式2

        TH0=0x3c;                                   //設置計數初值,定時100ms
        TL0=0xae;
        TH1=0xff;                                   //計數1個脈沖
        TL1=0xff;
        
        EA=1;                                              //開中斷
        ET0=0;                                           //關定時器0中斷
        ET1=1;                                           //開計數器1中斷

        TF0=0;                                           //清除TF0標志位
        TF1=0;                                           //清除TF1標志位
        TR0=1;                                           //啟動定時器0
        TR1=1;                                           //啟動計數器1
        while (1)
        {
                if(TF0)
                {
                   TF0=0;                                           //清除TF0標志位
                   TH0=0x3c;                                   //重裝初值,定時100ms
               TL0=0xae;
                   P1_0=!P1_0;
                }
        }

}

void service_int1()interrupt 3 using 3
{
        P1_0=!P1_0;                                   //自動裝初值
}         

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:526188 發表于 2019-5-2 22:33 | 只看該作者
本帖最后由 單片機新手375 于 2019-5-2 22:35 編輯

重新附上程序,看得清楚點
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int

sbit P1_0=P1^0;
sbit P3_5=P3^5;
void delayms(uint xms)
{
        uint i,j;
        for(i=0;i<xms;i++)
                for(j=0;j<110;j++) ;
}

void main(void)
{
        TMOD=0x61;  //置定時器0工作方式1,計數器1工作方式2

        TH0=0x3c;     //設置計數初值,定時100ms
        TL0=0xae;
        TH1=0xff;             //計數1個脈沖
        TL1=0xff;
        
        EA=1;         //開中斷
        ET0=0;         //關定時器0中斷
        ET1=1;         //開計數器1中斷

        TF0=0;         //清除TF0標志位
        TF1=0;        //清除TF1標志位
        TR0=1;         //啟動定時器0
        TR1=1;         //啟動計數器1
        while (1)
        {
                if(TF0)
                {
                   TF0=0;          //清除TF0標志位
                   TH0=0x3c;    //重裝初值
                  TL0=0xae;
                   P1_0=!P1_0;
                }
        }

}

void service_int1()interrupt 3 using 3
{
        P1_0=!P1_0;            //自動裝初值
}         
回復

使用道具 舉報

板凳
ID:525872 發表于 2019-5-3 20:39 | 只看該作者
中斷入口必須重新裝載初值
回復

使用道具 舉報

地板
ID:525872 發表于 2019-5-3 20:40 | 只看該作者
中斷入口程序需要重新裝載值,TH1,TL1
回復

使用道具 舉報

5#
ID:185385 發表于 2019-5-3 20:46 | 只看該作者
你那個定時器查詢應該括號內加個感嘆號,然后仿真一下。
回復

使用道具 舉報

6#
ID:213173 發表于 2019-5-4 07:06 | 只看該作者
本帖最后由 wulin 于 2019-5-4 08:15 編輯


  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. sbit P1_0=P1^0;
  5. sbit P3_5=P3^5;
  6. /*
  7. void delayms(uint xms)
  8. {
  9.         uint i,j;
  10.         for(i=0;i<xms;i++)
  11.                 for(j=0;j<110;j++) ;
  12. }*/
  13. uchar i=0;  //計數變量
  14. bit flag=1;//中斷標志

  15. void main(void)
  16. {
  17.         TMOD=0x61;  //置定時器0工作方式1,計數器1工作方式2
  18.        
  19.         TH0=0x3C;        //設置定時初值,定時50ms
  20.         TL0=0xB0;
  21. //        TH0=0x3c;     //設置計數初值,定時100ms
  22. //        TL0=0xae;
  23.         TH1=0xff;             //計數1個脈沖
  24.         TL1=0xff;
  25.        
  26.         EA=1;         //開中斷
  27.         ET0=0;         //關定時器0中斷
  28.         ET1=1;         //開計數器1中斷
  29.        
  30.         TF0=0;         //清除TF0標志位
  31.         TF1=0;        //清除TF1標志位
  32.         TR0=1;         //啟動定時器0
  33.         TR1=1;         //啟動計數器1

  34.         P1_0=0;

  35.         while (1)
  36.         {
  37.                 if(TF0)
  38.                 {
  39.                         TF0=0;        //清除TF0標志位
  40.                         TH0=0x3C;    //重裝初值
  41.                         TL0=0xB0;               
  42. //                        TH0=0x3c;    //重裝初值
  43. //                        TL0=0xae;
  44.                         i++;
  45.                         if(i>=10)        //0.5秒
  46.                         {
  47.                                 i=0;
  48.                                 if(flag)
  49.                                         P1_0=~P1_0;
  50.                                 else
  51.                                         P1_0=0;
  52.                         }
  53.                 }
  54.         }
  55. }

  56. void service_int1()interrupt 3 using 3
  57. {
  58.         flag=~flag;            //自動裝初值
  59. }
復制代碼





回復

使用道具 舉報

7#
ID:526827 發表于 2019-5-4 10:52 來自手機 | 只看該作者
樓主,中斷入口程序需要重新裝載初值,TH1,TL1
回復

使用道具 舉報

8#
ID:525872 發表于 2019-5-4 12:03 | 只看該作者
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int

sbit P1_2=P1^2;
sbit P3_5=P3^5;

uchar count=0;//脈沖次數
void int0(void)//中斷計數/定時器0 初始化
{
        TMOD=0X50;//定時器1方式1
       //方式0 13位 8192,最大定時8.192ms;方式1 16位,65536,最大定時65.536ms,不能直接定時100ms
       //方式2 自動裝載8位
        TH1=(65536-1000)/256;        //整除得高位  如12/10=1        定時1ms
        TL1=(65535-1000)%256 ;        //取余得低位   如12%10=2  定時1ms
      //計算按鍵脈沖數數:在定時器計數每50us(定時越小越好,檢測越頻繁)檢測下檢測按鍵脈沖次數
        EA=1;//開總中斷
        ET1=1;TR1=1;//定時器1開啟定時中斷標志
}

void main(void)
{
        int0();//  定時器0/定時器1中斷初始化   
        while (1);
}

void service_int1()interrupt 3  //定時器1定時/計數入口
{
        TH1=(65536-1000)/256;//重新裝載定時初值  
        TL1=(65535-1000)%256 ;       
        uchar i=0;
        i++;
        if(i==500)    //0.5s=500ms=1ms*500,500次中斷即為500ms
         {
          P1_2=~P1_2;
          //取反實現0.5s閃爍;剛開始默認P1_2為1,直接接led則燈滅,接繼電器則燈是亮

          i==0;  
         }
       if(P3_5==0)//脈沖檢測
         {
           delayms(10); //按鍵消抖10ms
           if(P3_5==0)//再次確認是否被按下
             {
              count++;//計數按鍵脈沖次數,自加一次
              P1_2=0; //按鍵未松開則常亮
              while(!P3_5);//按鍵松開檢測
              i==0;
             }
         }
}
//如有疑問請加qq答疑1124485718;同時啟動兩個定時計數是不合理的,中斷有優先級,除非關閉另一個中斷
回復

使用道具 舉報

9#
ID:467275 發表于 2019-5-4 19:16 | 只看該作者

樓主,中斷入口程序需要重新裝載初值,TH1,TL1
回復

使用道具 舉報

10#
ID:526188 發表于 2019-5-5 09:08 | 只看該作者
18312284784 發表于 2019-5-3 20:40
中斷入口程序需要重新裝載值,TH1,TL1

方式2不是可以自動重裝初值嗎?
我一個用的查詢方式,一個用的中斷方式應該不沖突吧,不是很懂....
回復

使用道具 舉報

11#
ID:526188 發表于 2019-5-5 09:09 | 只看該作者
白羊一只老母豬 發表于 2019-5-3 20:46
你那個定時器查詢應該括號內加個感嘆號,然后仿真一下。

書上的都沒加,他這是判斷為1才執行吧
回復

使用道具 舉報

12#
ID:526188 發表于 2019-5-5 09:14 | 只看該作者

為什么給TH0,TL0賦值兩次?
還有if(1>=10)那一塊看不懂,中斷程序里面為什么只有flag
回復

使用道具 舉報

13#
ID:260597 發表于 2019-5-5 16:24 | 只看該作者
樓主,中斷入口程序需要重新裝載初值,TH1,TL1
回復

使用道具 舉報

14#
ID:526188 發表于 2019-5-7 08:01 | 只看該作者
877140465 發表于 2019-5-5 16:24
樓主,中斷入口程序需要重新裝載初值,TH1,TL1

重裝了,還是不行,再說方式2應該是自動裝初值吧(書上寫的)
回復

使用道具 舉報

15#
ID:528288 發表于 2019-5-7 08:47 | 只看該作者
很好的學習資料
回復

使用道具 舉報

16#
ID:213173 發表于 2019-5-7 08:48 | 只看該作者
單片機新手375 發表于 2019-5-5 09:14
為什么給TH0,TL0賦值兩次?
還有if(1>=10)那一塊看不懂,中斷程序里面為什么只有flag

如果我給你改好的程序你只是粗略的看一眼,根本就沒有試,甚至把 i 看成1,我就沒有興趣做多余的解釋了。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 网站黄色av | 久久久精 | 国产精品不卡 | 成人不卡在线 | 午夜天堂精品久久久久 | 91免费看片 | 亚洲综合视频 | 在线视频一区二区三区 | 日韩综合在线 | 精品av久久久久电影 | 国产精品国产成人国产三级 | 干干天天 | 国产一区二区免费电影 | 色呦呦网站 | 欧美日韩电影一区二区 | 激情五月综合 | 日韩中文字幕一区二区 | 亚洲看片| 日韩视频在线免费观看 | 国产日韩欧美一区 | 久久久青草婷婷精品综合日韩 | 成人在线国产 | 九九九色 | 日韩精品 电影一区 亚洲 | 日韩欧美一级片 | 久久精品视频亚洲 | 最新国产精品 | 久久国产欧美日韩精品 | 成人国产精品入口免费视频 | 91最新入口 | 国产精品成av人在线视午夜片 | 精品国产91乱码一区二区三区 | 日韩亚洲视频 | 一区精品在线观看 | 久久免费资源 | 欧美专区日韩 | 日韩成人在线播放 | 午夜激情影院 | 最新中文字幕久久 | 91精品久久久久久综合五月天 | 国产精品婷婷 |