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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5347|回復: 6
打印 上一主題 下一主題
收起左側

帶左轉的單片機紅綠燈proteus仿真與源碼分享

[復制鏈接]
跳轉到指定樓層
樓主
單片機紅綠燈仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


帶左轉燈

單片機源程序如下:
  1. #include "use.h"
  2. #include "main.h"

  3. uchar code seg_du[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};            //七段管段碼真值表  共陰                  0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
  4. uchar code seg_we[]={0x01,0x02,0x04,0x08};                      //共陰位碼           0x01,0x02,0x04,0x08                                 0xfe,0xfd,0xfb,0xf7
  5. uchar BackupGreen,BackupRed,CopyLight,CopyLLight,backupLGreen;

  6. void Seg_Display(uchar number,uchar wei)        //數碼管動態顯示程序
  7. {
  8.         P0=0X00;                                                                        //0XFF
  9.         we=1;        //2.7
  10.         we=0;
  11.         P0=seg_du[number];
  12.         du=1;             //2.6
  13.         du=0;
  14.         P0=seg_we[wei];
  15.         we=1;
  16.         we=0;
  17. }

  18. void UrgentScan()                                                    //設置 ???情況運行掃描
  19. {
  20.         Seg_Display(BackupGreen/10,0);
  21.         Seg_Display(BackupGreen%10,1);
  22.         Seg_Display(BackupRed/10,2);
  23.         Seg_Display(BackupRed%10,3);
  24. }

  25. void SetLGreen()
  26. {
  27.         Seg_Display(backupLGreen/10,0);
  28.         Seg_Display(backupLGreen%10,1);
  29. }

  30. void SetModel()                                                                //紅綠燈設置模式
  31. {
  32.         if(StaSysterm==NormalRun)                    //正常情況下修改為設置狀態
  33.         {
  34.                 StaSysterm=ResetGreen;  
  35.             BackupGreen=GreenTime;
  36.             BackupRed=RedTime;
  37.                 backupLGreen = GreenLTime;        
  38.                 CopyLight=P2;                        //對數據進行備份
  39.                 CopyLLight = P1;
  40.                 P2=0X09;
  41.         }
  42.         else if(StaSysterm==ResetGreen)             //優先設置綠燈時間
  43.         {
  44.             StaSysterm=ResetRed;
  45.         }
  46.         else if(StaSysterm==ResetRed)               //后設置紅燈時間   設置完成后按鍵退出設置狀態
  47.         {
  48.                 StaSysterm=ResetLGreen;
  49.         }
  50.         else if(StaSysterm==ResetLGreen)               //后設置紅燈時間   設置完成后按鍵退出設置狀態
  51.         {
  52.                 StaSysterm=NormalRun;
  53.                 P2=CopyLight;                        //恢復數據
  54.                 P1=CopyLLight;
  55.         }
  56. }

  57. void ADDTime()                                                            //紅綠燈時間加
  58. {
  59.         if(StaSysterm==ResetGreen)
  60.         {
  61.                 BackupGreen++;
  62.                 if(BackupGreen>=BackupRed)           BackupGreen=BackupRed;            //綠燈時間不能大于紅燈時間
  63.         }
  64.         else if(StaSysterm==ResetRed)
  65.         {
  66.             BackupRed++;
  67.         }
  68.         else if(StaSysterm==ResetLGreen)
  69.         {
  70.                 backupLGreen++;
  71.         }
  72. }

  73. void SUBTime()                                                                   //紅綠燈時間減
  74. {
  75.         if(StaSysterm==ResetGreen)
  76.         {
  77.                 BackupGreen--;
  78.         
  79.         }
  80.         else if(StaSysterm==ResetRed)
  81.         {
  82.             BackupRed--;
  83.                 if(BackupGreen>=BackupRed)           BackupRed=BackupGreen;
  84.         }
  85.         else if(StaSysterm==ResetLGreen)
  86.         {
  87.                 backupLGreen--;
  88.         }
  89. }


  90. void UrgentModel()                                                           //緊急模式
  91. {
  92.         if(StaSysterm==NormalRun)
  93.         {        
  94.                 StaSysterm=UrgentRun;
  95.                 CopyLight=P2;                                //對數據進行備份
  96.                 CopyLLight=P1;
  97.                 P0=0XFF;                       //關閉數碼管
  98.                 we=1;                          //產生下降沿 鎖存數據
  99.                 we=0;
  100.         }
  101.         else if(StaSysterm==UrgentRun)
  102.         {        
  103.                 StaSysterm=NormalRun;
  104.                 P2=CopyLight;                           //恢復數據
  105.                 P1=CopyLLight;
  106.         }
  107.         else if(StaSysterm==ResetGreen || StaSysterm==ResetRed ||StaSysterm==ResetLGreen)
  108.         {
  109.                 StaSysterm=NormalRun;
  110.                 GreenTime=BackupGreen;
  111.             RedTime=BackupRed;
  112.                 GreenLTime = backupLGreen ;                   //重新設置紅綠燈時間
  113.         }
  114. }
復制代碼
  1. #define _MAIN_C
  2. #include "use.h"
  3. #include "main.h"
  4. #include "time.h"
  5. #include "key.h"

  6. bit flag1s;                //0時時間不變   1時時間減小
  7. uchar count1s,NS_time,WE_time;         
  8. uchar GreenTime=30,RedTime=50,GreenLTime = 10;                //30s和35s
  9. uchar index=0;               //狀態
  10. enum eStaSysterm StaSysterm=NormalRun;

  11. void main()
  12. {
  13.         EA=1;                                                                  //開總中斷
  14.         InintTimer0();                                                  //初始化定時器0
  15.         while(1)
  16.         {        
  17.                 LEDScan();                                                  //數碼管即LED掃描
  18.                 KeyDriver();                                          //鍵盤驅動掃描
  19.                 if(flag1s)                          //判斷時間是否到 1s
  20.                 {
  21.                         flag1s=0;
  22.                         NS_time--;                                          //紅綠燈倒計時時間減
  23.                         WE_time--;
  24.                 }        
  25.         }
  26. }

  27. void InintTimer0()           //初始化T0定時器
  28. {
  29.         TMOD=0X01;           
  30.         TH0=0X4C;             //  初始化為50ms
  31.         TL0=0X00;
  32.         ET0=1;         //開TO中斷
  33.         TR0=1;            //開始計數
  34. }

  35. void Timer0() interrupt 1         
  36. {
  37.         TH0=0XB8;              //0.019 s 約為20ms
  38.         TL0=0X00;
  39.         KeyScan();
  40.         if(++count1s<50)        return;           //判斷定時是否到1S
  41.         count1s=0;
  42.         if(StaSysterm==NormalRun) flag1s=1;            //非正常運行時,不紅綠燈數值不減一        
  43. }

  44. void LEDScan()
  45. {
  46.          if(StaSysterm==NormalRun)                         //正常運行
  47.          {
  48.                 if(NS_time==0 || WE_time==0)
  49.                 {
  50.                         switch(index)                                 //改變紅綠燈的狀態,狀態機
  51.                         {
  52.                                 case 0:
  53.                                 {
  54.                                         index = 1;                                           //東西紅燈
  55.                                         NS_time = GreenTime;                                  //南北綠燈30
  56.                                         WE_time = RedTime;                                    //紅燈50
  57.                                         P2 = 0X09;
  58.                                         P1 = 0X0C;                                                 //輸出
  59.                                 }break;
  60.                                 case 1:
  61.                                 {
  62.                                         index = 2;
  63.                                         NS_time=5;                                            //南北黃燈東西紅燈
  64.                                         P2 = 0X0A;
  65.                                         P1 = 0X0C;
  66.                                 }break;
  67.                                 case 2:
  68.                                 {
  69.                                         index = 3;
  70.                                         NS_time=GreenLTime;                                   //南北左轉東西紅燈
  71.                                         P2 = 0X0C;
  72.                                         P1 = 0X09;
  73.                                 }break;
  74.                                 case 3:
  75.                                 {
  76.                                         index = 4;
  77.                                         NS_time=5;                                            //南北黃燈東西紅燈
  78.                                         P2 = 0X0C;
  79.                                         P1 = 0X0A;
  80.                                 }break;
  81.                
  82.                                 case 4:
  83.                                 {
  84.                                         index=5;
  85.                                         NS_time = RedTime;
  86.                                         WE_time = GreenTime;
  87.                                         P2 = 0X24;
  88.                                         P1 = 0X0C;
  89.                                 }break;
  90.                                 case 5:
  91.                                 {
  92.                                         index = 6;
  93.                                         WE_time=5;                                            
  94.                                         P2 = 0X14;
  95.                                         P1 = 0X0C;
  96.                                 }break;
  97.                                 case 6:
  98.                                 {
  99.                                         index = 7;
  100.                                         WE_time = GreenLTime;        
  101.                                         P2 = 0X0C;
  102.                                         P1 = 0X24;        
  103.                                 }break;
  104.                                 case 7:
  105.                                 {
  106.                                         index = 0;
  107.                                         WE_time=5;                                            //南北黃燈東西紅燈
  108.                                         P2 = 0X0C;
  109.                                         P1 = 0X14;
  110.                                 }break;

  111.                                 default:break;
  112.                         }
  113.                 }
  114.                 Seg_Display(NS_time/10,0);
  115.                 Seg_Display(NS_time%10,1);
  116.                 Seg_Display(WE_time/10,2);
  117.                 Seg_Display(WE_time%10,3);
  118.         }
  119.         else if(StaSysterm==UrgentRun)
  120.         {                                                                   //緊急情況運行   黃燈閃爍
  121.                 P2=0x12;
  122.                 P1 = 0X12;                                    //所有黃燈亮
  123.                 Delayms(200);                               //延遲200毫秒
  124.                 P2=0x00;
  125.                 P1 = 0X00;                                        //所有黃燈滅
  126.                 Delayms(200);                                 
  127.         }
  128.         else if(StaSysterm==ResetGreen || StaSysterm==ResetRed)                                                           //設置調整紅綠燈時間
  129.         {
  130.                 index=0;
  131.                 NS_time=0;
  132.                 WE_time=0;                           //重新初始化紅綠燈并運行
  133.                 UrgentScan();
  134.         }
  135.         else
  136.         {
  137.                 SetLGreen();
  138.         }
  139. }
復制代碼
  1. #include "use.h"
  2. #include "time.h"

  3. sbit KEY1=P3^4;                                                                                         //設置 退出設置
  4. sbit KEY2=P3^5;                                          //加
  5. sbit KEY3=P3^6;                                          //減
  6. sbit KEY4=P3^7;                                          //緊急情況  退出緊急情況
  7. uchar keystr[]={1,1,1,1},backup[]={1,1,1,1};

  8. void KeyScan()                                                                //鍵盤掃描
  9. {
  10.         static uchar keybuf[4]={0XFF,0XFF,0XFF,0XFF};
  11.         uchar i;
  12.         keybuf[0]=(keybuf[0]<<1)|KEY1;
  13.         keybuf[1]=(keybuf[1]<<1)|KEY2;
  14.         keybuf[2]=(keybuf[2]<<1)|KEY3;
  15.         keybuf[3]=(keybuf[3]<<1)|KEY4;
  16.         for(i=0;i<4;i++)
  17.         {
  18.                 if(keybuf[i]==0X00)                        keystr[i]=0;                   //連續8次掃描值為0
  19.                 else if(keybuf[i]==0XFF)         keystr[i]=1;
  20.         }
  21. }

  22. void KeyAction(uchar key)                                                 //鍵盤執行
  23. {
  24.         switch(key)
  25.         {
  26.                 case 0:        SetModel();                break;        
  27.                 case 1:        ADDTime();                break;
  28.                 case 2:        SUBTime();                break;
  29.                 case 3: UrgentModel();        break;
  30.                           default:break;
  31.         }
  32. }

  33. void KeyDriver()                                                                 //鍵盤驅動
  34. {
  35.         uchar i;
  36.         for(i=0;i<4;i++)
  37.         {
  38.                 if(keystr[i]!=backup[i])
  39.                 {
  40.                         if(keystr[i]==0)
  41.                                 KeyAction(i);
  42.                 }
  43.                 backup[i]=keystr[i];
  44.         }
  45. }
復制代碼

全部資料51hei下載地址:
Proteus 仿真.rar (150.83 KB, 下載次數: 84)


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

使用道具 舉報

沙發
ID:295446 發表于 2018-3-22 13:26 | 只看該作者
東西不錯,代碼也很工整,給老哥打電話
回復

使用道具 舉報

板凳
ID:295656 發表于 2018-3-22 19:35 | 只看該作者
東西挺好的,謝謝分享
回復

使用道具 舉報

地板
ID:296923 發表于 2018-3-25 20:50 | 只看該作者
學習學習 支持一下
回復

使用道具 舉報

5#
ID:607684 發表于 2019-9-4 23:40 | 只看該作者
很好,辛苦了,謝謝
回復

使用道具 舉報

6#
ID:607684 發表于 2019-9-4 23:42 | 只看該作者
感激不盡
回復

使用道具 舉報

7#
ID:675875 發表于 2019-12-28 13:44 來自手機 | 只看該作者
總說code前少分號,怎么回事?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久激情视频 | 日韩精品网站 | 成人免费视频一区 | www.国产日本 | 视频在线一区 | 97国产爽爽爽久久久 | 97久久精品午夜一区二区 | www.欧美.com | 在线不卡av | 日韩欧美中文 | 欧美日韩在线免费观看 | 亚洲国产欧美在线 | 日韩一区二区在线视频 | 日韩高清在线观看 | hitomi一区二区三区精品 | 久久综合av | 国产精品视频网站 | 亚洲免费网站 | 久久美女网 | 91视频网址| 男女啪啪高潮无遮挡免费动态 | 91视频.com| 国产成人免费视频网站高清观看视频 | 一区二区亚洲 | 久久国产香蕉 | 日韩成人专区 | 国产精品久久精品 | 黄色片网此 | 91人人看 | 亚洲图片一区二区三区 | 国产91av视频在线观看 | 黄色网络在线观看 | 国产激情精品一区二区三区 | 天天想天天干 | 女同久久另类99精品国产 | 亚洲精品在 | 欧美一区二区三区在线观看 | 日韩欧美在线免费观看 | 久久久久国产一区二区三区四区 | 精品欧美二区 | 无码日韩精品一区二区免费 |