欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: 51單片機用按鍵切換時間和溫度 [打印本頁]

作者: Zzffhh    時間: 2020-6-29 17:06
標(biāo)題: 51單片機用按鍵切換時間和溫度
#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};//含小數(shù)點共陽段碼 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微秒函數(shù)
{
        do{
                _nop_();
                _nop_();
                _nop_();
                n--;
        }
        while(n);
}*/

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

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

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()                //顯示位數(shù)
{
        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);//加小數(shù)點
                        }else
                P0=displayData[i];//發(fā)送數(shù)據(jù)
                        delay(200); //間隔一段時間掃描
                        P0=0xff;//高電位清零
                        }
}

int_DS18b20()//對18b20初始化函數(shù)
{
        uchar x=0;
  DQ = 1;    //DQ復(fù)位
  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微秒內(nèi)拉低
                delay(5);//寫0,拉低60微秒
                DQ=1;
                dat>>=1;//右移1位,原數(shù)值除以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微秒內(nèi)拉釋放總線,等待ds18b20的存在脈沖
    if(DQ)
    dat|=0x80;
    delay(4);
        }
        return (dat);
}

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

void ReadTemperature()//讀取溫度的函數(shù)
  {
    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ù)位
    sh=((b*256+a)>>4);//實際溫度
    ge=tt*0.0625*10;
   }

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

         a1=1;
         P0=tab[sh%10]+0x80;//十位,+0x80可以顯示小數(shù)點后一位
   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()//主函數(shù)
{
        init();//初始化程序
        while(1){
                scan();//掃描
                display();//顯示
        }
}

void timer0() interrupt 1//timer0中斷服務(wù)子程序定是時間為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秒后自動切回時間模塊。怎么修改能變成通過點擊按鍵來回切換

作者: man1234567    時間: 2020-6-30 07:47
居然沒看出按鍵接在哪個端口
作者: wulin    時間: 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};//含小數(shù)點共陽段碼 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,并設(shè)置定時器初值,5ms
  24.         TL0=(65536-5000)%256;
  25.         TF0=0;//中斷請求清0
  26.         TR0=1;//啟動T0
  27.         IT0=1;//下降沿觸發(fā)
  28.         EA=1;//總中斷允許
  29.         EX0=1;//允許外部中斷0中斷
  30.         //PX0=1;//外部中斷0高優(yōu)先級中斷
  31.         //PT0=1;//定時器T0中斷高優(yōu)先級中斷
  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初始化函數(shù)
  56. {
  57.         uchar x=0;
  58.         DQ = 1;    //DQ復(fù)位
  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微秒內(nèi)拉低
  75.                 delay(5);//寫0,拉低60微秒
  76.                 DQ=1;
  77.                 dat>>=1;//右移1位,原數(shù)值除以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微秒內(nèi)拉釋放總線,等待ds18b20的存在脈沖
  90.                 if(DQ)
  91.                 dat|=0x80;
  92.                 delay(4);
  93.         }
  94.         return (dat);
  95. }
  96. void ReadTemperature()//讀取溫度的函數(shù)
  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);//發(fā)Skip ROM命令,由于只有一只DS18B20就不需要讀取ROM編碼以及匹配ROM編碼
  105.                                 write_byte(0x44);//啟動溫度轉(zhuǎn)換
  106.                                 break;
  107.                 case 1: break;//利用定時循環(huán)周期替代5ms延時
  108.                 case 2: int_DS18b20();
  109.                                 write_byte(0xCC);//跳過讀寫序列號
  110.                                 write_byte(0xBE);//讀溫度寄存器
  111.                                 break;
  112.                 case 3: break;//利用定時循環(huán)周期替代5ms延時
  113.                 case 4: a=read_byte();//讀取溫度低8位
  114.                                 b=read_byte();  //讀取溫度高8位
  115.                                 t=b<<8|a;
  116.                                 sh=t>>4;//取整數(shù)
  117.                                 ge=(a&0x0f)*0.625;//取1位小數(shù)
  118.                                 break;
  119.         }
  120.         i++;i%=5;
  121. }

  122. void main()//主函數(shù)
  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. }
復(fù)制代碼




作者: 樂兒翅    時間: 2020-7-28 10:21
你要設(shè)bai置一個標(biāo)志變量,如flag,在進入按鍵程du序后,flag++;然后zhi加個控制判斷語句if(flag>3)flag=0;這樣,在顯示模dao塊中再加入開關(guān)語句;switch(flag){  case 0:...顯示時間..  case 1:...顯示日期。。.  case 2:...顯示溫度。。。 }
作者: lxbhcy    時間: 2020-7-28 11:21
設(shè)定一個變量,,初始為0,進入時間顯示的函數(shù),,按一下 加1, 進行溫度的函數(shù),,再按清零,,
作者: lxbhcy    時間: 2020-7-28 11:22
用判斷執(zhí)行,




歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1