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

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

QQ登錄

只需一步,快速開始

搜索
查看: 2050|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

1602電子時(shí)鐘帶溫度顯示單片機(jī)源碼

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:152303 發(fā)表于 2016-12-5 14:51 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
  1. #include  <reg51.h>
  2. #include  <intrins.h>

  3. #define  uchar  unsigned  char
  4. #define  uint   unsigned  int

  5. void delay(unsigned int x)//延時(shí)公用程序
  6. {
  7. unsigned char i;
  8. while(x--)
  9.     {
  10.     for(i=0;i<125;i++);
  11.     }
  12. }

  13. /********************DS1302部分程序*************************/
  14. sbit sclk=P3^1;
  15. sbit rst=P3^0;
  16. sbit io=P3^2;  //DS1302三個(gè)管腳定義
  17. unsigned char time[7]={16,2,12,5,14,28,00};//年周月日時(shí)分秒 有符號(hào)

  18. uchar write_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};//DS1302寫時(shí)間寄存器地址
  19. uchar read_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};//讀
  20. void write_ds1302_byte(uchar dat) //DS1302寫字節(jié)函數(shù)
  21. {
  22.         uchar i;
  23.         for(i=0;i<8;i++)
  24.         {
  25.                 sclk=0;                           //下降沿?cái)?shù)據(jù)有效
  26.                 io=dat&0x01;
  27.                 dat=dat>>1;
  28.                 sclk=1;
  29.         }
  30. }
  31. void write_ds1302(uchar add,uchar dat)
  32. {
  33.         rst=0;
  34.         _nop_();
  35.         sclk=0;
  36.         _nop_();
  37.         rst=1;
  38.         _nop_();
  39.         write_ds1302_byte(add);
  40.         write_ds1302_byte(dat);        //發(fā)送地址后立即發(fā)送數(shù)據(jù),沒(méi)有停頓
  41.         rst=0;
  42.         _nop_();
  43.         sclk=1;
  44.         io=1;
  45. }
  46. uchar read_ds1302(uchar add)
  47. {
  48.         uchar i,dat=0;
  49.         rst=0;
  50.         _nop_();
  51.         sclk=0;
  52.         _nop_();
  53.         rst=1;
  54.         _nop_();
  55.         write_ds1302_byte(add);        //發(fā)送地址后DS1302立即送出數(shù)據(jù)
  56.         for(i=0;i<8;i++)
  57.         {
  58.                 dat=dat>>1;
  59.                 sclk=0;
  60.                 if(io)
  61.                         dat=dat|0x80;
  62.                 sclk=1;
  63.         }
  64.         rst=0;
  65.         _nop_();
  66.         sclk=0;
  67.         _nop_();
  68.         sclk=1;
  69.         io=1;

  70.         return dat;
  71. }
  72. void ds1302_init()
  73. {
  74.         uchar i,j;
  75.         for(i=0;i<7;i++)
  76.         {
  77.                 j=time[i]/10;
  78.                 time[i]=time[i]%10;
  79.                 time[i]=time[i]+j*16;          //轉(zhuǎn)換為BCD碼
  80.         }
  81.         write_ds1302(0x8e,0x00);//去除寫保護(hù)
  82.         for(i=0;i<7;i++)
  83.         {
  84.                 write_ds1302(write_add[i],time[i]);
  85.         }
  86.     write_ds1302(0x8e,0x80);//加寫保護(hù)
  87. }
  88. void ds1302_set_time(uchar add,uchar dat) //設(shè)置DS1302時(shí)間
  89. {
  90.         uchar i;
  91.         i=dat/10;
  92.         dat%=10;
  93.         dat=dat+i*16;           //轉(zhuǎn)換十進(jìn)制為BCD碼
  94.         write_ds1302(0x8e,0x00);
  95.         write_ds1302(add,dat);
  96.     write_ds1302(0x8e,0x80);
  97. }
  98. void read_time()        //讀時(shí)間
  99. {
  100.         uchar i;
  101.         for(i=0;i<8;i++)
  102.         {
  103.                 time[i]=read_ds1302(read_add[i]);
  104.                 time[i]=time[i]/16*10+time[i]%16;//轉(zhuǎn)換BCD碼為十進(jìn)制
  105.         }
  106. }

  107. /***********************DS18B20程序********************************/
  108. sbit DQ=P3^6;  //DS18B20數(shù)據(jù)端
  109. unsigned int temperature=0;//溫度
  110. unsigned char fuhao=0;//溫度的正負(fù)符號(hào)

  111. void delay_18B20(unsigned int i)
  112. {
  113. while(i--);
  114. }
  115. /**********ds18b20初始化函數(shù)**********************/
  116. void Init_DS18B20(void)
  117. {
  118. unsigned char x=0;
  119. DQ = 1;          //DQ復(fù)位
  120. delay_18B20(2); //稍做延時(shí)
  121. DQ = 0;          //單片機(jī)將DQ拉低
  122. delay_18B20(60); //精確延時(shí) 大于 480us
  123. DQ = 1;          //拉高總線
  124. delay_18B20(2);
  125. x=DQ;            //稍做延時(shí)后 如果x=0則初始化成功 x=1則初始化失敗
  126. delay_18B20(15);
  127. }
  128. /***********ds18b20讀一個(gè)字節(jié)**************/
  129. unsigned char ReadOneChar(void)
  130. {
  131. unsigned char i=0;
  132. unsigned char dat = 0;
  133. for (i=8;i>0;i--)
  134. {
  135.     DQ = 0; // 給脈沖信號(hào)
  136.     dat>>=1;
  137.     DQ = 1; // 給脈沖信號(hào)
  138.     if(DQ)
  139.     dat |=0x80;
  140.     delay_18B20(4);
  141. }
  142.    return(dat);
  143. }
  144. /*************ds18b20寫一個(gè)字節(jié)****************/
  145. void WriteOneChar(unsigned char dat)
  146. {
  147.    unsigned char i=0;
  148.    for (i=8; i>0; i--)
  149.    {
  150.     DQ = 0;
  151.     DQ = dat&0x01;
  152.     delay_18B20(2);
  153.     DQ = 1;
  154.     dat>>=1;
  155.   }
  156. }

  157. void ReadTemperature(void)
  158. {unsigned char readdata[2]={0,0};
  159. fuhao=0;
  160. temperature=0;
  161. delay_18B20(40);       // this message is very important
  162. Init_DS18B20();
  163. WriteOneChar(0xCC);    // 跳過(guò)讀序號(hào)列號(hào)的操作
  164. WriteOneChar(0x44); // 啟動(dòng)溫度轉(zhuǎn)換
  165. delay_18B20(40);       // this message is wery important
  166. Init_DS18B20();
  167. WriteOneChar(0xCC); //跳過(guò)讀序號(hào)列號(hào)的操作
  168. WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個(gè)寄存器) 前兩個(gè)就是溫度
  169. delay_18B20(40);
  170. readdata[0]=ReadOneChar();    //讀取溫度值低位
  171. readdata[1]=ReadOneChar();      //讀取溫度值高位

  172. if (readdata[1]>127)
  173.        {readdata[0]^=0xff;//求補(bǔ)碼
  174.         readdata[1]^=0xff;
  175.         fuhao=1;//符號(hào)為“-”
  176.        }

  177. temperature =readdata[1]*256+readdata[0] ;
  178. temperature =temperature*0.625+0.5 ;//放大了10倍
  179. }

  180. /**********************LCD程序******************************/
  181. #define LCD_DATA P1
  182. sbit LCD_RS = P0^0;
  183. sbit LCD_RW = P0^1;
  184. sbit LCD_EN = P0^2;
  185. unsigned char disbuff0[16]={'D',':',' ',
  186. ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',};//LCD第一行顯示日期
  187. unsigned char disbuff1[16]={'T',':',' ',
  188. ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',};//LCD第二行顯示溫度

  189. void    Delay20ms() ;
  190. void         LCD_WriteDat(unsigned char lcd_dat);
  191. void         LCD_WriteCmd(unsigned char lcd_cmd);
  192. unsigned char         LCD_ReadStatus(void);
  193. void         LCD_Goto(unsigned char x,unsigned char y);
  194. void    LCD_Display(unsigned char row,unsigned char *str);

  195. void Delay20ms()   //粗略延時(shí);
  196. {
  197.   unsigned int tmp = 50000;
  198.   while(tmp--);
  199.   }        

  200. void         LCD_Init(void)
  201. {
  202.         Delay20ms();
  203.         /*************************************************
  204.          功能設(shè)置:        DB5=1;DB6...=0;
  205.                                                          DB4=1:8位接口; 0:4位接口;
  206.                                                          DB3=1:雙行顯示;0:?jiǎn)涡酗@示;
  207.                                                          DB3=1:5×10點(diǎn)陣;0:5×7點(diǎn)陣;               
  208.         *************************************************/
  209.   LCD_WriteCmd(0x38);        //8位機(jī)接口、雙行顯示、5×7字符點(diǎn)陣;
  210.         /*************************************************
  211.           顯示控制:DB3=1;DB4...=0;
  212.                                                   DB2=1:開啟顯示;0:關(guān)閉LCD顯示;
  213.                                                   DB1=1:顯示光標(biāo);0:光標(biāo)隱藏;
  214.                                                   DB0=1:光標(biāo)閃爍;0:光標(biāo)閃爍關(guān)閉;
  215.         *************************************************/
  216.         LCD_WriteCmd(0x0c);        //顯示開啟、光標(biāo)不顯示也不閃爍;
  217.         /*************************************************
  218.           清屏指令:DB0=1;DB1...=0;
  219.         *************************************************/
  220.         LCD_WriteCmd(0x01);        //清屏;
  221.         /****************************************************************
  222.           訪問(wèn)模式:DB2=1;DB3...=0;
  223.                                                   DB1=1:對(duì)內(nèi)部Ram讀寫后AC自增,否則自減;
  224.                                                   DB0=1:與DB1設(shè)置有關(guān),對(duì)DD RAM寫時(shí)同時(shí)整屏移動(dòng)1位;
  225.         *****************************************************************/
  226.         LCD_WriteCmd(0x06);        //光標(biāo)右移一位、整屏不移動(dòng);

  227.   LCD_Goto(0,0);
  228.         }
  229. void         LCD_WriteDat(unsigned char lcd_dat)
  230. {
  231.         unsigned char tmp;
  232.         tmp = LCD_ReadStatus();                //讀狀態(tài);
  233.         while((tmp & 0x80))                        //是否忙 ?
  234.                 {
  235.                         tmp = LCD_ReadStatus();
  236.                         }
  237.         
  238.         LCD_RS = 1;
  239.         LCD_RW = 0;
  240.         LCD_DATA = lcd_dat;
  241.         _nop_();
  242.         LCD_EN = 0;
  243.         _nop_();
  244.         _nop_();
  245.         LCD_EN = 1;
  246.         
  247.         }
  248. void         LCD_WriteCmd(unsigned char lcd_cmd)
  249. {
  250.         unsigned char tmp;
  251.         tmp = LCD_ReadStatus();
  252.         while((tmp & 0x80))
  253.         {
  254.                 tmp = LCD_ReadStatus();
  255.                 }
  256.         
  257.         LCD_RS = 0;
  258.         LCD_RW = 0;
  259.         LCD_DATA = lcd_cmd;
  260.         _nop_();
  261.         LCD_EN = 0;
  262.         _nop_();
  263.         _nop_();
  264.         LCD_EN = 1;
  265.         }
  266. unsigned char         LCD_ReadStatus(void)
  267. {
  268.         unsigned char tmp;
  269.         #if 0
  270.         LCD_RS = 0;
  271.         LCD_RW = 1;
  272.         LCD_EN = 1;
  273.         tmp = LCD_DATA;
  274.         LCD_EN = 0;
  275.         #endif
  276.         LCD_DATA = 0xff;
  277.         LCD_RS = 0;
  278.         LCD_RW = 1;
  279.         LCD_EN = 0;
  280.         _nop_();
  281.         _nop_();
  282.         LCD_EN = 1;
  283.         tmp = LCD_DATA;
  284.         return tmp;
  285.         }
  286. void         LCD_Goto(unsigned char x,unsigned char y)
  287. {
  288.         unsigned char tmp;
  289.         if(y)                                //若是第二行;
  290.                 {
  291.                         tmp = 0xc0 + x;
  292.                         LCD_WriteCmd(tmp);
  293.                         }
  294.         else
  295.                 {
  296.                         tmp = 0x80 + x;
  297.                         LCD_WriteCmd(tmp);
  298.                         }               
  299.         }
  300.         
  301. void LCD_Display(unsigned char row,unsigned char *str)
  302. {
  303.         if(row)
  304.                 {
  305.                         LCD_Goto(0,1);
  306.                         }
  307.   else
  308.           {
  309.                   LCD_Goto(0,0);
  310.                   }
  311.   while(*str != '\0')
  312.   {
  313.           LCD_WriteDat(*str++);
  314.           }
  315.         }
  316. /*************************按鍵處理程序********************************/
  317. uchar hour=0;uchar minute=0;uchar year=0;uchar month=0;uchar date=0;//時(shí)間設(shè)定
  318. uchar alarm_hour=0;uchar alarm_minute=0;//鬧鐘設(shè)定時(shí)間
  319. bit   at_flag;//鬧鐘開關(guān)標(biāo)志
  320. void key()
  321. {uchar key1=0;uchar key2=0;
  322. key1=P0;key1=key1>>3;
  323. delay(75);
  324. key2=P0;key2=key2>>3;
  325. if (key1==key2 && key1!=0x1f)
  326.     {switch (key1)
  327.             {case 0x1e://鬧鐘分設(shè)置鍵
  328.                        {while(1)
  329.                              {disbuff0[11]='_';disbuff0[12]='_';//顯示時(shí)
  330.                              delay(75);LCD_Display(0,disbuff0);//LCD第一行顯示
  331.                              disbuff0[11]=alarm_hour/10+'0';disbuff0[12]=alarm_hour%10+'0';//顯示時(shí)
  332.                                   delay(75);LCD_Display(0,disbuff0);//LCD第一行顯示
  333.                              key1=0;key1=P0;key1=key1>>3;
  334.                              if (key1==0x1b)//加
  335.                                  {if (alarm_hour<23)
  336.                                    {alarm_hour++;}
  337.                                     else
  338.                                        {alarm_hour=0;}
  339.                                 }
  340.                              if (key1==0x17)//確定
  341.                                 {break;}
  342.                              }
  343.                        }
  344.              case 0x1d://鬧鐘分設(shè)置鍵
  345.                          {while(1)        
  346.                                             {disbuff0[14]='_';disbuff0[15]='_';//顯示時(shí)
  347.                                              delay(75);LCD_Display(0,disbuff0);//LCD第一行顯示
  348.                                              disbuff0[14]=alarm_minute/10+'0';disbuff0[15]=alarm_minute%10+'0';//顯示時(shí)
  349.                                              delay(75);LCD_Display(0,disbuff0);//LCD第一行顯示
  350.                                              key1=0;key1=P0;key1=key1>>3;
  351.                                              if (key1==0x1b)//加
  352.                                                 {if (alarm_minute<59)
  353.                                                     {alarm_minute++;}
  354.                                                     else
  355.                                                         {alarm_minute=0;}
  356.                                                 }
  357.                                              if (key1==0x17)//確定
  358.                                                 {break;}
  359.                                              }
  360.                          }
  361.              case 0x0f://鬧鐘開關(guān)鍵
  362.                        {at_flag=!at_flag;
  363.                        }
  364.              default : break;
  365.             }
  366.      }


  367. }

  368. /****************蜂鳴器程序**********************/
  369. sbit speaker=P3^7;
  370. void timer0() interrupt 1 //這里輸出波形
  371. {TH0=254;//頻率為1600hz時(shí)計(jì)時(shí)器初值
  372. TL0=200;
  373. speaker=!speaker;
  374. }

  375. /********************主程序********************/
  376. void main()
  377. {
  378. ds1302_init();//初始化1302
  379. LCD_Init();//初始化LCD
  380. /*計(jì)時(shí)器0設(shè)置*/
  381. TMOD=0x11;//定時(shí)器1、2工作于方式1
  382. TH0=254;//頻率為1600hz時(shí)計(jì)時(shí)器初值
  383. TL0=200;
  384. ET0=1;  
  385. EA=0;//關(guān)閉總中斷
  386. speaker=0;
  387. //顯示welcome to BJTU
  388. disbuff0[0]=' ';disbuff0[1]=' ';disbuff0[2]='W';disbuff0[3]='e';disbuff0[4]='l';disbuff0[5]='c';disbuff0[6]='o';disbuff0[7]='m';
  389. disbuff0[8]='e';disbuff0[9]=' ';disbuff0[10]=' ';disbuff0[11]='t';disbuff0[12]='o';disbuff0[13]=' ';disbuff0[14]=' ';disbuff0[15]=' ';
  390. disbuff1[0]=' ';disbuff1[1]=' ';disbuff1[6]='Y';disbuff1[7]='O';disbuff1[8]='N';disbuff1[9]='K';disbuff1[10]='0';
  391. LCD_Display(0,disbuff0);//LCD第一行顯示
  392. LCD_Display(1,disbuff1);//LCD第二行顯示
  393. delay(5000);
  394. disbuff0[0]='D';disbuff0[1]=':';disbuff0[2]=' ';disbuff0[3]=' ';disbuff0[4]=' ';disbuff0[5]=' ';disbuff0[6]=' ';disbuff0[7]=' ';
  395. disbuff0[8]=' ';disbuff0[11]=' ';disbuff0[12]=' ';
  396. disbuff1[0]='T';disbuff1[1]=':';disbuff1[7]=' ';disbuff1[8]=' ';disbuff1[9]=' ';disbuff1[10]=' ';
  397. while(1)
  398.      {read_time();//獲取時(shí)間
  399.       year=time[0];//計(jì)算年
  400.       month=time[2];//計(jì)算月
  401.       date=time[3];//計(jì)算日
  402.       hour=time[4];//計(jì)算時(shí)
  403.       minute=time[5];//計(jì)算分

  404.       disbuff0[2]=year/10+'0';disbuff0[3]=year%10+'0';//顯示年
  405.       disbuff0[4]='-';disbuff0[5]= month/10+'0';disbuff0[6]= month%10+'0';//顯示月
  406.       disbuff0[7]='-';disbuff0[8]= date/10+'0';disbuff0[9]= date%10+'0';//顯示日
  407.       disbuff0[10]=' ';disbuff0[11]=hour/10+'0';disbuff0[12]=hour%10+'0';//顯示時(shí)
  408.       disbuff0[13]=':';disbuff0[14]=minute/10+'0';disbuff0[15]=minute%10+'0';//顯示分
  409.       ReadTemperature();//獲取溫度
  410.       if (fuhao)
  411.           {disbuff1[2]='-';}
  412.           else
  413.              {disbuff1[2]='+';}
  414.       disbuff1[3]=((temperature/1000)%10)+'0';disbuff1[4]=((temperature/100)%10)+'0';disbuff1[5]=((temperature/10)%10)+'0';
  415.       disbuff1[6]='.';disbuff1[7]=((temperature)%10)+'0';disbuff1[8]='C';
  416.       if (at_flag)//顯示鬧鐘開關(guān)
  417.                             {disbuff1[10]='A';disbuff1[11]='_';disbuff1[12]='O';disbuff1[13]='N';disbuff1[14]=' ';}
  418.                             else
  419.                                {disbuff1[10]='A';disbuff1[11]='_';disbuff1[12]='O';disbuff1[13]='F';disbuff1[14]='F';}
  420.       key();//按鍵處理程序
  421.       if (alarm_minute==minute && alarm_hour==hour && at_flag)
  422.           {EA=1;TR0=1;}
  423.          else
  424.             {EA=0;TR0=0;speaker=0;}
  425.       LCD_Display(0,disbuff0);//LCD第一行顯示
  426.       LCD_Display(1,disbuff1);//LCD第二行顯示
  427.      }
  428. }

復(fù)制代碼
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:388679 發(fā)表于 2018-8-21 21:47 | 只看該作者
我改了接口在學(xué)習(xí)板上做了 時(shí)間光標(biāo)不閃 按鍵我看不懂接哪幾個(gè)管腳
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 精品国产欧美一区二区三区成人 | 91黄在线观看 | 一级毛毛片 | 欧美成人激情 | 午夜寂寞影院在线观看 | 国产一区二区 | 天天久 | 久久精品国产99国产精品 | 二区三区视频 | 亚洲一区二区三区免费视频 | 欧美日韩精品专区 | 日韩欧美网 | 最近中文字幕在线视频1 | 日韩在线一区二区 | 久久9热| 免费人成在线观看网站 | 免费v片| 黄色片亚洲 | 日韩欧美在线不卡 | 日韩久久久久久 | 免费看国产一级特黄aaaa大片 | 一区二区影视 | 日韩中文在线视频 | 国产成人免费观看 | 992人人草 | 日韩精品一区二区三区在线观看 | 日本福利视频 | 欧美黑人国产人伦爽爽爽 | 久久久一区二区 | 久久久久久国产精品三区 | 高清视频一区二区三区 | 在线观看免费av网 | 伊人一区 | 亚洲成人久久久 | 尤物在线精品视频 | 欧美日韩不卡合集视频 | 久久久久1 | 亚洲国产视频一区 | 韩日一区二区 | 亚洲精品一区二区另类图片 | 亚洲精品天堂 |