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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

用兩組數(shù)碼管加24C02實現(xiàn)倒計時(有記憶有按鍵)單片機源碼

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:358930 發(fā)表于 2018-12-8 21:46 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
很適初學(xué)者做的例程,兩組數(shù)碼管沒有用74H595而是用N個IO直接控制,感覺這是我數(shù)碼管時代最后一個作品,51單片機,一般工業(yè)用的也只是簡單的控制,關(guān)鍵一點就是他是我們通向科技頂峰的天梯,一路走來感悟很多………致我們走過的青春。推薦個文本編輯器920,用手機上51黑更方便,只要有人貼個源代碼,復(fù)制就OK,發(fā)貼也快(題外話)

制作出來的實物圖如下:


單片機源程序如下:
  1. #include<reg51.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char//只有256
  4. #define uint unsigned int//有16位但占內(nèi)存。
  5. uchar count;//中斷計數(shù)
  6. uint sec;//秒顯示
  7. uint su;//秒顯示
  8. sbit wei0=P1^2;//位
  9. sbit wei1=P1^1;//位
  10. sbit wei2=P1^0;//位

  11. sbit wei00=P2^4;//位
  12. sbit wei01=P2^3;//位
  13. sbit wei02=P2^2;//位

  14. sbit k2=P1^4;//按鍵
  15. sbit k1=P1^5;//按鍵
  16. sbit k3=P1^6;//按鍵
  17. sbit k4=P1^7;//按鍵
  18. sbit led=P2^7;//按鍵
  19. bit write_secbf=0;//定時溢出標(biāo)志位,用來寫24C02
  20. sbit scl_24=P2^1;//24c02時鐘線
  21. sbit sda_24=P2^0;//24c02數(shù)據(jù)線

  22. bit k;//位變量取值只有0、1、黙認(rèn)為0*/
  23. void delay (int a)//毫秒級延時
  24. {
  25. int x,y;
  26. for(x=a;x>0;x--)
  27.         for(y=110;y>0;y--);
  28. }
  29. void usdelay()
  30. {
  31. _nop_();_nop_();_nop_();
  32. _nop_();_nop_();_nop_();       
  33. }
  34. uchar code table[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  35. 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //共陰表(wei=0;開反之關(guān))加顯示位(P0=table[shi]+0x80;(+或|))顯小數(shù)點
  36. /*uchar code table1[16] ={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
  37. 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//共陽表(wei=1;開反之關(guān))加顯示位(P0=table[shi]&0x7f;)顯小數(shù)點*/
  38. uint qian,bai,shi,ge;
  39. void display(int dat)//4位顯示子函數(shù)
  40. {
  41.     qian=dat/1000;
  42.         bai=dat%1000/100;
  43.         shi=dat%100/10;
  44.         ge=dat%10;
  45.         //wei3=0;
  46.         //P0=table[qian];
  47.         //delay(2);
  48.         //wei3=1;
  49.     wei2=1;
  50.         P0=table[bai];
  51.         delay(3);
  52.     wei2=0;
  53.         wei1=1;
  54.         P0=table[shi];//|0x80;
  55.         delay(3);
  56.         wei1=0;
  57.     wei0=1;
  58.         P0=table[ge];
  59.         delay(3);
  60.     wei0=0;
  61. }
  62. uint qian1,bai1,shi1,ge1;
  63. void display1(int dat)//4位顯示子函數(shù)
  64. {       
  65.     qian1=dat/1000;
  66.         bai1=dat%1000/100;
  67.         shi1=dat%100/10;
  68.         ge1=dat%10;
  69.         //wei3=0;
  70.         //P0=table[qian1];
  71.         //delay(2);
  72.         //wei3=1;
  73.     wei02=1;
  74.         P3=table[bai1];
  75.         delay(3);
  76.     wei02=0;
  77.         wei01=1;
  78.         P3=table[shi1];//|0x80;
  79.         delay(3);
  80.         wei01=0;
  81.     wei00=1;
  82.         P3=table[ge1];
  83.         delay(3);
  84.     wei00=0;
  85. }
  86. /***************以下開始為24CXX用子程序**********************/
  87. void star24()         //開始信號
  88. {//時鐘線在高電平時,數(shù)據(jù)線由高變低即為開始信號        由高變低即為開始信號
  89.         sda_24=1;
  90.         usdelay();
  91.         scl_24=1;
  92.         usdelay();
  93.         sda_24=0;//數(shù)據(jù)線由高變低即為開始信號
  94.         usdelay();
  95.         scl_24=0;
  96. }
  97. void stop24()         //結(jié)束信號
  98. {//時鐘線在高電平時,數(shù)據(jù)線由低變高即為結(jié)束信號
  99.         sda_24=0;
  100.         usdelay();
  101.         scl_24=1;
  102.         usdelay();
  103.         sda_24=1;
  104.         usdelay();
  105.         sda_24=0;        //這句可有可無
  106.         scl_24=0;        //這句可有可無
  107. }
  108. void Ack24()//應(yīng)答         
  109. {        uchar i;
  110.         scl_24=1;
  111.         usdelay();       
  112.     while((sda_24==1)&&(i<200))i++;
  113.         scl_24=0;
  114.     usdelay();
  115. }
  116. /*
  117. void NoAck24()  //不應(yīng)答
  118. {
  119.         sda_24=1;        //時鐘線高電平時,數(shù)據(jù)線高,即為不應(yīng)答
  120.         usdelay();
  121.     scl_24=1;
  122.         usdelay();
  123.         scl_24=0;
  124.     usdelay();
  125. } */
  126. /**********24c0初始化***************************/
  127. void init_24()
  128. {
  129. sda_24=1;
  130. usdelay();
  131. scl_24=1;
  132. usdelay();
  133. }
  134. /**********讀數(shù)據(jù)24c02***************************/
  135. void write_byte(uchar dat)
  136. {
  137. uchar i,temp;
  138. temp=dat;
  139. //scl_24=0;//低電平可以變數(shù)據(jù),為高時是讀,且不能變
  140. for(i=0;i<8;i++)
  141.   {
  142.    temp=temp<<1;
  143.    scl_24=0;
  144.    usdelay();
  145. sda_24=CY;//CY是PSW寄存器中的CY位,再把CY賦給SDA,再由SCL控制發(fā)出去
  146. //sda_24=(bit)(temp&0x80);//用這句也可以換掉上一句(bit)是強制轉(zhuǎn)換命令,把數(shù)據(jù)轉(zhuǎn)成非0即1
  147.    usdelay();
  148.    scl_24=1;
  149.    usdelay();
  150.   }
  151.   scl_24=0;
  152.   usdelay();
  153.   sda_24=1;//釋放總線
  154.   usdelay();
  155. }
  156. /**********讀數(shù)據(jù)24c02***************************/
  157. uchar read_byte()
  158. {

  159. uchar i,k;
  160. scl_24=0;         //這句可有可無
  161. usdelay(); //這句可有可無
  162. sda_24=1; //釋放總線
  163. usdelay();
  164. for(i=0;i<8;i++)
  165.   {
  166.    scl_24=1;
  167.    usdelay();
  168.    k=(k<<1)|sda_24;//判斷8次,移位7次
  169.    scl_24=0;
  170.    usdelay();
  171.    }
  172. return k;
  173. }
  174. /**********寫24c02指定地址的數(shù)據(jù)***************************/
  175. void write_add(uchar add,uchar dat)
  176. {
  177. star24();
  178. write_byte(0xa0);//呼叫器件,高四位為定了的1010,即A,低四位三個接了地,所以為000,最后一個0是寫標(biāo)志
  179. Ack24();//寫了后要馬上應(yīng)答
  180. write_byte(add);//寫要往哪個地址寫數(shù)據(jù)00-1023
  181. Ack24();//每寫一次要給一個應(yīng)答位
  182.   write_byte(dat);//把數(shù)據(jù)寫入
  183.    Ack24();
  184.   stop24();//給一個停止位,結(jié)束寫數(shù)據(jù)
  185. }

  186. /**********讀數(shù)據(jù)24c02指定地址的數(shù)據(jù)***************************/
  187. uchar read_add(uchar add)
  188. {
  189. uchar dat;
  190. star24();
  191. write_byte(0xa0);//呼叫器件,高四位為定了的1010,即A,低四位三個接了地,所以為000,最后一個0是寫標(biāo)志
  192. Ack24();//寫了后要馬上應(yīng)答
  193. write_byte(add);//寫入要往哪個地址讀數(shù)據(jù)00-1023
  194. Ack24();//每寫一次要給一個應(yīng)答位
  195. star24();                                                  
  196. write_byte(0xa1);//呼叫器件,高四位為定了的1010,即A,低四位三個接了地,所以為000,最后一個1是讀標(biāo)志
  197. Ack24();//寫了后要馬上應(yīng)答
  198. dat=read_byte();
  199. stop24();//給一個停止位,結(jié)束讀數(shù)據(jù)
  200. return dat;//返回一個DAT(數(shù)據(jù))
  201. }
  202. void  keyscan()
  203. {         if(k3==0&&su>0)//按K1時停TR0=0;
  204.            {
  205.                 delay(3);
  206.                 if(k3==0&&su>0) //與上sec>0條件
  207.                 while(!k3);
  208.                 //TR1=1;
  209.             TR1=~TR1;//取反定時器TR0,按一次開0,再按關(guān)1;

  210.                 }
  211.                                                                        
  212.                 if(k2==0)                                                                                                                                                    
  213.           {
  214.         delay(3);
  215.                 if(k2==0)
  216.                 while(!k2);
  217.                 TR1=0;
  218.                 su++;
  219.                 if(su>255)        su=0;
  220.                 sec=su;       
  221.                 write_add(0,sec);//在地址2 寫入min
  222.                 delay(1);            
  223.                 }
  224.                  if(k1==0)
  225.           {
  226.         delay(3);
  227.                 if(k1==0)
  228.                 while(!k1);
  229.                 TR1=0;
  230.                 su--;               
  231.                 if(su==0)        su=255;
  232.                 sec=su;       
  233.             write_add(0,sec);//在地址2 寫入min
  234.                 delay(1);   
  235.                 }
  236.         }

  237. void main()
  238. {        init_24();//24c02初始化
  239.         TMOD=0X11;//定時器1   TMOD=0X11;方式1.
  240.         TH1=(65536-50000)/256;//裝初值
  241.         TL1=(65536-50000)%256;//裝初值
  242.         EA=1;
  243.         ET1=1;
  244.         TR1=0;//定時器先關(guān)。等開關(guān)鍵啟動
  245.         led=0;//反相器0為關(guān)。       
  246.         sec=read_add(0);//從地址( )中讀出以前保存的數(shù)據(jù)
  247.         delay(2);
  248.         su=sec;
  249. while(1)
  250. {   
  251.         keyscan();  
  252.         if(count==2*1)//50000個20=1秒。
  253.         {
  254.         count=0;
  255.         sec--;
  256.         if(sec==0)//如果秒>100秒清0并執(zhí)行后面、
  257.    {
  258.          TR1=1;//定時器先關(guān)。等開關(guān)鍵啟動
  259.          sec=su;
  260.          led=~led;
  261.          //delay(10);         
  262.          //led=0;                           
  263.          }                  
  264.         }
  265. display(sec); //實時數(shù)據(jù)
  266. display1(su);//設(shè)置數(shù)據(jù)
  267. }
  268. }
  269. void timer0() interrupt 3 //定時器0的中斷子函數(shù)(外部0為0、定時0為1、外部1為2、定時1為3、串口4、)
  270. {
  271.    TH1=(65536-50000)/256;//裝初值
  272.         TL1=(65536-50000)%256;//裝初值
  273.         count++;//中斷發(fā)生后中斷計數(shù)加1
  274.         }

  275.                   
復(fù)制代碼

所有資料51hei提供下載:
IIC定時雙數(shù)碼管OK.zip (37.59 KB, 下載次數(shù): 32)


評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲乱码国产乱码精品精98午夜 | 日韩综合网| 欧美视频免费在线 | 中文字幕在线精品 | 91大神新作在线观看 | 91精品国产高清久久久久久久久 | 久久久久电影 | 蜜臀网 | 看黄在线| 久久在线 | 日韩免费中文字幕 | 成人精品久久日伦片大全免费 | 久久精品99 | 日韩欧美在线视频播放 | 欧美日韩成人在线 | 99精品国产一区二区三区 | 日韩视频―中文字幕 | 成人在线免费观看 | 午夜视频在线观看视频 | 午夜精品在线 | 中文字幕人成乱码在线观看 | 精品国产乱码久久久久久闺蜜 | 欧美成人精品激情在线观看 | 伊人久久综合 | 中文字幕在线一区 | 美女一区| 久久国产精品一区 | 欧美日韩国产高清 | 日日骚av| 欧亚av在线| 亚洲精品视频免费观看 | 日日爽| 一区二区三区在线播放 | 国产一区91精品张津瑜 | 天天干在线播放 | 亚洲一区二区三区视频免费观看 | 男人天堂99 | 色中文在线 | 国产免费人成xvideos视频 | 精品国产31久久久久久 | 久久国产精品免费一区二区三区 |