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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機用按鍵切換時間和溫度

[復制鏈接]
跳轉到指定樓層
樓主
100黑幣
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int

uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共陽LED段碼表
uchar code tab1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//含小數點共陽段碼 0-9
char displayData[4];
uint shi,fen=9,miao=9,T50ms,tt;//時,分,秒,50ms
uchar bai,sh,ge,a,b,t;
sbit a0=P2^0;//連接P2.0
sbit a1=P2^1;//連接P2.1
sbit a2=P2^2;//連接P2.2
sbit a3=P2^3;//連接P2.3
sbit DQ=P3^7;//連接P3.7

/*void delay(uchar n)//延時5微秒函數
{
        do{
                _nop_();
                _nop_();
                _nop_();
                n--;
        }
        while(n);
}*/

void delay(uint n)
{
        while(n--);      
}

void init() //初始化子程序
{
        TMOD=0x01;//定時器T0為方式1
        TH0=(65536-50000)/256;//采用方式1,并設置定時器初值,50ms
        TL0=(65536-50000)%256;
        ET0=1;//啟動T0中斷允許
        EA=1;//總中斷允許
        TR0=1;//啟動T0
        EX0=1;//允許外部中斷0中斷
        //PX0=1;//外部中斷0高優先級中斷
        //PT0=1;//定時器T0中斷高優先級中斷
}

void scan()//掃描
{
          displayData[0] = tab[miao%10];
          displayData[1] = tab[(miao/10)%10];
          displayData[2] = tab[fen%10]|0x80;
          displayData[3] = tab[(fen/10)%10];      
}

void display()                //顯示位數
{
        char i;
        for(i=0;i<=3;i++)
        {
                switch(i)
                {
                        case 0:a0=0;a1=0;a2=0;a3=1;break;//顯示第0位
                        case 1:a0=0;a1=0;a2=1;a3=0;break;//顯示第1位
                        case 2:a0=0;a1=1;a2=0;a3=0;break;//顯示第2位
                        case 3:a0=1;a1=0;a2=0;a3=0;break;//顯示第3位
                }
                if(i==2){
                        P0=(displayData[i]&0x7f);//加小數點
                        }else
                P0=displayData[i];//發送數據
                        delay(200); //間隔一段時間掃描
                        P0=0xff;//高電位清零
                        }
}

int_DS18b20()//對18b20初始化函數
{
        uchar x=0;
  DQ = 1;    //DQ復位
  delay(8);
  DQ=0;    //釋放DQ
  delay(80); //DS18B20收到信號后延時
  DQ=1;   //讀取DQ
  delay(10);
        x=DQ;
  delay(20);
        return x;
}

void write_byte(uchar dat)//寫時序
{
        uchar i=0;
  for(i=8;i>0;i--){
                DQ=0;
                DQ=dat&0x01;//寫1,在15微秒內拉低
                delay(5);//寫0,拉低60微秒
                DQ=1;
                dat>>=1;//右移1位,原數值除以2
        }
        delay(4);
}

read_byte()//讀時序
{
        uchar i=0;
  uchar dat=0;
  for(i=8;i>0;i--){
                DQ=0;//拉低ds18b20單總線
                dat>>=1;
    DQ=1;//15微秒內拉釋放總線,等待ds18b20的存在脈沖
    if(DQ)
    dat|=0x80;
    delay(4);
        }
        return (dat);
}

void int_()
{
        while(int_DS18b20());
        write_byte(0xcc);//發Skip ROM命令,由于只有一只DS18B20就不需要讀取ROM編碼以及匹配ROM編碼
  write_byte(0x44);//啟動溫度轉換
}

void ReadTemperature()//讀取溫度的函數
  {
    uchar a=0;
    unsigned  b=0;
    unsigned  t=0;
                int_();
    delay(5);//延時,必要
    int_DS18b20();
    write_byte(0xCC);//跳過讀寫序列號
    write_byte(0xBE);//讀溫度寄存器
    delay(5);
    a=read_byte();//讀取溫度
    b=read_byte();      
    t=b<<4;//取高八位的后三位
    t+=(a&0xf0)>>4;//低八位的高四位加上高八位中后三位的值
    tt=a&0x0f;//小數位
    sh=((b*256+a)>>4);//實際溫度
    ge=tt*0.0625*10;
   }

void wenduxianshi()//溫度顯示的函數
{
         a0=1;
         P0=tab[sh/10];//百
         delay(100);
         a0=0;

         a1=1;
         P0=tab[sh%10]+0x80;//十位,+0x80可以顯示小數點后一位
   delay(100);
         a1=0;

   a2=1;
         P0=tab[ge%10];//個位
         delay(100);
         a2=0;

   a3=1;
         P0=0xc6;// C
         delay(100);
         a3=0;
}

void main()//主函數
{
        init();//初始化程序
        while(1){
                scan();//掃描
                display();//顯示
        }
}

void timer0() interrupt 1//timer0中斷服務子程序定是時間為50ms
{
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        T50ms++;
        if(T50ms==20)//仿分鐘
                {
                        T50ms=0;
                        miao++;
                        if(miao>=60)
                                {
                                        miao=miao-60;
                                        fen++;
                                        if(fen>=60)
                                                {
                                                        fen=fen-60;
                                                        shi++;
                                                }
                                }
                }
}
void k4q8() interrupt 0//外部中斷0
{
        uint count=0;
        while(1)
                {
                        count++;
                        ReadTemperature();
                        wenduxianshi();
                        wenduxianshi();
                        if(k2=0)//隔一段時間返回時鐘
                                {
                                             miao=miao+4;
                                        break;
                                }
                }
}
這段程序的效果是 按下按鍵由時間模塊切換到溫度模塊 4秒后自動切回時間模塊。怎么修改能變成通過點擊按鍵來回切換

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

使用道具 舉報

沙發
ID:584814 發表于 2020-6-30 07:47 | 只看該作者
居然沒看出按鍵接在哪個端口
回復

使用道具 舉報

板凳
ID:213173 發表于 2020-6-30 07:59 | 只看該作者
用按鍵切換時間和溫度




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

  5. uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共陽LED段碼表
  6. uchar code tab1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//含小數點共陽段碼 0-9
  7. uchar displayData[4];
  8. uint shi,fen=9,miao=9,T5ms,tt;//時,分,秒,50ms
  9. uchar bai,sh,ge;
  10. bit biaozhi=0;
  11. //sbit a0=P2^0;//連接P2.0
  12. //sbit a1=P2^1;//連接P2.1
  13. //sbit a2=P2^2;//連接P2.2
  14. //sbit a3=P2^3;//連接P2.3
  15. sbit DQ=P3^7;//連接P3.7



  16. void delay(uint n)
  17. {
  18.         while(n--);      
  19. }

  20. void init() //初始化子程序
  21. {
  22.         TMOD=0x01;//定時器T0為方式1
  23.         TH0=(65536-5000)/256;//采用方式1,并設置定時器初值,5ms
  24.         TL0=(65536-5000)%256;
  25.         TF0=0;//中斷請求清0
  26.         TR0=1;//啟動T0
  27.         IT0=1;//下降沿觸發
  28.         EA=1;//總中斷允許
  29.         EX0=1;//允許外部中斷0中斷
  30.         //PX0=1;//外部中斷0高優先級中斷
  31.         //PT0=1;//定時器T0中斷高優先級中斷
  32. }

  33. void display()//顯示
  34. {
  35.         static uchar i=0;
  36.         if(biaozhi==0)
  37.         {
  38.                 displayData[0] = tab[fen/10%10];
  39.                 displayData[1] = tab[fen%10]&0x7f;
  40.                 displayData[2] = tab[miao/10%10];
  41.                 displayData[3] = tab[miao%10];
  42.         }
  43.         else
  44.         {
  45.                 displayData[0] = tab[sh/10%10];
  46.                 displayData[1] = tab[sh%10]&0x7f;
  47.                 displayData[2] = tab[ge%10];
  48.                 displayData[3] = 0xc6;
  49.         }
  50.         P2&=0xf0;
  51.         P0=displayData[i];
  52.         P2|=0x01<<i;
  53.         i++;i%=4;
  54. }

  55. int_DS18b20()//對18b20初始化函數
  56. {
  57.         uchar x=0;
  58.         DQ = 1;    //DQ復位
  59.         delay(8);
  60.         DQ=0;    //釋放DQ
  61.         delay(80); //DS18B20收到信號后延時
  62.         DQ=1;   //讀取DQ
  63.         delay(10);
  64.         x=DQ;
  65.         delay(20);
  66.         return x;
  67. }

  68. void write_byte(uchar dat)//寫時序
  69. {
  70.         uchar i=0;
  71.         for(i=8;i>0;i--)
  72.         {
  73.                 DQ=0;
  74.                 DQ=dat&0x01;//寫1,在15微秒內拉低
  75.                 delay(5);//寫0,拉低60微秒
  76.                 DQ=1;
  77.                 dat>>=1;//右移1位,原數值除以2
  78.         }
  79.         delay(4);
  80. }

  81. uchar read_byte()//讀時序
  82. {
  83.         uchar i=0;
  84.         uchar dat=0;
  85.         for(i=8;i>0;i--)
  86.         {
  87.                 DQ=0;//拉低ds18b20單總線
  88.                 dat>>=1;
  89.                 DQ=1;//15微秒內拉釋放總線,等待ds18b20的存在脈沖
  90.                 if(DQ)
  91.                 dat|=0x80;
  92.                 delay(4);
  93.         }
  94.         return (dat);
  95. }
  96. void ReadTemperature()//讀取溫度的函數
  97. {
  98.         static uchar i=0;
  99.         uchar a=0,b=0;
  100.         uint t=0;
  101.         switch(i)
  102.         {
  103.                 case 0: int_DS18b20();
  104.                                 write_byte(0xcc);//發Skip ROM命令,由于只有一只DS18B20就不需要讀取ROM編碼以及匹配ROM編碼
  105.                                 write_byte(0x44);//啟動溫度轉換
  106.                                 break;
  107.                 case 1: break;//利用定時循環周期替代5ms延時
  108.                 case 2: int_DS18b20();
  109.                                 write_byte(0xCC);//跳過讀寫序列號
  110.                                 write_byte(0xBE);//讀溫度寄存器
  111.                                 break;
  112.                 case 3: break;//利用定時循環周期替代5ms延時
  113.                 case 4: a=read_byte();//讀取溫度低8位
  114.                                 b=read_byte();  //讀取溫度高8位
  115.                                 t=b<<8|a;
  116.                                 sh=t>>4;//取整數
  117.                                 ge=(a&0x0f)*0.625;//取1位小數
  118.                                 break;
  119.         }
  120.         i++;i%=5;
  121. }

  122. void main()//主函數
  123. {
  124.         init();//初始化程序

  125.         while(1)
  126.         {
  127.                 if(TF0)//查詢定時器中斷請求位
  128.                 {
  129.                         TF0=0;
  130.                         TH0=(65536-5000)/256;//5ms
  131.                         TL0=(65536-5000)%256;
  132.                         T5ms++;
  133.                         if(T5ms==200)//1s
  134.                         {
  135.                                 T5ms=0;
  136.                                 miao++;
  137.                                 if(miao>=60)
  138.                                 {
  139.                                         miao=0;
  140.                                         fen++;
  141.                                         if(fen>=60)
  142.                                                 fen=0;
  143.                                 }
  144.                         }
  145.                         ReadTemperature();//讀溫度
  146.                         display();//顯示
  147.                 }
  148.         }
  149. }

  150. void k4q8() interrupt 0//外部中斷0
  151. {
  152.         biaozhi=~biaozhi;
  153. }
復制代碼



回復

使用道具 舉報

地板
ID:801878 發表于 2020-7-28 10:21 | 只看該作者
你要設bai置一個標志變量,如flag,在進入按鍵程du序后,flag++;然后zhi加個控制判斷語句if(flag>3)flag=0;這樣,在顯示模dao塊中再加入開關語句;switch(flag){  case 0:...顯示時間..  case 1:...顯示日期。。.  case 2:...顯示溫度。。。 }
回復

使用道具 舉報

5#
ID:808700 發表于 2020-7-28 11:21 | 只看該作者
設定一個變量,,初始為0,進入時間顯示的函數,,按一下 加1, 進行溫度的函數,,再按清零,,
回復

使用道具 舉報

6#
ID:808700 發表于 2020-7-28 11:22 | 只看該作者
用判斷執行,
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人国产精品久久 | 亚洲成av人片在线观看 | 涩爱av一区二区三区 | 在线成人免费视频 | 在线观看亚洲专区 | 视频二区在线观看 | 欧美精品一二三区 | 另类专区成人 | 久久国产激情视频 | 成人av免费 | 日日噜噜噜夜夜爽爽狠狠视频97 | 久久久国产精品视频 | 成人小视频在线观看 | 久久久久久成人网 | 久久久精品 | 免费看国产精品视频 | 国产精品久久久久久久一区探花 | 免费精品一区 | 国产精品久久久久无码av | 精品久久久久久久久久久院品网 | 国产成人免费观看 | 久久久免费在线观看 | av天天看| 国产精品无码专区在线观看 | 国产精品久久亚洲 | 成人h视频在线 | 久久久国产一区二区三区 | 中文字幕av在线一二三区 | 国产精品电影在线观看 | 国产一级片一区二区 | 国产色网 | 精品综合久久 | 成人影 | 欧美专区日韩 | 亚洲资源在线 | 国产精品视频一区二区三区四蜜臂 | 免费在线视频精品 | 日韩视频在线一区 | 99成人 | 精品欧美一区二区三区久久久小说 | 日本a∨视频 |