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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機(jī)OLED時(shí)鐘顯示源碼

  [復(fù)制鏈接]
ID:55815 發(fā)表于 2018-6-6 15:15 | 顯示全部樓層 |閱讀模式
oled時(shí)鐘單片機(jī)源程序如下:

  1. #include "REG52.h"
  2. #include "oled.h"

  3. #define uchar unsigned char
  4. #define uint  unsigned int
  5. #include <intrins.h>
  6. sbit         DQ = P3^6;                       //數(shù)據(jù)口define interface
  7. /***********************DS1302端口定義*******************************************/
  8. sbit clock_rst=P3^5;  //1302復(fù)位管腳定義
  9. sbit clock_dat=P1^3;  //1302I/O管腳定義
  10. sbit clock_clk=P1^2;  //1302時(shí)鐘管腳定義  
  11. /***************寄存器定義(用于記錄1302IO的輸入和輸出)*************************/
  12. sbit a0=ACC^0;
  13. sbit a1=ACC^1;
  14. sbit a2=ACC^2;
  15. sbit a3=ACC^3;
  16. sbit a4=ACC^4;
  17. sbit a5=ACC^5;
  18. sbit a6=ACC^6;
  19. sbit a7=ACC^7;

  20. /**********************1302全局變量定義******************************************/
  21. uchar sec,min,hour,day,month,year1,year2=20;//秒,分,時(shí),日,月,星期,年
  22. /************************蜂鳴器端口定義******************************************/
  23. sbit beep=P3^7;
  24. /***********************按鍵定義*************************************************/
  25. sbit key1=P1^0;
  26. sbit key2=P1^1;
  27. sbit key3=P3^4;
  28. uchar status=0;//按鍵功能選擇定義(年0,月1,日2,時(shí)3,分4 )



  29. uint tmp;                           //溫度值 variable of temperature
  30. uint Temp_Buffer = 0;
  31. uint t1;
  32. uint  t2;
  33. uint   t3;
  34. float tt;
  35. void delay2(unsigned char i)           //延時(shí)函數(shù)
  36. {
  37.         while(--i);
  38. }
  39. /**********************延時(shí)函數(shù)*************************************************/
  40. void delay(uint t)  
  41. {
  42. uint b;
  43. for(;t;t--)
  44.   for(b=0;b<121;b++);
  45. }


  46. void Init_Ds18b20(void)     //DS18B20初始化send reset and initialization command
  47. {
  48.         DQ = 1;                     //DQ復(fù)位,不要也可行。
  49.         delay2(1);                  //稍做延時(shí)
  50.         DQ = 0;                    //單片機(jī)拉低總線
  51.         delay2(250);                //精確延時(shí),維持至少480us
  52.         DQ = 1;                    //釋放總線,即拉高了總線
  53.         delay2(100);                //此處延時(shí)有足夠,確保能讓DS18B20發(fā)出存在脈沖。
  54. }
  55. uchar Read_One_Byte()       //讀取一個(gè)字節(jié)的數(shù)據(jù)read a byte date
  56.                             //讀數(shù)據(jù)時(shí),數(shù)據(jù)以字節(jié)的最低有效位先從總線移出
  57. {
  58.         uchar i   = 0;
  59.         uchar dat = 0;
  60.         for(i=8;i>0;i--)
  61.         {
  62.            DQ = 0;                 //將總線拉低,要在1us之后釋放總線
  63.                                    //單片機(jī)要在此下降沿后的15us內(nèi)讀數(shù)據(jù)才會有效。
  64.            _nop_();                 //至少維持了1us,表示讀時(shí)序開始
  65.            dat >>= 1;               //讓從總線上讀到的位數(shù)據(jù),依次從高位移動到低位。
  66.            DQ = 1;                  //釋放總線,此后DS18B20會控制總線,把數(shù)據(jù)傳輸?shù)娇偩上
  67.            delay2(1);                 //延時(shí)7us,此處參照推薦的讀時(shí)序圖,盡量把控制器采樣時(shí)間放到讀時(shí)序后的15us內(nèi)的最后部分
  68.            if(DQ)                   //控制器進(jìn)行采樣
  69.            {
  70.             dat |= 0x80;    //總線為1, DQ為1,那就把dat的最高位置1;若為0,不處理,保持0
  71.            }        
  72.            delay2(10);               //此延時(shí)不能少,確保讀時(shí)序的長度60us。
  73.         }
  74.         return (dat);
  75. }
  76. void Write_One_Byte(uchar dat)
  77. {
  78.         uchar i = 0;
  79.         for(i=8;i>0;i--)
  80.         {
  81.            DQ = 0;                        //拉低總線
  82.            _nop_();                       //至少維持了1us,表示寫時(shí)序(包括寫0時(shí)序或?qū)?時(shí)序)開始
  83.            DQ = dat&0x01;                 //從字節(jié)的最低位開始傳輸
  84.                                          //指令dat的最低位賦予給總線,必須在拉低總線后的15us內(nèi),
  85.                                          //因?yàn)?5us后DS18B20會對總線采樣。
  86.            delay2(10);                     //必須讓寫時(shí)序持續(xù)至少60us
  87.            DQ = 1;                        //寫完后,必須釋放總線,
  88.            dat >>= 1;
  89.            delay2(1);
  90.         }
  91. }
  92. uint Get_Tmp()                   //獲取溫度get the temperature
  93. {
  94.        
  95.     uchar a=0,b=0;
  96.        
  97.         Init_Ds18b20();                //初始化
  98.         Write_One_Byte(0xcc);          //忽略ROM指令
  99.         Write_One_Byte(0x44);          //溫度轉(zhuǎn)換指令
  100.         Init_Ds18b20();                 //初始化
  101.         Write_One_Byte(0xcc);          //忽略ROM指令
  102.         Write_One_Byte(0xbe);          //讀暫存器指令
  103.         a = Read_One_Byte();           //讀取到的第一個(gè)字節(jié)為溫度LSB
  104.         b = Read_One_Byte();           //讀取到的第一個(gè)字節(jié)為溫度MSB
  105.         tmp = b;                      //先把高八位有效數(shù)據(jù)賦于temp
  106.         tmp <<= 8;                    //把以上8位數(shù)據(jù)從temp低八位移到高八位
  107.         tmp = tmp|a;                //兩字節(jié)合成一個(gè)整型變量
  108.         tt = tmp*0.0625;           //得到真實(shí)十進(jìn)制溫度值,DS18B20可以精確到0.0625度
  109.     tmp =(uint)( tt*10+0.5);   //放大十倍,目的是將小數(shù)點(diǎn)后第一位也轉(zhuǎn)換為可顯示數(shù)字                              
  110.         return (tmp);
  111. }
  112. void Display_Temp()
  113. {
  114.        
  115.         Temp_Buffer = Get_Tmp() ;                                          //讀取DS18B20的值
  116.         t1=(Temp_Buffer%1000/100);           //顯示溫度十位值
  117.         t2=(Temp_Buffer%100/10);           //顯示溫度個(gè)位值
  118.                                                   
  119.         t3=(Temp_Buffer%10);                   //顯示溫度十分位值
  120.                                                   
  121.                
  122. }

  123. /*******************************************************************************/
  124. /*************************DS1302子函數(shù)******************************************/
  125. /************************1302寫驅(qū)動函數(shù)*****************************************/
  126. void write_clock(uchar dat)
  127. {
  128. ACC=dat;
  129. clock_dat=a0; clock_clk=1; clock_clk=0; //數(shù)據(jù)在上升沿變化
  130. clock_dat=a1; clock_clk=1; clock_clk=0; //下降沿寫入1302
  131. clock_dat=a2; clock_clk=1; clock_clk=0;
  132. clock_dat=a3; clock_clk=1; clock_clk=0;
  133. clock_dat=a4; clock_clk=1; clock_clk=0;
  134. clock_dat=a5; clock_clk=1; clock_clk=0;
  135. clock_dat=a6; clock_clk=1; clock_clk=0;
  136. clock_dat=a7; clock_clk=1; clock_clk=0;
  137. }
  138. /************************1302讀驅(qū)動函數(shù)*****************************************/
  139. uchar read_clock()
  140. {
  141. clock_dat=1;   //輸出賦1
  142. a0=clock_dat;clock_clk=1; clock_clk=0;  //位0為1,讀1302
  143. a1=clock_dat;clock_clk=1; clock_clk=0; //下降沿讀出有效
  144. a2=clock_dat;clock_clk=1; clock_clk=0;
  145. a3=clock_dat;clock_clk=1; clock_clk=0;
  146. a4=clock_dat;clock_clk=1; clock_clk=0;
  147. a5=clock_dat;clock_clk=1; clock_clk=0;
  148. a6=clock_dat;clock_clk=1; clock_clk=0;
  149. a7=clock_dat;clock_clk=1; clock_clk=0;
  150. return(ACC);
  151. }
  152. /***************************寫數(shù)據(jù)入1302****************************************/
  153. void write_dat_clock(uchar add,uchar dat)
  154. {
  155. clock_clk=0;
  156. clock_rst=0; //時(shí)鐘脈沖為低時(shí)
  157. clock_rst=1; //復(fù)位端才能置高
  158. write_clock(add); //寫入地址(命令字節(jié))
  159. write_clock(dat); //寫入數(shù)據(jù)
  160. clock_rst=0; //終止數(shù)據(jù)傳送
  161. clock_clk=1;
  162. }
  163. /***************************從1302讀出數(shù)據(jù)**************************************/
  164. uchar read_dat_clock(uchar add)
  165. {
  166. uchar dat=0; //定義數(shù)據(jù)儲存變量
  167. clock_clk=0;
  168. clock_rst=0;
  169. clock_rst=1;
  170. write_clock(add); //寫入要讀數(shù)據(jù)的地址
  171. dat=read_clock(); //讀出數(shù)據(jù)
  172. clock_rst=0; //終止數(shù)據(jù)傳送
  173. clock_clk=1;
  174. return dat;  //返回?cái)?shù)據(jù)
  175. }
  176. /**************************設(shè)置初始時(shí)間函數(shù)*************************************/
  177. void set_time()
  178. {
  179. read_dat_clock(0x81);    //讀取秒
  180. if(sec==0x80)          //sec為秒讀出的數(shù)值,如果最高位為1,則初始化
  181. write_dat_clock(0x8e,0x00);  //允許寫操作
  182. write_dat_clock(0x8c,0x13);  //年
  183. write_dat_clock(0x8a,0x03);  //星期
  184. write_dat_clock(0x88,0x10);  //月
  185. write_dat_clock(0x86,0x14);  //日
  186. write_dat_clock(0x84,0x21);  //小時(shí)
  187. write_dat_clock(0x82,0x56);  //分
  188. write_dat_clock(0x80,0x00);  //秒,且振蕩器工作
  189. write_dat_clock(0x90,0xa5);  //充電
  190. write_dat_clock(0x8e,0x80);  //禁止寫操作
  191. }

  192. void get_time()
  193. {
  194. sec=read_dat_clock(0x81);    //讀取秒
  195. sec=(sec>>4)*10+(sec&0x0f);  //秒二進(jìn)制轉(zhuǎn)換
  196. delay(1);
  197. min=read_dat_clock(0x83);    //讀取分鐘
  198. min=(min>>4)*10+(min&0x0f);  //分二進(jìn)制轉(zhuǎn)換
  199. delay(1);
  200. hour=read_dat_clock(0x85);   //讀取小時(shí)
  201. hour=(hour>>4)*10+(hour&0x0f);//小時(shí)二進(jìn)制轉(zhuǎn)換
  202. delay(1);
  203. day=read_dat_clock(0x87);     //讀取日期
  204. day=(day>>4)*10+(day&0x0f);   //日期二進(jìn)制轉(zhuǎn)換
  205. delay(1);
  206. month=read_dat_clock(0x89);   //讀取月份
  207. month=(month>>4)*10+(month&0x0f);//月二進(jìn)制轉(zhuǎn)換
  208. delay(1);
  209. //week=read_dat_clock(0x8b);    //讀取星期
  210. //week=(week>>4)*10+(week&0x0f);//星期二進(jìn)制轉(zhuǎn)換
  211. delay(1);
  212. year1=read_dat_clock(0x8d);     //讀取年份
  213. year1=(year1>>4)*10+(year1&0x0f); //年份二進(jìn)制轉(zhuǎn)換
  214. }         

  215. /******************************************************************************/
  216. /*****************************按鍵功能函數(shù)*************************************/
  217. void key_1()     //選擇變量函數(shù)
  218. {
  219. key1=1;
  220. if(key1==0)
  221.   delay(10);                                                                                                                                                                                                                               
  222. {
  223.   if(key1==0)
  224.   {
  225.    if(++status>5)status=0; //1控制年的變化,2控制月的變化,3控制日的變化
  226.   }       //4控制時(shí)的變化,5控制分的變化
  227.   while(key1==0);
  228. }
  229. }
  230. /******************************************************************************/
  231. void key_2()       //加函數(shù)
  232. {
  233. key2=1;
  234. if(key2==0)
  235. {
  236.   delay(10);
  237.   if(key2==0)
  238.   {
  239.    switch(status)
  240.    {
  241.     case 1:if(++year1>99)year1=0;break;
  242.     case 2:if(++month>12)month=1;break;
  243.     case 3:if(++day>31)day=1;break;
  244.     case 4:if(++hour>=24)hour=0;break;
  245.     case 5:if(++min>=60)min=0;break;
  246.    }
  247.   }
  248. while(key2==0);
  249. }
  250. }
  251. /*****************************************************************************/
  252. void key_3()//減函數(shù)
  253. {
  254.   key3=1;
  255. if(key3==0)
  256. {
  257.   delay(10);
  258.   if(key3==0)
  259.   {
  260.    switch(status)
  261.    {
  262.     case 1:if((year1--)<=0)year1=99;break;
  263.     case 2:if((month--)<=1)month=12;break;
  264.     case 3:if((day--)<=1)day=31;break;
  265.     case 4:if((hour--)<=0)hour=23;break;
  266.     case 5:if((min--)<=0)min=59;break;
  267.    }
  268.   }
  269.   while(key3==0);
  270. }
  271. }

  272. /*****************************************************************************/
  273. void key_time()    //按鍵設(shè)置時(shí)間的處理
  274. {
  275. if(status>0)
  276. {
  277. write_dat_clock(0x8e,0x00);  //允許寫操作
  278. write_dat_clock(0x8c,(year1/10)*16+year1%10);  //年
  279. //write_dat_clock(0x8a,(week/10)*16+week%10);  //星期
  280. write_dat_clock(0x88,(month/10)*16+month%10);  //月
  281. write_dat_clock(0x86,(day/10)*16+day%10);  //日
  282. write_dat_clock(0x84,(hour/10)*16+hour%10);  //小時(shí)
  283. write_dat_clock(0x82,(min/10)*16+min%10);  //分
  284. write_dat_clock(0x8e,0x80);  //禁止寫操作
  285. }
  286. }

  287. void  main()
  288. {          
  289.             OLED_Init();                        //初始化OLED  
  290.                 OLED_Clear();
  291.                 Init_Ds18b20();
  292.                 Get_Tmp();
  293.                  delay(10);
  294.                  set_time();
  295.                  
  296.         while(1)
  297.         {               
  298.                
  299.                
  300.                 Display_Temp();
  301.                 //OLED_Clear();
  302.                 OLED_ShowCHinese(0,0,0);//軟
  303.                 OLED_ShowCHinese(18,0,1);//件
  304.                 OLED_ShowCHinese(36,0,2);//設(shè)
  305.                 OLED_ShowCHinese(54,0,3);//計(jì)
  306.                 OLED_ShowCHinese(72,0,4);//田
  307.                 OLED_ShowCHinese(90,0,5);//增
  308.                 OLED_ShowCHinese(108,0,6);//良
  309.                
  310.                 //OLED_ShowString(8,2,"Design by TZL");  
  311.                  //OLED_ShowString(0,4,"Tel:15083395396");  
  312.                
  313.                 OLED_ShowCHinese(0,2,7);//實(shí)
  314.             OLED_ShowCHinese(18,2,8);//測
  315.                 OLED_ShowCHinese(36,2,9);//溫
  316.                 OLED_ShowCHinese(54,2,10);//度
  317.                  OLED_ShowCHinese(36,4,11);//年
  318.                  OLED_ShowCHinese(74,4,12);//月
  319.                  OLED_ShowCHinese(110,4,13);//日
  320.                   get_time();
  321. ……………………

  322. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
OLED時(shí)鐘顯示.zip (90.82 KB, 下載次數(shù): 570)
回復(fù)

使用道具 舉報(bào)

ID:375014 發(fā)表于 2018-7-19 17:07 | 顯示全部樓層
支持樓主DDDDDDD
回復(fù)

使用道具 舉報(bào)

ID:449272 發(fā)表于 2019-1-3 21:28 | 顯示全部樓層
請問STC8A8K64S12A能用嗎?
回復(fù)

使用道具 舉報(bào)

ID:461448 發(fā)表于 2019-1-3 23:29 | 顯示全部樓層
支持樓主,贊!!!!
回復(fù)

使用道具 舉報(bào)

ID:80243 發(fā)表于 2019-3-2 11:16 | 顯示全部樓層
謝謝!
回復(fù)

使用道具 舉報(bào)

ID:79544 發(fā)表于 2020-2-2 10:04 | 顯示全部樓層
感謝分享,學(xué)習(xí)啦!!!
回復(fù)

使用道具 舉報(bào)

ID:689267 發(fā)表于 2020-2-2 12:25 | 顯示全部樓層
感謝分享
回復(fù)

使用道具 舉報(bào)

ID:294123 發(fā)表于 2020-2-11 20:18 | 顯示全部樓層
你這個(gè)還有DS18B20測溫呀, 你有proteus仿真圖嗎,我自己畫一個(gè)試試
回復(fù)

使用道具 舉報(bào)

ID:692891 發(fā)表于 2020-2-13 20:23 | 顯示全部樓層
樓主有沒有ds1302的呢
回復(fù)

使用道具 舉報(bào)

ID:767738 發(fā)表于 2020-6-6 16:17 | 顯示全部樓層
學(xué)習(xí)了!
回復(fù)

使用道具 舉報(bào)

ID:653353 發(fā)表于 2020-11-27 07:06 | 顯示全部樓層
感謝樓主
回復(fù)

使用道具 舉報(bào)

ID:581979 發(fā)表于 2020-12-1 21:02 | 顯示全部樓層
怎么都在MAIN文件
回復(fù)

使用道具 舉報(bào)

ID:47634 發(fā)表于 2021-5-31 21:36 | 顯示全部樓層
這個(gè)很好,下載學(xué)習(xí),感謝樓主
回復(fù)

使用道具 舉報(bào)

ID:486840 發(fā)表于 2021-5-31 22:12 | 顯示全部樓層
STC12可以用嗎
回復(fù)

使用道具 舉報(bào)

ID:624685 發(fā)表于 2021-5-31 23:01 | 顯示全部樓層
感謝分享,慢慢理解。謝謝
回復(fù)

使用道具 舉報(bào)

ID:905929 發(fā)表于 2021-6-1 14:33 | 顯示全部樓層
程序復(fù)雜,下來慢慢看
回復(fù)

使用道具 舉報(bào)

ID:964692 發(fā)表于 2021-9-8 17:08 | 顯示全部樓層
oled.h是自己寫的嗎
回復(fù)

使用道具 舉報(bào)

ID:65369 發(fā)表于 2022-4-3 08:48 | 顯示全部樓層
挺好的例子,多謝!
回復(fù)

使用道具 舉報(bào)

ID:65369 發(fā)表于 2022-4-3 08:50 | 顯示全部樓層
請問OLED有 模擬I2C驅(qū)動方式的嗎,不是用硬件本身資源的
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧美一级在线 | www免费视频| 精品欧美一区二区精品久久久 | 亚洲美女视频 | 亚洲欧美日韩一区二区 | 91麻豆精品国产91久久久久久 | 亚洲三级视频 | 激情小说综合网 | 伊久在线| 日本久久久久久 | 日本亚洲一区二区 | 深夜福利亚洲 | 国产精品国产三级国产aⅴ原创 | 亚洲国产高清高潮精品美女 | 成人精品一区二区三区中文字幕 | 久久久成人免费一区二区 | 欧美综合视频在线 | 欧美精品乱码99久久影院 | 日韩欧美在线不卡 | 波多野结衣精品 | 亚洲视频免费在线 | 在线观看av网站 | 亚洲一区二区在线视频 | 国产成人精品免费视频大全最热 | 亚洲精品永久免费 | 国产精品久久久久久吹潮日韩动画 | 成人伊人网 | 久久久久久综合 | 干干干日日日 | 精品一区二区三区日本 | 亚洲乱码一区二区三区在线观看 | 中文字幕亚洲免费 | 久久99深爱久久99精品 | 天天操天天射综合网 | 亚州综合在线 | 国产日韩欧美另类 | 91精品国产91久久久久久三级 | 国产二区av | 久草中文在线 | 成年人精品视频在线观看 | 国产在线观看福利 |