找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2875|回复: 3
打印 上一主题 下一主题
收起左侧

单片机交通灯 用lcd1602显示 带proteus仿真和源程序

[复制链接]
跳转到指定楼层
楼主
给大家分享一个用lcd1602显示的交通灯,下面是仿真原理图:

proteus仿真工程文件和程序源码下载:
交通灯.rar (102.65 KB, 下载次数: 60)

单片机源程序(部分预览):

  1. #include<reg51.h>        
  2. #include"lcd.h"


  3. #define NORMAL_MODE        0                           //正常运行模式
  4. #define NIGHT_MODE        3                           //夜间模式
  5. #define URGENCY_MODE        6        //紧急模式
  6. #define NORMAL_MODE_STEP1 0
  7. #define NORMAL_MODE_STEP2 1
  8. #define NORMAL_MODE_STEP3 2
  9. #define NORMAL_MODE_STEP4 3



  10. sbit BUT1=P1^0;
  11. sbit BUT2=P1^1;
  12. sbit BUT3=P1^3;



  13. sbit LED_EW_RED = P2^0;                   //东西红灯
  14. sbit LED_EW_GREEN = P2^2;           //东西绿灯
  15. sbit LED_EW_YELLOW = P2^1;           //东西黄灯
  16. sbit LED_SN_RED = P2^3;                   //南北红灯
  17. sbit LED_SN_GREEN = P2^5;           //南北绿灯
  18. sbit LED_SN_YELLOW = P2^4;           //南北黄灯

  19. unsigned char WorkMode = 0;
  20. unsigned char DisplayTime = 0;
  21. unsigned char DisplayTime1 = 4;                        //黄灯显示时间
  22. unsigned char SD_DisplayTime = 0;                //红绿灯显示时间
  23. unsigned char NormalModeStep = 0;
  24. unsigned char fag=0,k=0;


  25. unsigned char djs1[]="Daojishi:";
  26. unsigned char djs2[]="SN-Daojishi:";
  27. int a=0;


  28. void Delay1ms(uint y);
  29. void InitTimer0(void);
  30. void LcdDisplay1(int a);
  31. void Work_Night_Mode();
  32. void Work_NORMAL_Mode();
  33. void Work_Urgency_Mode();
  34. void SetBtn_Check_Work(void);
  35. void delay10ms(unsigned char num);




  36. /*******************************************************************************
  37. * 函 数 名         : main
  38. * 函数功能                   : 主函数
  39. * 输    入         : 无
  40. * 输    出         : 无
  41. *******************************************************************************/
  42. void main(void)
  43. {  
  44.         unsigned char i;
  45.         LcdInit();
  46.         for(i=0;i<9;i++)
  47.         {
  48.                 LcdWriteData(djs1[i]);        
  49.         }

  50.         
  51.         InitTimer0();
  52.         SD_DisplayTime = 15;
  53.         DisplayTime = SD_DisplayTime;
  54.         WorkMode = NORMAL_MODE;
  55.         NormalModeStep=NORMAL_MODE_STEP1;
  56.                                                 

  57.         
  58.         
  59. while(1)
  60. {                                                                                
  61.         switch(WorkMode)                                                                 //工作模式判断
  62.                 {
  63.                         case NORMAL_MODE:          //正常模式
  64.                                 Work_NORMAL_Mode();
  65.                                 break;
  66.                         
  67.                         case NIGHT_MODE:        //夜间模式
  68.                                 Work_Night_Mode();
  69.                                 break;
  70.                         
  71.                         case URGENCY_MODE:         //紧急模式
  72.                                 Work_Urgency_Mode();
  73.                                 break;
  74.                 }
  75.         SetBtn_Check_Work();
  76.         LcdDisplay1(DisplayTime);
  77.                                                                   


  78. }                                       
  79.                                        
  80. }

  81. void Work_NORMAL_Mode()                                //正常工作模式
  82. {
  83. switch(NormalModeStep)                          //工作步段判断
  84.         {
  85.                 case NORMAL_MODE_STEP1:                //步段1, 南北绿灯,东西红灯
  86.                         LED_SN_RED = 0;                   //南北红灯灭
  87.                         LED_SN_GREEN = 1;           //南北绿灯亮
  88.                         LED_SN_YELLOW = 0;           //南北黄灯灭
  89.                         LED_EW_RED = 1;                   //东西红灯亮
  90.                         LED_EW_GREEN = 0;           //东西绿灯灭
  91.                         LED_EW_YELLOW = 0;           //东西黄灯灭
  92.                         if(DisplayTime ==0 )           //如果通行时间走完,即等于0
  93.                         {
  94.                                 NormalModeStep = NORMAL_MODE_STEP2;                 //设置工作步段为步段2,南北黄灯,东西红灯
  95.                                 DisplayTime = DisplayTime1;                                        //南北增减s黄灯时间
  96.                         }        
  97.                         break;
  98.                 case NORMAL_MODE_STEP2:                //步段2, 南北黄灯,东西红灯
  99.                         LED_SN_RED = 0;                        //南北红灯灭
  100.                         LED_SN_GREEN = 0;                //南北绿灯灭
  101.                         LED_SN_YELLOW = 1;                //南北黄灯亮
  102.                         LED_EW_RED = 1;                        //东西红灯亮
  103.                         LED_EW_GREEN = 0;                //东西绿灯灭
  104.                         LED_EW_YELLOW = 0;                //东西黄灯灭
  105.                         if(DisplayTime == 0)                //如果通行时间走完,即等于0
  106.                         {
  107.                                 NormalModeStep = NORMAL_MODE_STEP3;           //设置工作步段为步段3,南北红灯,东西绿灯
  108.                                 DisplayTime = SD_DisplayTime;                 //南北加5s黄灯时间
  109.                         }        
  110.                         break;
  111.                 case NORMAL_MODE_STEP3:                   //步段3, 南北红灯,东西绿灯
  112.                         LED_SN_RED = 1;                          //南北红灯亮
  113.                         LED_SN_GREEN = 0;                  //南北绿灯灭
  114.                         LED_SN_YELLOW = 0;                  //南北黄灯灭
  115.                         LED_EW_RED = 0;                          //东西红灯灭
  116.                         LED_EW_GREEN = 1;                  //东西绿灯亮
  117.                         LED_EW_YELLOW = 0;                  //东西黄灯灭
  118.                         if(DisplayTime == 0)                        //如果通行时间走完,即等于0
  119.                         {
  120.                                 NormalModeStep = NORMAL_MODE_STEP4;          //设置工作步段为步段4,南北红灯,东西黄灯
  121.                                 DisplayTime = DisplayTime1;                                          //东西增减若干s黄灯时间
  122.                         }        
  123.                         break;
  124.                 case NORMAL_MODE_STEP4:                        //步段4, 南北红灯,东西黄灯
  125.                         LED_SN_RED = 1;                          //南北红灯亮
  126.                         LED_SN_GREEN = 0;                  //南北绿灯灭
  127.                         LED_SN_YELLOW = 0;                  //南北黄灯灭
  128.                         LED_EW_RED = 0;                          //东西红灯灭
  129.                         LED_EW_GREEN = 0;                  //东西绿灯灭
  130.                         LED_EW_YELLOW = 1;                  //东西黄灯亮
  131.                         if(DisplayTime == 0)                           //如果通行时间走完,即等于0
  132.                         {
  133.                                 NormalModeStep = NORMAL_MODE_STEP1;         //设置工作步段为步段1,南北绿灯,东西红灯
  134.                                 DisplayTime = SD_DisplayTime;         //南北同行时间重赋值
  135.                         }        
  136.                         break;
  137.         }
  138. }

  139. void Work_Urgency_Mode()          //紧急模式
  140. {
  141.         LED_SN_RED = 1;                        //南北红灯亮
  142.         LED_SN_GREEN = 0;                //南北绿灯灭
  143.         LED_SN_YELLOW = 0;                //南北黄灯灭
  144.         LED_EW_RED = 1;                        //东西红灯亮
  145.         LED_EW_GREEN = 0;                //东西绿灯灭
  146.         LED_EW_YELLOW = 0;                //东西黄灯灭
  147.         DisplayTime =SD_DisplayTime;                   //南北显示时间为0xff,在显示函数里判断时间为0xff时不做显示,会显示“-”
  148. }


  149. void Work_Night_Mode()                //夜间模式
  150. {
  151.         LED_SN_RED = 0;                 //南北红灯灭
  152.         LED_SN_GREEN = 0;         //南北绿灯灭
  153.         LED_SN_YELLOW = 1;         //南北黄灯亮
  154.         LED_EW_RED = 0;                 //东西红灯灭
  155.         LED_EW_GREEN = 0;         //东西绿灯灭
  156.         LED_EW_YELLOW = 1;         //东西黄灯亮
  157.     DisplayTime = DisplayTime1;                 //南北显示时间为0xff,在显示函数里判断时间为0xff时不做显示,会显示“-”
  158. }


  159. void SetBtn_Check_Work(void)           //设置按键检测函数
  160. {
  161.         
  162.     if(BUT1 == 0)                  //设置键按下 ,夜间模式 ,紧急模式 ,恢复正常模式
  163.         {
  164.                 delay10ms(5);                  //50ms去抖
  165.                 fag=0;
  166.                 while(fag==0)
  167.                 {  while(BUT1==0)
  168.                    { fag=1;
  169.                    }
  170.                    k++;
  171.                 }
  172.                 if(k%3 == 1)
  173.                 {
  174.                  TR0 = 0;                                   //计时器停止
  175.                  WorkMode = NIGHT_MODE;           //夜间模式
  176.                   DisplayTime=DisplayTime1;
  177.                 }
  178.                 else if(k%3==2)
  179.                 {
  180.                  TR0 = 0;                                   //计时器停止
  181.                  WorkMode = URGENCY_MODE;  //紧急模式
  182.                  DisplayTime = SD_DisplayTime;
  183.                 }
  184.                 else
  185.                 { TR0 = 1;
  186.                   DisplayTime = SD_DisplayTime;
  187.                   WorkMode = NORMAL_MODE;
  188.                
  189.                 }
  190.                                 
  191.         }
  192.         

  193.          else if(BUT2 == 0)                  //设置键按下 ,灯的时间加一  控制
  194.         {
  195.                 delay10ms(10);                  //50ms去抖
  196.                 if(BUT2 == 0)
  197.                 {
  198.                  TR0 = 0;
  199.                  if(k%3==2)                                   //红灯时间加一
  200.                  { SD_DisplayTime = SD_DisplayTime+1;
  201.                    DisplayTime = SD_DisplayTime;
  202.                    delay10ms(10);
  203.                    //WorkMode = URGENCY_MODE;
  204.                  }
  205.                  else if(k%3==1)  //黄灯时间加一
  206.                  {
  207.                   DisplayTime1=DisplayTime1+1;
  208.                   DisplayTime=DisplayTime1;
  209.                   delay10ms(10);                                    
  210.                  // WorkMode = NIGHT_MODE;
  211.                   }        
  212.                 }               
  213.         }
  214.          else if(BUT3 == 0)                  //设置键按下, 灯的时间减控制
  215.         {
  216.                 delay10ms(5);                  //50ms去抖
  217.                 if(BUT3 == 0)
  218.                 {
  219.                  TR0 = 0;
  220.                  if(k%3==2)                                   
  221.                  {SD_DisplayTime = SD_DisplayTime-1; //按键使红灯时间减一
  222.                   DisplayTime = SD_DisplayTime;
  223.                   
  224.                   WorkMode = URGENCY_MODE;
  225.                  }
  226.                  else if(k%3==1)
  227.                  {
  228.                   DisplayTime1=DisplayTime1-1; //按键使黄灯时间减一
  229.                   DisplayTime=DisplayTime1;        
  230.                                              
  231.                   WorkMode = NIGHT_MODE;
  232.                   }        
  233.                         
  234.                 }               
  235.         }
  236.         
  237.         
  238.         

  239. }


  240. void LcdDisplay1(int a)          //lcd显示
  241. {

  242.          LcdWriteCom(0x8A);                 
  243.          LcdWriteData('0'+a/10);
  244.          LcdWriteCom(0x8B);                  
  245.          LcdWriteData('0'+a%10);        

  246. }


  247. void InitTimer0(void)                   //初始化定时器0
  248. {
  249.     TMOD = 0x01;                         //模式1
  250.     TH0 = 0x3C;                                 //定时器装载值
  251.     TL0 = 0xB0;
  252.     EA = 1;                                         //使能总中断
  253.     ET0 = 1;                                 //使能定时器0中断
  254.     TR0 = 1;                                 //启动定时器0
  255. }
  256. void Timer0Interrupt(void) interrupt 1                 //定时器0中断处理函数
  257. {
  258.         static unsigned char TimeOutNum = 0;        

  259.     TH0 = 0x3C;                                                                //重新装载值
  260.     TL0 = 0xB0;
  261.         TimeOutNum++;                                                //中断次数++, 即50ms的次数
  262.         if(TimeOutNum>=20)                        //达到50ms * 20 = 1s条件
  263.         {
  264.                 TimeOutNum = 0;                                         //中断次数清0
  265.                 DisplayTime--;                                 //南北显示时间-1
  266.         }
  267. }

  268. void Delay1ms(uint y)
  269. {
  270.         uint x;
  271.         for( ; y>0; y--)
  272.         {
  273.                 for(x=110; x>0; x--);
  274.         }
  275. }

  276. void delay10ms(unsigned char num)   //误差 0us
  277. {
  278.     unsigned char i,a,b,c;
  279.         for(i=0;i<num;i++)
  280.             for(c=5;c>0;c--)
  281.                 for(b=4;b>0;b--)
  282.                     for(a=248;a>0;a--);
  283. }
复制代码



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:143367 发表于 2016-10-24 09:03 | 只看该作者
感谢楼主分享,谢谢
回复

使用道具 举报

板凳
ID:147898 发表于 2016-11-14 21:33 | 只看该作者
很不错,很有用。
回复

使用道具 举报

地板
ID:273764 发表于 2018-1-9 14:20 | 只看该作者
为什么我这个显示不出来
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表