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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

新手小白編寫的51單片機可調(diào)時鐘和原理圖

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1026584 發(fā)表于 2022-5-14 21:29 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
電路原理圖如下:

  1. #include <reg52.h>
  2. #define uchar unsigned char       //為宏定義,把unsigned char用uchar表示,方便書寫
  3. #define uint unsigned int         //為宏定義,把unsigned int用uint表示,方便書寫

  4. void display();                   //顯示函數(shù)聲明
  5. uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};   //0~9,-共陰極段碼表數(shù)碼管段選編碼
  6. char hour =23, min =59, sec=55;   //定義全局變量時分秒并賦值

  7. sbit addr_A=P2^0;                 //定義addr_A為P2口的第一位
  8. sbit addr_B=P2^1;                 //定義addr_B為P2口的第二位
  9. sbit addr_C=P2^2;                 //定義addr_C為P2口的第三位

  10. sbit P10 = P1^0;                  //定義P10為P1口的第一位
  11. sbit P11 = P1^1;                  //定義P11為P1口的第二位
  12. sbit P12 = P1^2;                  //定義P12為P1口的第三位
  13. sbit P13 = P1^3;                  //定義P13為P1口的第四位

  14. uchar mode = 0;                   //0, 1, 2, 3分別表示正常計時、調(diào)時、調(diào)分、調(diào)秒模式
  15. uchar flash = 0xff;               //定義全局變量flash并賦值

  16. void delay(uint i) {              //延時函數(shù)的聲明
  17.         while(i--);
  18. }

  19. void initT0() {                   //初始化定時器函數(shù)聲明
  20.         TMOD = 0x01;                    //計數(shù)器工作在方式一,16位計數(shù)器
  21.         TH0 = (65536-50000)/256;        //給定時器0裝初值,12MHZ晶振定時時間為50ms
  22.         TL0 = (65536-50000)%256;
  23.         EA =1;                          //開總中斷
  24.         ET0 =1;                         //開定時器0分開關(guān)
  25.         TR0 =1;                         //啟動定時器
  26. }

  27. void keyScan() {                  //鍵盤掃描函數(shù)
  28.           static bit oldState = 1;      //定義靜態(tài)局部變量,保存按鍵的舊狀態(tài),1表示按鍵彈起,0表示按鍵已按下
  29.           if(!(P10&P11&P12&P13)) {      //判斷是否可能有鍵按下
  30.                         delay(1000);                //延時消抖
  31.                         if(!(P10&P11&P12&P13)) {    //再次確認(rèn)當(dāng)前是否有鍵按下,且之前沒有鍵按下
  32.                                 if(oldState) {        
  33.                                         oldState = 0;           //將舊鍵狀態(tài)更新為已按下
  34.                                         if(!P10) {              //判斷按鍵P10是否按下
  35.                                                 mode++;               //按下,mode模式加一
  36.                                                 if(mode>3) mode = 0;  //判斷mode模式是否超出邊界,超出清零
  37.                                         }
  38.                                         else if(!P11)           //判斷按鍵P11是否按下
  39.                                                 switch(mode) {        //多分支選擇語句
  40.                                                         case 1:hour++;if(hour>23) hour = 0;break;     //1模式下,小時加一;判斷小時是否超出邊界,超出清零;退出switch語句
  41.                                                         case 2:min++;if(min>59) min = 0;break;        //2模式下,分鐘加一;判斷分鐘是否超出邊界,超出清零;退出switch語句
  42.                                                         case 3:sec++;if(sec>59) sec = 0;break;        //3模式下,秒加一;判斷秒是否超出邊界,超出清零;退出switch語句
  43.                                                 }
  44.                                         else if(!P12){          //判斷按鍵P12是否按下
  45.                                                 switch(mode) {
  46.                                                         case 1:hour--;if(hour<0) hour = 23;break;     //1模式下,小時減一;判斷小時是否小于零,小于零給小時賦值23;退出switch語句
  47.                                                         case 2:min--;if(min<0) min = 59;break;        //2模式下,分鐘減一;判斷分鐘是否小于零,小于零給分鐘賦值59;退出switch語句
  48.                                                         case 3:sec--;if(sec<0) sec = 59;break;        //3模式下,秒減一;判斷秒是否小于零,小于零給秒賦值59;退出switch語句
  49.                                                 }
  50.                                         //else   //關(guān)閉鬧鐘
  51.                                         }
  52.                         }
  53.                 }
  54.         }
  55.         else if(!oldState) oldState = 1;   //檢測按鍵是否彈起
  56. }

  57. void main() {                     //主函數(shù)
  58.         initT0();                       //定時函數(shù)
  59.         while(1){                       //死循環(huán)
  60.                 keyScan();                    //鍵盤掃描函數(shù)
  61.                 display();                    //顯示函數(shù)
  62.         }
  63. }

  64. void INT_T0() interrupt 1         //中斷服務(wù)程序,其中1是定時器0入口序號
  65. {
  66.         static uchar counter = 0, counter_1=0;      //定義靜態(tài)局部變量
  67.         TR0 = 0;                        //關(guān)閉定時器
  68.         TH0 = (65536-50000)/256;        //給定時器0裝初值,12MHZ晶振定時時間為50ms
  69.         TL0 = (65536-50000)%256;
  70.         TR0 = 1;                        //啟動定時器
  71.         counter++;                      //counter加一
  72.         counter_1++;                    //counter_1加一
  73.         if(counter_1==10) {             //counter_1經(jīng)過0.5秒
  74.                  counter_1 = 0;               //counter_1清零
  75.                  flash = ~flash;              //全局變量flash按位取反
  76.         }
  77.         if(counter==20) {               //counter經(jīng)過1秒
  78.                 counter = 0;                  //counter清零
  79.         if(mode==0) sec++;              //判斷模式mode是否在0模式,是,秒加一
  80.         }
  81.         if(sec>=60) {                   //判斷秒是否大于等于60
  82.                 sec = 0;                      //秒清零
  83.                 min++;                        //分加一
  84.         }
  85.         if(min>=60) {                   //判斷分鐘是否大于等于60
  86.                 min = 0;                      //分清零
  87.                 hour++;                       //小時加一
  88.         }
  89.         if(hour>=24) {                  //判斷小時是否大于等于24
  90.                 hour = 0;                     //給小時賦0
  91.         }
  92. }

  93. void display() {                  //顯示函數(shù)
  94.         uchar LED[8], i;                //定義數(shù)組LED,局部變量i
  95.         LED[0] = hour/10;               //給數(shù)組的第一位賦值,為小時數(shù)值十位上的數(shù)
  96.         LED[1] = hour%10;               //給數(shù)組的第二位賦值,為小時數(shù)值個位上的數(shù)
  97.         LED[2] = 10;                    //給數(shù)組的第三位賦值10
  98.         LED[3] = min/10;                //給數(shù)組的第四位賦值,為分鐘數(shù)值十位上的數(shù)
  99.         LED[4] = min%10;                //給數(shù)組的第五位賦值,為分鐘數(shù)值個位上的數(shù)
  100.         LED[5] = 10;                    //給數(shù)組的第六位賦值10
  101.         LED[6] = sec/10;                //給數(shù)組的第七位賦值,為秒鐘數(shù)值十位上的數(shù)
  102.         LED[7] = sec%10;                //給數(shù)組的第八位賦值,為秒鐘數(shù)值個位上的數(shù)
  103.        
  104.         for(i=0;i<8;i++) {              //FOR循環(huán),數(shù)碼管的位選
  105.                 addr_C = i/4;                 //最高位
  106.                 addr_B = i/2%2;               //第二位
  107.                 addr_A = i%2;                 //最低位
  108.                 if(i==(mode-1)*3 || i==(mode-1)*3+1) P0=table[LED[i]] & flash;
  109.                                               //mode  0  1  2  3        當(dāng)模式mode和i滿足關(guān)系
  110.                                               //i   01   34    67       i == (mode-1)*3時
  111.                                               //i == (mode-1)*3         數(shù)碼管閃爍
  112.                 else P0 = table[LED[i]];      //不滿足上述關(guān)系時,輸出數(shù)碼管的段選編碼
  113.                 delay(200);                   //數(shù)碼管延時
  114.                 P0 = 0X00;                    //數(shù)碼管消隱
  115.         }
  116. }
  117.        
復(fù)制代碼


評分

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

查看全部評分

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

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 精品久久不卡 | 一区二区久久精品 | 在线国产中文字幕 | 日本色高清 | 中文字幕在线观看 | 日韩精品一区二区三区 | 9久9久9久女女女九九九一九 | 国产日韩av一区二区 | 日本精品久久久久久久 | 国产精品美女久久久久久久网站 | 国产精品久久久久久238 | 成人在线免费观看视频 | 中文字幕在线观看www | 精品一区二区三区在线视频 | 国产乱码精品一区二区三区五月婷 | 欧美一级大片免费看 | 91久久国产综合久久91精品网站 | 337p日韩 | 天天爽夜夜爽精品视频婷婷 | 91精品导航 | 成人国产精品久久 | 中文字幕一二三区 | 狠狠综合网 | 日韩欧美精品一区 | 亚洲在线高清 | www.日韩| 亚洲天堂网站 | www国产成人免费观看视频,深夜成人网 | 精品免费国产一区二区三区四区介绍 | 亚洲精品一区在线 | 人妖一区 | 91精品国产乱码久久久久久久 | 色伊人久久 | 搞av.com | avav在线看 | 久久国产欧美日韩精品 | 蜜臀网| 国产精品夜间视频香蕉 | 亚洲欧洲小视频 | 欧美一级二级视频 | 国产不卡视频 |