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

標題: 用兩組數碼管加24C02實現倒計時(有記憶有按鍵)單片機源碼 [打印本頁]

作者: 冰冰潔潔    時間: 2018-12-8 21:46
標題: 用兩組數碼管加24C02實現倒計時(有記憶有按鍵)單片機源碼
很適初學者做的例程,兩組數碼管沒有用74H595而是用N個IO直接控制,感覺這是我數碼管時代最后一個作品,51單片機,一般工業用的也只是簡單的控制,關鍵一點就是他是我們通向科技頂峰的天梯,一路走來感悟很多………致我們走過的青春。推薦個文本編輯器920,用手機上51黑更方便,只要有人貼個源代碼,復制就OK,發貼也快(題外話)

制作出來的實物圖如下:


單片機源程序如下:
  1. #include<reg51.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char//只有256
  4. #define uint unsigned int//有16位但占內存。
  5. uchar count;//中斷計數
  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;//定時溢出標志位,用來寫24C02
  20. sbit scl_24=P2^1;//24c02時鐘線
  21. sbit sda_24=P2^0;//24c02數據線

  22. bit k;//位變量取值只有0、1、黙認為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;開反之關)加顯示位(P0=table[shi]+0x80;(+或|))顯小數點
  36. /*uchar code table1[16] ={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
  37. 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//共陽表(wei=1;開反之關)加顯示位(P0=table[shi]&0x7f;)顯小數點*/
  38. uint qian,bai,shi,ge;
  39. void display(int dat)//4位顯示子函數
  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位顯示子函數
  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. {//時鐘線在高電平時,數據線由高變低即為開始信號        由高變低即為開始信號
  89.         sda_24=1;
  90.         usdelay();
  91.         scl_24=1;
  92.         usdelay();
  93.         sda_24=0;//數據線由高變低即為開始信號
  94.         usdelay();
  95.         scl_24=0;
  96. }
  97. void stop24()         //結束信號
  98. {//時鐘線在高電平時,數據線由低變高即為結束信號
  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()//應答         
  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()  //不應答
  118. {
  119.         sda_24=1;        //時鐘線高電平時,數據線高,即為不應答
  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. /**********讀數據24c02***************************/
  135. void write_byte(uchar dat)
  136. {
  137. uchar i,temp;
  138. temp=dat;
  139. //scl_24=0;//低電平可以變數據,為高時是讀,且不能變
  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控制發出去
  146. //sda_24=(bit)(temp&0x80);//用這句也可以換掉上一句(bit)是強制轉換命令,把數據轉成非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. /**********讀數據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指定地址的數據***************************/
  175. void write_add(uchar add,uchar dat)
  176. {
  177. star24();
  178. write_byte(0xa0);//呼叫器件,高四位為定了的1010,即A,低四位三個接了地,所以為000,最后一個0是寫標志
  179. Ack24();//寫了后要馬上應答
  180. write_byte(add);//寫要往哪個地址寫數據00-1023
  181. Ack24();//每寫一次要給一個應答位
  182.   write_byte(dat);//把數據寫入
  183.    Ack24();
  184.   stop24();//給一個停止位,結束寫數據
  185. }

  186. /**********讀數據24c02指定地址的數據***************************/
  187. uchar read_add(uchar add)
  188. {
  189. uchar dat;
  190. star24();
  191. write_byte(0xa0);//呼叫器件,高四位為定了的1010,即A,低四位三個接了地,所以為000,最后一個0是寫標志
  192. Ack24();//寫了后要馬上應答
  193. write_byte(add);//寫入要往哪個地址讀數據00-1023
  194. Ack24();//每寫一次要給一個應答位
  195. star24();                                                  
  196. write_byte(0xa1);//呼叫器件,高四位為定了的1010,即A,低四位三個接了地,所以為000,最后一個1是讀標志
  197. Ack24();//寫了后要馬上應答
  198. dat=read_byte();
  199. stop24();//給一個停止位,結束讀數據
  200. return dat;//返回一個DAT(數據)
  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,再按關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;//定時器先關。等開關鍵啟動
  245.         led=0;//反相器0為關。       
  246.         sec=read_add(0);//從地址( )中讀出以前保存的數據
  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并執行后面、
  257.    {
  258.          TR1=1;//定時器先關。等開關鍵啟動
  259.          sec=su;
  260.          led=~led;
  261.          //delay(10);         
  262.          //led=0;                           
  263.          }                  
  264.         }
  265. display(sec); //實時數據
  266. display1(su);//設置數據
  267. }
  268. }
  269. void timer0() interrupt 3 //定時器0的中斷子函數(外部0為0、定時0為1、外部1為2、定時1為3、串口4、)
  270. {
  271.    TH1=(65536-50000)/256;//裝初值
  272.         TL1=(65536-50000)%256;//裝初值
  273.         count++;//中斷發生后中斷計數加1
  274.         }

  275.                   
復制代碼

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







歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 亚洲国产福利视频 | 精区3d动漫一品二品精区 | 国产精品久久久久久模特 | 精品国产伦一区二区三区观看体验 | 久久草在线视频 | 亚洲国产成人在线视频 | 天堂网中文 | 日本电影一区二区 | 国产精品成人av | 日韩中文字幕一区 | 成人精品在线观看 | 国产精品永久免费视频 | 欧美三区视频 | av免费看片 | 综合国产在线 | 在线观看午夜视频 | 成人精品一区二区三区中文字幕 | 九一国产精品 | 在线观看av中文字幕 | 涩涩视频网 | 国产黄色精品在线观看 | 91精品国产综合久久久久久 | 午夜激情免费视频 | 亚洲欧美中文日韩在线v日本 | 精品一二三 | 成人网av | 久久精品国产a三级三级三级 | 精品自拍视频 | 久久亚洲一区 | 超碰av在线 | 天天干天天色 | 亚洲欧美在线视频 | 久久在线视频 | 久久久免费电影 | 伦理二区 | 国产伦精品一区二区三区四区视频 | 黑色丝袜三级在线播放 | 黄色网址在线免费观看 | 欧美性猛交一区二区三区精品 | 久久草在线视频 | 偷拍自拍第一页 |