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

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

QQ登錄

只需一步,快速開始

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

32*8點(diǎn)陣屏單片機(jī)電子鐘制作資料(有C語言和匯編源碼)

[復(fù)制鏈接]
ID:290170 發(fā)表于 2018-9-17 10:09 | 顯示全部樓層 |閱讀模式
圖片 002.jpg 圖片 003.jpg 圖片 004.jpg 圖片 005.jpg 圖片 007.jpg 圖片 008.jpg 圖片 009.jpg 圖片 010.jpg 圖片 011.jpg 圖片 012.jpg 圖片 013.jpg 圖片 014.jpg 圖片 018.jpg 圖片 019.jpg

電路原理圖如下:
點(diǎn)陣屏電路.jpg 三明治電子鐘顯示部分.JPG 三明治電子鐘芯片部分.JPG 16hanz2.jpg 16hanz1.jpg

單片機(jī)源程序如下:
  1. /*-------------------------------------------
  2. 程序名:    32*8點(diǎn)陣屏電子鐘
  3. 編寫人:    杜洋 
  4. CPU說明:   MCS-51(AT89S52) 12MHZ
  5. 接口說明:  DS1302、DS18B20
  6. 修改日志:  
  7.   NO.1-20051215 完成LED驅(qū)動(dòng)、顯示切換、時(shí)鐘溫度讀取
  8.         NO.2-20051216 完成整點(diǎn)報(bào)時(shí)、填加注釋信息
  9.          NO.3-20051220 完成了調(diào)時(shí)、按鍵音等所以的功能(沒有鬧鐘)
  10.     NO.3-20051221  增加了十位為0時(shí)的消隱功能
  11. --------------------------------------------*/

  12. //------------------------------定義頭文件
  13. #include <reg51.h>//MCS-51單片機(jī)
  14. //------------------------------定義縮寫字符
  15. #define  uchar unsigned char
  16. #define  uint  unsigned int
  17. //------------------------------定義揚(yáng)聲器接口,低電平使能
  18. sbit Bell_Out  = P1 ^ 5;//揚(yáng)聲器驅(qū)動(dòng)
  19. //------------------------------定義DS18B20音
  20. sbit DQ        = P1 ^ 6;//ds1820data(單總線)
  21. //------------------------------定義DS1302時(shí)鐘接口
  22. sbit clock_clk = P3 ^ 5;//ds1302_clk(時(shí)鐘線)
  23. sbit clock_dat = P3 ^ 6;//ds1302_dat(數(shù)據(jù)線)
  24. sbit clock_Rst = P3 ^ 7;//ds1302_Rst(復(fù)位線)
  25. //-----------------------------定義數(shù)據(jù)口
  26. #define Led_13     P0  //第1、3屏數(shù)據(jù)口
  27. #define Led_24     P2  //第2、4屏數(shù)據(jù)口
  28. #define Led_E      P1  //74HC154的BCD列驅(qū)動(dòng)(P1.0~P1.4)
  29. sbit Led_EA    =   P1 ^ 4;//顯示列驅(qū)動(dòng)器(74HC154)使能
  30. //-----------------------------獨(dú)立鍵盤定義
  31. sbit Add_Key   = P3 ^ 1;//前位加1鍵
  32. sbit Add2_Key  = P3 ^ 0;//后位加1鍵
  33. sbit OK_Key    = P3 ^ 2;//確定鍵
  34. sbit int_Key   = P3 ^ 3;//中斷入口
  35. //-----------------------------定義累加器A中的各位
  36. sbit a0   = ACC ^ 0;
  37. sbit a1   = ACC ^ 1;
  38. sbit a2   = ACC ^ 2;
  39. sbit a3   = ACC ^ 3;
  40. sbit a4   = ACC ^ 4;
  41. sbit a5   = ACC ^ 5;
  42. sbit a6   = ACC ^ 6;
  43. sbit a7   = ACC ^ 7;
  44. //------------------------------------定義全局變量
  45. bit txx = 0;
  46. uchar settime;//定義標(biāo)志位
  47. uchar yy,mo,dd,xq,hh,mm,bn;//定義時(shí)間映射全局變量(專用寄存器)
  48. static uchar timecount = 0;//定義靜態(tài)軟件計(jì)數(shù)器變量
  49. static uchar pp = 0;//定義靜態(tài)小時(shí)更新用數(shù)據(jù)變量
  50. //------------------------------------函數(shù)聲明(按字母順序排列)
  51. void Beep(void);
  52. void Beep_key(void);
  53. void Beep_set(void);
  54. void clearRAM (void);
  55. uchar clock_in(void);
  56. void clock_out(uchar dd);
  57. void Delay(int num);
  58. void DelayM(uint a);
  59. void display (void);
  60. void display_s (void);
  61. void Init_1302(void);
  62. void int1 (void);
  63. void putin (uchar u);
  64. uchar read_clock(uchar ord);
  65. void read_clockS(void);
  66. void Set_time(unsigned char sel);
  67. void setput (uchar k);
  68. void Timer0(void);
  69. void Timer0_Init(void);
  70. void write_clock(uchar ord, uchar dd);
  71. uchar DL (uchar);
  72. uchar DSS (void);

  73. //-----------------------------定義顯示緩沖寄存器(32個(gè)字節(jié)全局變量)
  74. uchar Ledplay [35];//
  75. //-----------------------------定義字符數(shù)據(jù)表單(二維數(shù)組)
  76. uchar code no[][10]={
  77. //-----------------------------------數(shù)字字符表
  78. {0x7E,0xFF,0x81,0x81,0xFF,0x7E,0},//0
  79. {0x82,0xFF,0xFF,0x80,0}, //1
  80. {0xC6,0xE7,0xB1,0x99,0x8F,0x86,0},//2
  81. {0x42,0xC3,0x89,0x89,0xFF,0x76,0},//3
  82. {0x30,0x28,0xA6,0xFF,0xFF,0xA0,0},//4
  83. {0x4F,0xCF,0x89,0x89,0xF9,0x71,0},//5
  84. {0x7E,0xFF,0x89,0x8B,0xFB,0x70,0},//6
  85. {0x03,0x03,0xF9,0xFF,0x07,0},//7
  86. {0x76,0xFF,0x89,0x89,0xFF,0x76,0},//8
  87. {0x0E,0xDF,0xD1,0x91,0xFF,0x7E,0},//9
  88. //-----------------------------------星期字符表
  89. {0x10,0x10,0x10,0x10,0x10,0x10,0x18,0x10,0},//一10
  90. {0x40,0x44,0x44,0x44,0x44,0x44,0x44,0x40,0},//二
  91. {0x82,0x92,0x92,0x92,0x92,0x92,0x82,0x80,0},//三
  92. {0xFE,0xA2,0x9E,0x82,0x9E,0xA2,0xFE,0},//四
  93. {0x80,0x89,0xFF,0x89,0x89,0x89,0xF9,0x80,0},//五
  94. {0x88,0x68,0x38,0x0E,0x38,0x68,0x88,0},//六
  95. {0xFE,0x92,0x92,0x92,0x92,0xFE,0},//日                        10+6
  96. //-----------------------------------特殊字符表
  97. {0x6C,0x6C,0},//“:”                                                                17
  98. {0x18,0x18,0x18,0x18,0},//“-”                                                  18
  99. {0x06,0x06,0x78,0xFC,0x84,0x84,0x84,0x80,0},//“oC”        19
  100. {0x02,0x8E,0xFC,0xFC,0x8E,0x02,0},//“Y”(在調(diào)時(shí)時(shí)表示年)20
  101. {0x80,0x7E,0x15,0x15,0x95,0xFF,0},//“月”21
  102. {0xFE,0x92,0x92,0x92,0x92,0xFE,0}//“日”22
  103. };
  104. //-----------------------------------開機(jī)畫面,顯示“DYDIY”
  105. uchar code dydiy[]={//顯示“DYDIY”
  106. 0x82,0xFE,0xFE,0x82,0xFE,0x7C,0,
  107. 0x02,0x8E,0xFC,0xFC,0x8E,0x02,0,
  108. 0x82,0xFE,0xFE,0x82,0xFE,0x7C,0,
  109. 0x82,0xFE,0xFE,0x82,0,
  110. 0x02,0x8E,0xFC,0xFC,0x8E,0x02,0,0x99
  111. };
  112. //---------------------------------------延時(shí)函數(shù) 2uS/次
  113. void Delay(int num){
  114.         for (;num>0;num--);
  115. }
  116. //---------------------------------------延時(shí)函數(shù) 1MS/次
  117. void DelayM(unsigned int a){        
  118.                 unsigned char i;
  119.                 while( --a != 0){               
  120.                         for(i = 0; i < 125; i++);  //一個(gè) ; 表示空語句,CPU空轉(zhuǎn)。
  121.                 }                                      //i 從0加到125,CPU大概就耗時(shí)1毫秒
  122.         }
  123. //---------------------------------------1302驅(qū)動(dòng)程序(底層協(xié)議)
  124. void clock_out(unsigned char dd){
  125.         ACC=dd;
  126.         clock_dat=a0; clock_clk=1; clock_clk=0;
  127.         clock_dat=a1; clock_clk=1; clock_clk=0;
  128.         clock_dat=a2; clock_clk=1; clock_clk=0;
  129.         clock_dat=a3; clock_clk=1; clock_clk=0;
  130.         clock_dat=a4; clock_clk=1; clock_clk=0;
  131.         clock_dat=a5; clock_clk=1; clock_clk=0;
  132.         clock_dat=a6; clock_clk=1; clock_clk=0;
  133.         clock_dat=a7; clock_clk=1; clock_clk=0;
  134. }
  135. //---------------------------------------DS1302寫入字節(jié)(底層協(xié)議)
  136. unsigned char clock_in(void){
  137.         clock_dat=1;
  138.         a0=clock_dat;
  139.         clock_clk=1; clock_clk=0; a1=clock_dat;
  140.         clock_clk=1; clock_clk=0; a2=clock_dat;
  141.         clock_clk=1; clock_clk=0; a3=clock_dat;
  142.         clock_clk=1; clock_clk=0; a4=clock_dat;
  143.         clock_clk=1; clock_clk=0; a5=clock_dat;
  144.         clock_clk=1; clock_clk=0; a6=clock_dat;
  145.         clock_clk=1; clock_clk=0; a7=clock_dat;
  146.         return(ACC);
  147. }
  148. //----------------------------------------DS1302讀數(shù)據(jù)(底層協(xié)議)
  149. uchar read_clock(uchar ord){
  150.         uchar dd=0;
  151.         clock_clk=0;
  152.         clock_Rst=0;
  153.         clock_Rst=1;
  154.         clock_out(ord);
  155.         dd=clock_in();
  156.         clock_Rst=0;
  157.         clock_clk=1;
  158.         return(dd);
  159. }
  160. //---------------------------------------常用時(shí)鐘數(shù)據(jù)讀取
  161. void read_clockS(void){
  162.         mm = read_clock(0x83);//讀取分鐘數(shù)據(jù)
  163.         hh = read_clock(0x85);//小時(shí)
  164.         dd = read_clock(0x87);//日
  165.         mo = read_clock(0x89);//月
  166.         xq = read_clock(0x8b);//星期
  167.         yy = read_clock(0x8d);//年
  168. }
  169. //*---------------------------------------DS1302寫數(shù)據(jù)(底層協(xié)議)
  170. void write_clock(uchar ord, uchar dd){
  171.         clock_clk=0;
  172.         clock_Rst=0;
  173.         clock_Rst=1;
  174.         clock_out(ord);
  175.         clock_out(dd);
  176.         clock_Rst=0;
  177.         clock_clk=1;
  178. }
  179. //--------------------------------------------------調(diào)時(shí)用加1程序
  180. void Set_time(unsigned char sel){ //根據(jù)選擇調(diào)整的相應(yīng)項(xiàng)目加1并寫入DS1302
  181.   signed char address,item;
  182.   signed char max,mini;
  183.   if(sel==7)  {address=0x80; max=0;mini=0;}     //秒7
  184.   if(sel==6)  {address=0x82; max=59;mini=0;}    //分鐘6
  185.   if(sel==5)  {address=0x84; max=23;mini=0;}    //小時(shí)5
  186.   if(sel==3)  {address=0x86; max=31;mini=1;}    //日3
  187.   if(sel==2)  {address=0x88; max=12;mini=1;}    //月2
  188.   if(sel==1)  {address=0x8c; max=99; mini=0;}    //年1
  189.   if(sel==4)  {address=0x8a; max=7;mini=1;}    //星期4  
  190.   //讀取1302某地址上的數(shù)值轉(zhuǎn)換成10進(jìn)制賦給item
  191.   item=((read_clock(address+1))/16)*10 + (read_clock(address+1))%16;
  192.           item++;//數(shù)值加1  
  193.   if(item>max) item=mini;//查看數(shù)值有效范圍   
  194.   if(item<mini) item=max;           
  195.   write_clock(0x8e,0x00);//允許寫操作
  196.   write_clock(address,(item/10)*16+item%10);//轉(zhuǎn)換成16進(jìn)制寫入1302
  197.   write_clock(0x8e,0x80);//寫保護(hù),禁止寫操作  
  198. }
  199. //--------------------------------------------設(shè)置1302的初始時(shí)間
  200. void Init_1302(void){//(2005年12月20日12時(shí)00分00秒星期二)
  201.         write_clock(0x8e,0x00);//允許寫操作
  202.         write_clock(0x8c,0x05);//年
  203.         write_clock(0x8a,0x02);//星期
  204.         write_clock(0x88,0x12);//月
  205.         write_clock(0x86,0x20);//日
  206.         write_clock(0x84,0x12);//小時(shí)
  207.         write_clock(0x82,0x00);//分鐘
  208.         write_clock(0x80,0x00);//秒
  209.         write_clock(0x90,0xa5);//充電        
  210.         write_clock(0x8e,0x80);//禁止寫操作
  211. }
  212. //--------------------------------------------揚(yáng)聲器--整點(diǎn)報(bào)時(shí)
  213. void Beep(void){//BELL
  214.         uchar a;//定義變量用于發(fā)聲的長度設(shè)置
  215.         Led_EA = 1;//關(guān)列顯示驅(qū)動(dòng),防止屏幕出現(xiàn)亂碼
  216.         for(a=60;a>0;a--){//第一個(gè)聲音的長度
  217.                 Bell_Out = ~Bell_Out;//取反揚(yáng)聲器驅(qū)動(dòng)口,以產(chǎn)生音頻
  218.                 Delay(100);//音調(diào)設(shè)置延時(shí)
  219.         }
  220.         for(a=100;a>0;a--){//同上
  221.                 Bell_Out = ~Bell_Out;
  222.                 Delay(80);//
  223.         }
  224.         for(a=100;a>0;a--){//同上
  225.                 Bell_Out = ~Bell_Out;
  226.                 Delay(30);//
  227.         }
  228. }
  229. //--------------------------------------------揚(yáng)聲器--設(shè)置報(bào)警
  230. void Beep_set(void){//BELL
  231.         uchar a;//定義變量用于發(fā)聲的長度設(shè)置
  232.         Led_EA = 1;//關(guān)列顯示驅(qū)動(dòng),防止屏幕出現(xiàn)亂碼
  233.         for(a=250;a>0;a--){//第一個(gè)聲音的長度
  234.                 Bell_Out = ~Bell_Out;//取反揚(yáng)聲器驅(qū)動(dòng)口,以產(chǎn)生音頻
  235.                 Delay(20);//音調(diào)設(shè)置延時(shí)
  236.         }
  237.         for(a=100;a>0;a--){//同上
  238.                 Bell_Out = ~Bell_Out;
  239.                 Delay(80);//
  240.         }
  241. }        
  242. //----------------------------------------揚(yáng)聲器--按鍵音
  243. void Beep_key(void){
  244.         uchar a;//定義變量用于發(fā)聲的長度設(shè)置
  245.         Led_EA = 1;//關(guān)列顯示驅(qū)動(dòng),防止屏幕出現(xiàn)亂碼
  246.         for(a=100;a>0;a--){//聲音的長度
  247.                 Bell_Out = ~Bell_Out;
  248.                 Delay(50);//音調(diào)設(shè)置延時(shí)
  249.         }
  250. }
  251. //----------------------------------------32個(gè)寄存器清空(0x00)
  252. void clearRAM (void){//寄存器清空函數(shù)
  253.         uchar a;//定義變量用于清空數(shù)據(jù)指針
  254.         for(a=0;a<32;a++){//指向32個(gè)寄存器
  255.                 Ledplay[a] = 0;//將指向的寄存器清空
  256.         }
  257. }
  258. //----------------------------------------將字符裝入顯示寄存器
  259. void putin (uchar u){//字符載入函數(shù)
  260.         uchar a = 0;//定義變量用于數(shù)據(jù)提取指針
  261.         do{               
  262.                 Ledplay[bn] = no[u][a];//將二維數(shù)組中的一組數(shù)據(jù)放入顯示緩沖區(qū)
  263.                 a++;//換下一個(gè)提取字節(jié)        
  264.                 bn++;//換下一個(gè)顯示緩沖字節(jié)                        
  265.         }
  266.         while(no[u][a] != 0);//當(dāng)顯示數(shù)據(jù)為0時(shí)結(jié)束循環(huán)
  267.         bn++;//換下一個(gè)顯示緩沖字節(jié)
  268.         Ledplay[bn] = 0;//顯示一列的空位,便于字符區(qū)分        
  269. }
  270. //------------------------------------調(diào)時(shí)切換
  271. void setput (uchar k){
  272.         switch(k){//K為0調(diào)整日期,K為1調(diào)整時(shí)間,K為2調(diào)整年和星期
  273.                 case 0:{
  274.                         read_clockS();//調(diào)用時(shí)鐘芯片驅(qū)動(dòng)函數(shù),讀出時(shí)鐘數(shù)據(jù)并放入相應(yīng)的寄存器
  275.                         clearRAM();//清空顯示緩沖區(qū)數(shù)據(jù)
  276.                         bn = 0;//顯示位累加寄存器清零(從頭開始寫入顯示緩沖區(qū))
  277.                         if(mo/16 != 0){
  278.                                 putin(mo/16);//顯示月值(十位,為0時(shí)消隱)
  279.                         }
  280.                         putin(mo%16);//顯示月值(個(gè)位)
  281.                         putin(21);//顯示橫杠“月”
  282.                         if(dd/16 != 0){
  283.                                 putin(dd/16);//顯示日值(十位,為0時(shí)消隱)
  284.                         }
  285.                         putin(dd%16);//顯示日值(個(gè)位)
  286.                         putin(22);//顯示“日”
  287.                 }break;        
  288.                 case 1:{
  289.                         read_clockS();//調(diào)用時(shí)鐘芯片驅(qū)動(dòng)函數(shù),讀出時(shí)鐘數(shù)據(jù)并放入相應(yīng)的寄存器
  290.                         clearRAM();//清空顯示緩沖區(qū)數(shù)據(jù)
  291.                         bn = 0;//顯示位累加寄存器清零(從頭開始寫入顯示緩沖區(qū))
  292.                         //if(hh/16 != 0){
  293.                                 putin(hh/16);//顯示小時(shí)值(十位,為0時(shí)消隱)
  294.                         //}
  295.                         putin(hh%16);//顯示小時(shí)值(個(gè)位)
  296.                         putin(17);//顯示冒號(hào)“:”
  297.                         putin(mm/16);//顯示分鐘值(十位)
  298.                         putin(mm%16);//顯示分鐘值(個(gè)位)
  299.                 }break;        
  300.                 case 2:{
  301.                         read_clockS();//調(diào)用時(shí)鐘芯片驅(qū)動(dòng)函數(shù),讀出時(shí)鐘數(shù)據(jù)并放入相應(yīng)的寄存器
  302.                         clearRAM();//清空顯示緩沖區(qū)數(shù)據(jù)
  303.                         bn = 0;//顯示位累加寄存器清零(從頭開始寫入顯示緩沖區(qū))
  304.                         putin(yy/16);//顯示年(十位)
  305.                         putin(yy%16);//顯示年(個(gè)位)
  306.                         putin(20);//顯示“Y”表示年
  307.                         putin(xq+9);//顯示星期數(shù)據(jù)
  308.                 }break;
  309.                 default:{//數(shù)據(jù)不附時(shí)退出
  310.                 }
  311.         }
  312.         Beep_key();//按鍵音
  313. }
  314. //----------------------------------------32*8點(diǎn)陣顯示驅(qū)動(dòng)
  315. void display (void){//點(diǎn)陣屏驅(qū)動(dòng)函數(shù)
  316.         uchar ac,aa=7;//定義兩個(gè)數(shù)據(jù)變量
  317.         for(ac=0x28;ac<0x30;ac++){//掃描后兩塊LED屏(由于P1.5接揚(yáng)聲器所以高4位為2,旨在關(guān)聲音)               
  318.                 Led_E  = ac;//用ac值驅(qū)動(dòng)使能列信號(hào)               
  319.                 Led_24 = DL(Ledplay[aa+8]);//將顯示寄存器數(shù)據(jù)寫入2、4屏(嵌入DL匯編是為了翻轉(zhuǎn)字節(jié)數(shù)據(jù),如果接線正確可省去)
  320.                 Led_13 = Ledplay[aa];//將顯示寄存器數(shù)據(jù)寫入1、3屏
  321.                 Delay(60);//延時(shí)1.2微秒
  322.                 Led_13 = 0;//數(shù)據(jù)總線清空
  323.                 Led_24 = 0;
  324.                 aa--;//aa減1,換下一列顯示
  325.         }
  326.         aa = 23;//指定后16個(gè)數(shù)據(jù)的提取        
  327.         for(ac=0x20;ac<0x28;ac++){//掃描前兩塊LED屏               
  328.                 Led_E  = ac;//用ac值驅(qū)動(dòng)使能列信號(hào)               
  329.                 Led_24 = DL(Ledplay[aa+8]);//將顯示寄存器數(shù)據(jù)寫入2、4屏
  330.                 Led_13 = Ledplay[aa];//將顯示寄存器數(shù)據(jù)寫入1、3屏                                
  331.                 Delay(60);//延時(shí)1.2微秒
  332.                 Led_13 = 0;//數(shù)據(jù)總線清空
  333.                 Led_24 = 0;
  334.                 aa--;//aa減1,換下一列顯示
  335.         }
  336. }
  337. //--------------------------------------------32*8點(diǎn)陣反色顯示驅(qū)動(dòng)(表示調(diào)時(shí))
  338. void display_s (void){//點(diǎn)陣屏驅(qū)動(dòng)函數(shù)
  339.         uchar ac,aa=7;//定義兩個(gè)數(shù)據(jù)變量
  340.         for(ac=0x28;ac<0x30;ac++){//掃描后兩塊LED屏(由于P1.5接揚(yáng)聲器所以高4位為2,旨在關(guān)聲音)               
  341.                 Led_E  = ac;//用ac值驅(qū)動(dòng)使能列信號(hào)               
  342.                 Led_24 = ~DL(Ledplay[aa+8]);//將顯示寄存器數(shù)據(jù)反色寫入2、4屏(嵌入DL匯編是為了翻轉(zhuǎn)字節(jié)數(shù)據(jù),如果接線正確可省去)
  343.                 Led_13 = ~Ledplay[aa];//將顯示寄存器數(shù)據(jù)反色寫入1、3屏
  344.                 Delay(60);//延時(shí)1.2微秒
  345.                 Led_13 = 0;//數(shù)據(jù)總線清空
  346.                 Led_24 = 0;
  347.                 aa--;//aa減1,換下一列顯示
  348.         }
  349.         aa = 23;//指定后16個(gè)數(shù)據(jù)的提取        
  350.         for(ac=0x20;ac<0x28;ac++){//掃描前兩塊LED屏               
  351.                 Led_E  = ac;//用ac值驅(qū)動(dòng)使能列信號(hào)               
  352.                 Led_24 = ~DL(Ledplay[aa+8]);//將顯示寄存器數(shù)據(jù)反色寫入2、4屏
  353.                 Led_13 = ~Ledplay[aa];//將顯示寄存器數(shù)據(jù)反色寫入1、3屏                                
  354.                 Delay(60);//延時(shí)1.2微秒
  355.                 Led_13 = 0;//數(shù)據(jù)總線清空
  356.                 Led_24 = 0;
  357.                 aa--;//aa減1,換下一列顯示
  358.         }
  359. }
  360. //-------------------------------------------------------定時(shí)器0初始化
  361. void Timer0_Init(void){//定時(shí)器0初始(主函數(shù)中被調(diào)用一次)
  362.         TMOD=0x01;//定時(shí)器方式設(shè)置(定時(shí)器工作方式1-16位定時(shí))
  363.         TH0=(65535-50000)/256;//50MS
  364.         TL0=(65535-50000)%256;
  365.         EA=1;//開總中斷
  366.         ET0=1;//開定時(shí)器0中斷允許
  367.         TR0=1;//啟動(dòng)定時(shí)器0
  368. }
  369. //===============================================定時(shí)器中斷函數(shù)(產(chǎn)生顯示切換)
  370. void Timer0(void) interrupt 1 using 0{//定時(shí)器中斷入口,使用第1工作組寄存器        
  371.         TH0=(65535-50000)/256; //50ms定時(shí)(定時(shí)器工作方式1)
  372.           TL0=(65535-50000)%256;  
  373.           timecount++;//軟件計(jì)數(shù)加1
  374.         if(timecount == 20){//軟件計(jì)數(shù)加到20時(shí)顯示日期(1S)
  375.                 Led_EA  = 1;//關(guān)列顯示驅(qū)動(dòng),防止屏幕出現(xiàn)亂碼
  376.                 read_clockS();//調(diào)用時(shí)鐘芯片驅(qū)動(dòng)函數(shù),讀出時(shí)鐘數(shù)據(jù)并放入相應(yīng)的寄存器
  377.                 clearRAM();//清空顯示緩沖區(qū)數(shù)據(jù)
  378.                 bn = 0;//顯示位累加寄存器清零(從頭開始寫入顯示緩沖區(qū))
  379.                 if(mo/16 != 0){//為0時(shí)消隱
  380.                         putin(mo/16);//顯示月值(十位,為0時(shí)消隱)
  381.                 }
  382.                 putin(mo%16);//顯示月值(個(gè)位)
  383.                 putin(21);//顯示“月”
  384.                 if(dd/16 != 0){//為0時(shí)消隱
  385.                         putin(dd/16);//顯示日值(十位,為0時(shí)消隱)
  386.                 }
  387.                 putin(dd%16);//顯示日值(個(gè)位)
  388.                 putin(22);//顯示“日”                                       
  389.         }
  390.         if(timecount == 40){//軟件計(jì)數(shù)加到40時(shí)顯示時(shí)間(2S)                                
  391.                 Led_EA  = 1;//關(guān)列顯示驅(qū)動(dòng),防止屏幕出現(xiàn)亂碼                 
  392.                 clearRAM();//清空顯示緩沖區(qū)數(shù)據(jù)
  393.                 bn = 0;//顯示位累加寄存器清零(從頭開始寫入顯示緩沖區(qū))
  394.                 if(hh > 6 && hh < 22){//整點(diǎn)報(bào)時(shí)設(shè)為早6時(shí)到晚22時(shí)之間
  395.                         if(pp != hh){//當(dāng)小時(shí)值更新時(shí)則啟動(dòng)報(bào)時(shí) 
  396.                                 pp = hh;//將新的小時(shí)值放入更新寄存器
  397.                                 Beep();//啟動(dòng)報(bào)時(shí)
  398.                         }                        
  399.                 }
  400.                 //if(hh/16){//為0時(shí)消隱
  401.                         putin(hh/16);//顯示小時(shí)值(十位,為0時(shí)消隱)
  402.                 //}
  403.                 putin(hh%16);//顯示小時(shí)值(個(gè)位)
  404.                 putin(17);//顯示冒號(hào)“:”
  405.                 putin(mm/16);//顯示分鐘值(十位)
  406.                 putin(mm%16);//顯示分鐘值(個(gè)位)               
  407.         }
  408.           if(timecount > 80){////軟件計(jì)數(shù)加到80時(shí)顯示時(shí)間(1S)
  409.                 uchar ty = 0;//定義溫度寄存器變量                                      
  410.                 timecount = 0;//軟件計(jì)數(shù)清零
  411.                 Led_EA  = 1;//關(guān)列顯示驅(qū)動(dòng),防止屏幕出現(xiàn)亂碼                                                        
  412.                 ty = DSS();//將DSS匯編程序取得的溫度值放入溫度寄存器變量
  413.                         clearRAM();//清空顯示緩沖區(qū)數(shù)據(jù)
  414.                         bn = 0;//顯示位累加寄存器清零(從頭開始寫入顯示緩沖區(qū))                        
  415.                 if(ty >99){//當(dāng)溫度高于99度或未發(fā)現(xiàn)溫度傳感器(DS18B20)時(shí)顯示“--”                 
  416.                         putin(18);//顯示“--”
  417.                         putin(18);
  418.                 }
  419.                 else{//溫度小于99度并發(fā)現(xiàn)溫度傳感器(DS18B20)時(shí),顯示溫度值
  420.                         if(ty/10 != 0){//為0時(shí)消隱
  421.                                 putin(ty/10);//溫度值的十位
  422.                         }
  423.                         putin(ty%10);//溫度值的個(gè)位
  424.                 }
  425.                 putin(19);//顯示攝氏度符號(hào)“oC”
  426.                 putin(xq+9);//顯示星期數(shù)據(jù)                                      
  427.     }
  428. }
  429. //===============================================外中斷0,調(diào)時(shí)開關(guān)(P3.3)
  430. void int1 (void) interrupt 2 {//中斷入口2(INT1)
  431.         uchar a;//定義延時(shí)長度
  432.         for(a=100;a>0;a--){//延時(shí)處理,防止誤按(長按2秒后有效)
  433.                 display_s ();//反色顯示表示按鍵有效
  434.         }
  435.         if(int_Key == 0){//進(jìn)入鬧鐘設(shè)置界面
  436.                 Beep_set();//調(diào)時(shí)提示音        
  437.                 if(settime == 0x77){//如果調(diào)時(shí)標(biāo)志為0說明當(dāng)正為正常顯示狀態(tài)        
  438.                         ET0 = 0;//關(guān)定時(shí)器中斷(停止顯示切換)
  439.                         TR0 = 0;
  440.                         settime = 0;//變?yōu)檎{(diào)時(shí)的反色顯示
  441.                         setput(0);//顯示清0后的內(nèi)容                        
  442.                 }
  443.                 else{//如果調(diào)時(shí)標(biāo)志為1說明當(dāng)正為調(diào)時(shí)顯示狀態(tài)
  444.                         ET0 = 1;//開定時(shí)器中斷(開啟顯示切換)
  445.                         TR0 = 1;
  446.                         settime = 0x77;//變?yōu)檎o@示
  447.                 }
  448.                 while(int_Key == 0){//等待調(diào)時(shí)鍵釋放
  449.                         display ();//不釋放時(shí)調(diào)用屏幕顯示
  450.                 }
  451.         }
  452. }
  453. //===============================================主函數(shù),產(chǎn)生點(diǎn)陣顯示
  454. void main(void){ //主函數(shù)
  455.         uchar a = 0;//定義變量用于數(shù)據(jù)提取指針
  456.         Beep();//啟動(dòng)發(fā)出報(bào)時(shí)音(測(cè)試揚(yáng)聲器)
  457.         do{//顯示開機(jī)畫面“DYDIY”               
  458.                 Ledplay[bn] = dydiy[a];//將二維數(shù)組中的一組數(shù)據(jù)放入顯示緩沖區(qū)
  459.                 a++;//換下一個(gè)提取字節(jié)        
  460.                 bn++;//換下一個(gè)顯示緩沖字節(jié)                        
  461.         }
  462.         while(dydiy[a] != 0x99);//當(dāng)顯示數(shù)據(jù)為0時(shí)結(jié)束循環(huán)
  463.         timecount = 41;//將顯示切換值調(diào)到41,使開機(jī)畫面停留2秒
  464.         Timer0_Init();//定時(shí)器初始化
  465.         IT1 = 0;//外中斷1下沉觸發(fā)
  466.         EX1 = 1;//開外中斷1(調(diào)時(shí)鍵)
  467.         settime = 0x77;//顯示標(biāo)志為0表示正常顯示
  468. //-------------------------------------主循環(huán)體
  469.         while(1){//        
  470.                 static uchar k = 0;
  471.                 if(settime == 0x77) {//顯示標(biāo)志為0表示正常顯示
  472.                         display ();//正常顯示驅(qū)動(dòng)
  473.                         //正常顯示時(shí)同時(shí)按下Add、Add2、OK三個(gè)鍵則初始化時(shí)間
  474.                         if(Add_Key == 0 && Add2_Key ==0 && OK_Key == 0 ){
  475.                                 DelayM(100);//延時(shí)去抖動(dòng)
  476.                                 if(Add_Key == 0 && Add2_Key ==0 && OK_Key == 0 ){                        
  477.                                         Beep_set();//提示音
  478.                                         Init_1302();//調(diào)用時(shí)間初始化函數(shù)
  479.                                 }
  480.                         }
  481.                 }
  482.                 else{//顯示標(biāo)志為1表示調(diào)時(shí)狀態(tài)                                
  483.                         display_s();//調(diào)時(shí)顯示驅(qū)動(dòng)
  484.                         if(OK_Key == 0) {//調(diào)時(shí)切換鍵按下切換調(diào)時(shí)的內(nèi)容
  485. ……………………

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

匯編語言代碼:
  1. MAINP  SEGMENT  CODE    ;程序段

  2. PUBLIC  MAIN                          ;入口地址,跳轉(zhuǎn)到DL標(biāo)號(hào)處執(zhí)行匯編程序

  3. RSEG  MAINP                          ;程序段


  4.            ;這是關(guān)于DS18B20的讀寫程序,數(shù)據(jù)腳IN,晶振12MHZ
  5. ;溫度傳感器18B20匯編程序,采用器件默認(rèn)的12位轉(zhuǎn)化,最大轉(zhuǎn)化時(shí)間750微秒
  6. ;可以將檢測(cè)到的溫度直接顯示到AT89C51開發(fā)實(shí)驗(yàn)板的兩個(gè)數(shù)碼管上
  7. ;顯示溫度00到99度,很準(zhǔn)確哦~~無需校正!

  8. ;單片機(jī)內(nèi)存分配申明!
  9. TEMPER_L EQU 29H;用于保存讀出溫度的低8位
  10. TEMPER_H EQU 28H;用于保存讀出溫度的高8位
  11. in equ P3.3



  12. MAIN:
  13. LCALL GET_TEMPER;調(diào)用讀溫度子程序

  14. ;進(jìn)行溫度顯示,這里我們考慮用網(wǎng)站提供的兩位數(shù)碼管來顯示溫度
  15. ;顯示范圍00到99度,顯示精度為1度
  16. ;因?yàn)?2位轉(zhuǎn)化時(shí)每一位的精度為0.0625度,我們不要求顯示小數(shù)所以可以拋棄29H的低4位
  17. ;將28H中的低4位移入29H中的高4位,這樣獲得一個(gè)新字節(jié),這個(gè)字節(jié)就是實(shí)際測(cè)量獲得的溫度
  18. ;這個(gè)轉(zhuǎn)化溫度的方法可是我想出來的哦~~非常簡潔無需乘于0.0625系數(shù)

  19. MOV A,29H
  20.          MOV B,28H
  21. MOV C,B.0;將28H中的最低位移入C
  22. RRC A
  23. MOV C,B.1
  24. RRC A
  25. MOV C,B.2
  26. RRC A
  27. MOV C,B.3
  28. RRC A
  29. MOV 29H,A

  30. RET


  31. ; 這是DS18B20復(fù)位初始化子程序
  32. INIT_1820:
  33. SETB IN
  34. NOP
  35. CLR IN
  36. ;主機(jī)發(fā)出延時(shí)537微秒的復(fù)位低脈沖
  37. MOV R1,#3
  38. TSR1:MOV R0,#107
  39. DJNZ R0,$
  40. DJNZ R1,TSR1
  41. SETB IN;然后拉高數(shù)據(jù)線
  42. NOP
  43. NOP
  44. NOP
  45. MOV R0,#25H
  46. TSR2:
  47. JNB IN,TSR3;等待DS18B20回應(yīng)
  48. DJNZ R0,TSR2
  49. LJMP TSR4 ; 延時(shí)
  50. TSR3:
  51. ;SETB FLAG1 ; 置標(biāo)志位,表示DS1820存在
  52. LJMP TSR5
  53. TSR4:
  54. ;CLR FLAG1 ; 清標(biāo)志位,表示DS1820不存在
  55. LJMP TSR7

  56. TSR5:
  57. MOV R0,#117
  58. TSR6:
  59. DJNZ R0,TSR6 ; 時(shí)序要求延時(shí)一段時(shí)間
  60. TSR7:
  61. SETB IN
  62. RET


  63. ; 讀出轉(zhuǎn)換后的溫度值
  64. GET_TEMPER:
  65. SETB IN
  66. LCALL INIT_1820;先復(fù)位DS18B20
  67. ;JB FLAG1,TSS2
  68. ;CLR P1.2
  69. ;RET ; 判斷DS1820是否存在?若DS18B20不存在則返回
  70. TSS2:
  71. ;CLR P1.3;DS18B20已經(jīng)被檢測(cè)到!!!!!!!!!!!!!!!!!!
  72. MOV A,#0CCH ; 跳過ROM匹配
  73. LCALL WRITE_1820
  74. MOV A,#44H ; 發(fā)出溫度轉(zhuǎn)換命令
  75. LCALL WRITE_1820

  76. ;這里通過調(diào)用顯示子程序?qū)崿F(xiàn)延時(shí)一段時(shí)間,等待AD轉(zhuǎn)換結(jié)束,12位的話750微秒
  77. ;LCALL D1MS;DISPLAY

  78. LCALL INIT_1820;準(zhǔn)備讀溫度前先復(fù)位

  79. MOV A,#0CCH ; 跳過ROM匹配
  80. LCALL WRITE_1820

  81. MOV A,#0BEH ; 發(fā)出讀溫度命令
  82. LCALL WRITE_1820

  83. LCALL READ_18200; 將讀出的溫度數(shù)據(jù)保存到35H/36H

  84. RET

  85. ;寫DS18B20的子程序(有具體的時(shí)序要求)
  86. WRITE_1820:
  87. MOV R2,#8;一共8位數(shù)據(jù)
  88. CLR C
  89. WR1:
  90. CLR IN
  91. MOV R3,#6
  92. DJNZ R3,$
  93. RRC A
  94. MOV IN,C
  95. MOV R3,#23
  96. DJNZ R3,$
  97. SETB IN
  98. NOP
  99. DJNZ R2,WR1
  100. SETB IN
  101. RET

  102. ; 讀DS18B20的程序,從DS18B20中讀出兩個(gè)字節(jié)的溫度數(shù)據(jù)
  103. READ_18200:
  104. MOV R4,#2 ; 將溫度高位和低位從DS18B20中讀出
  105. MOV R1,#29H ; 低位存入29H(TEMPER_L),高位存入28H(TEMPER_H)
  106. RE00:
  107. MOV R2,#8;數(shù)據(jù)一共有8位
  108. RE01:
  109. CLR C
  110. SETB IN
  111. NOP
  112. NOP
  113. CLR IN
  114. NOP
  115. NOP
  116. NOP
  117. SETB IN

  118. MOV R3,#9
  119. RE10:
  120. DJNZ R3,RE10

  121. MOV C,IN

  122. MOV R3,#23
  123. RE20:
  124. DJNZ R3,RE20

  125. RRC A
  126. DJNZ R2,RE01
  127. MOV @R1,A
  128. DEC R1
  129. DJNZ R4,RE00
  130. RET


  131. end
復(fù)制代碼
3208LED點(diǎn)陣屏電子鐘制作全資料.JPG

所有資料51hei提供下載:
3208LED點(diǎn)陣屏電子鐘制作全資料.rar (2.19 MB, 下載次數(shù): 46)


回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 午夜成人免费视频 | 精品国产91久久久久久 | 久久国产精品一区二区 | 男插女下体视频 | 亚洲视频免费在线播放 | 亚洲精品中文字幕中文字幕 | 国产福利91精品一区二区三区 | 亚洲日韩中文字幕一区 | 97精品一区二区 | 北条麻妃国产九九九精品小说 | 午夜成人在线视频 | 国产成人一区二区 | 日本一区二区三区四区 | 99免费精品视频 | 国产精品免费观看视频 | 99综合| 欧美日韩视频 | 日韩电影中文字幕 | 夜夜草 | 成人午夜免费视频 | 久久成人国产 | 国产区精品视频 | 国产午夜精品一区二区三区四区 | 黄a网站| 日韩欧美亚洲 | 欧美一区2区三区4区公司二百 | 久久久久无码国产精品一区 | 中文二区| 亚洲欧美在线视频 | 国产精品777一区二区 | 亚洲高清视频在线观看 | 日本精品视频一区二区 | 国产精品网址 | www.久久久.com | 7777在线视频 | 91久久精品国产91久久性色tv | 午夜电影福利 | 欧美一级在线观看 | 日韩精品在线视频免费观看 | 7777在线视频免费播放 | 欧美成人在线免费 |