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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4877|回復: 0
收起左側

單片機倒計時秒表系統實驗程序Proteus仿真

[復制鏈接]
ID:863267 發表于 2020-12-19 11:12 | 顯示全部樓層 |閱讀模式
電路圖如圖1所示,通過51單片機的P1作為段口,P0作為位口構成2位LED動態顯示的硬件電路。P2.0、P2.1連接兩個按鍵K0、K1分別用于調整初始時間的+1和-1,P3.0連接LED燈,P3.2連接復位按鍵,P3.3連接啟動按鍵。
要求實現一倒計時秒表,啟動后顯示初始時間20,可以調整初始時間。調整結束后按下啟動鍵,開始倒計時。在倒計時過程中調整初始時間按鍵無效。倒計時時間到,顯示00,并且LED燈亮。整個過程中都可以復位,復位后顯示初始時間,LED燈滅。圖1  倒計時秒表的電路原理圖

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
131231.png

單片機源程序如下:
  1. #include <reg51.h>
  2. unsigned  char code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //共陰數碼管 0-9
  3. sbit led=P3^0;
  4. sbit s1=P0^0;
  5. sbit s2=P0^1;
  6. sbit k0=P2^0;
  7. sbit k1=P2^1;
  8. int sec=0,i,a,b=20,key1;
  9. /*-----延遲函數-------*/
  10. void delay(int z)
  11. {
  12.         while(z-->0);
  13. }
  14. /*-----顯示函數-------*/
  15. void display(int n)
  16. {
  17.         if(n>0)
  18.         {
  19.         s2=1;s1=0;          //顯示十位
  20.         P1=tab[n/10];  //除10,取十位數值
  21.         delay(100);           //延遲顯示
  22.         s1=1;s2=0;           //顯示個位
  23.         P1=tab[n%10];  //求余,取個位數值
  24.         delay(100);           //延遲
  25.         }
  26.         else
  27.         {                                //當輸入值小于0,顯示0
  28.         s2=1;s1=0;            //顯示十位
  29.         P1=tab[0];            //除10,取十位數值
  30.         delay(100);            //延遲
  31.         s1=1;s2=0;            //顯示個位
  32.         P1=tab[0];                //求余,取個位數值
  33.         delay(100);            //延遲顯示
  34.         }                          
  35. }
  36. /*-----外部中斷0中斷服務函數----------*/
  37. void RESET() interrupt        0
  38. {
  39.         sec=0;         //恢復初始值
  40.         b=20;         //恢復初始值
  41.         TR0=0;         //關閉定時器
  42.        
  43. }
  44. /*-----外部中斷1中斷服務函數----------*/
  45. void START() interrupt        2
  46. {
  47.         TR0=1;        //打開定時器
  48. }
  49. /*-----定時器T0服務函數,計時功能----------*/
  50. void timer0() interrupt 1
  51. {
  52.         i--;   //50ms時間到
  53.         TH0=(65536-50000)/256;        //存放高8位,50ms
  54.         TL0=(65536-50000)%256;          //存放低8位
  55.         if(i==0)
  56.         {
  57.         i=20;            //1s計數
  58.         sec++;                        //軟件計數1s
  59.         }
  60. }
  61. /*------鍵值掃描函數----------*/
  62. void key()
  63. {       
  64.         k0=1;k1=1;                    //讀按鍵
  65.         key1=P2;                //將P2的值賦值給key1
  66.         key1=key1&0x03;                //屏蔽高6位,保留k0,k1的值
  67.         while(key1!=0x03)   //判斷是否有按鍵按下
  68.         {
  69.         delay(600);                        //消抖動
  70.         key1=P2;
  71.         key1=key1&0X03;
  72.         while(key1!=0x03)         //當有按鍵按下時
  73.         {
  74.         if(k0==0) b=b+1;            //按下k0按鍵時,初始值加1
  75.         else b=b-1;                         //按下k1按鍵時,初始值減1
  76.         k0=1;k1=1;                   //判斷按鍵是否抬起
  77.         key1=P2;                  //重新將P2的值賦值給key1
  78.         key1=key1&0x03;
  79.         while(key1!=0x03)  //判斷是否有按鍵按下
  80.         {
  81.         key1=P2;
  82.         key1=key1&0x03;
  83.         }
  84.         }
  85.         }
  86. }
  87. /*------主函數----------*/
  88. void main()
  89. {
  90.         TMOD=0X01;                           //設定定時器0工作,工作方式1
  91.         TH0=(65536-50000)/256;         //存放高8位,50ms
  92.         TL0=(65536-50000)%256;         //存放低8位
  93.         IT0=1;IT1=1;                 //外部中斷選擇下降沿觸發
  94.         IE=0X87;                         //開啟INT0,INT1,T0
  95.         PX0=1;                            //設定INT0為高優先級
  96.         led=1;                                //初始燈熄滅
  97.         TR0=0;                                //初始計數停止
  98.         i=2;
  99.         while(1)
  100.         {
  101.         a=b-sec;                         //將增計時變為減計時
  102.         if(TR0==0)                         //當定時器關閉時開啟鍵值掃描
  103.         {key();}
  104.         display(a);                         //顯示函數
  105.         if(a<=0)                                       
  106.         {                                         
  107.         led=0;                                 //當減計時為0時,報警燈點亮
  108.         }
  109.         else
  110.         {
  111.         led=1;                                //當減計時不為0時,報警燈熄滅
  112.         }
  113.         }

  114. }
復制代碼

所有資料51hei提供下載:
單片機系統實驗.rar (41.61 KB, 下載次數: 62)

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 福利片在线 | 亚洲社区在线 | 在线观看www | 国产精品久久久久永久免费观看 | 久久精品a | 欧美激情一区二区三区 | 91精品国产91久久久久久最新 | 69xxx免费| 综合久久久久 | 天天干,夜夜操 | 亚洲国产二区 | 午夜视频大全 | 狠狠干天天干 | 国产一区二区三区亚洲 | www.国产一区 | 嫩草视频免费 | 91精品国产日韩91久久久久久 | 91综合网| 亚洲成人福利在线观看 | 久久久久久久久淑女av国产精品 | 亚洲人成在线播放 | 免费成人在线网站 | 精品一二 | 操久久 | 亚洲 自拍 另类 欧美 丝袜 | 亚洲国产精品激情在线观看 | 久久久久久久久久久久久9999 | 黄片毛片免费观看 | 久热精品在线观看视频 | 日本精品免费 | 亚洲不卡在线观看 | 国产一级视频在线播放 | 中文日韩在线视频 | 在线91| 久久亚洲精品视频 | 国产欧美日韩一区二区三区 | 日韩在线一区二区 | 第一av| 欧美成人一区二区 | 黄色网址免费看 | 在线播放91 |