找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机+Proteus交通信号灯模拟 双机通信程序

[复制链接]
跳转到指定楼层
楼主
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
设计的基本功能如下:
a)    4*4矩阵键盘电路,用于输入与控制工作电路。
b)    液晶显示模块电路,显示当前工作状态。
c)    交通灯模块电路,用于模拟当前路口红绿灯工作状态。
d)    继电器模块电路,闯红灯抓拍功能(灯泡模拟)实现。
系统工作流程如下:
a)    电路启动后,按照预先设定的红灯值设定进行运行,东西方向为绿灯,南北方向为红灯,且南北方向的闯红灯抓拍电路工作。
b)    在矩阵键盘输入设定的倒计时值,按下确定键,液晶显示模块相应改变,并通过串口通信,发送到工作单片机上。
c)    工作单片机收到控制单片机发送的数值后,黄灯闪烁3次,按照设定的倒计时时间运行。


单片机源程序如下:
  1. #include <reg51.h>
  2. #include <LM016L.h>

  3. uchar Dtime_H, Dtime_L;
  4. uchar Ttime_H = 0,Ttime_L = 0;
  5. uchar send_t;
  6. uchar key;
  7. uchar out = 0;
  8. uchar cnt = 0;

  9. uchar code key_code[]={0xEE, 0xDE, 0xBE, 0x7E, 0xED, 0xDD, 0xBD,
  10. 0x7D, 0xEB, 0xDB, 0xBB, 0x7B, 0xE7, 0xD7, 0xB7, 0x77};
  11. uchar LED_VALUE[10]={0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};
  12. uchar tab_1[] = {0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39};

  13. uchar rdkey(){
  14.         uchar scan1, scan2, keycode, j;
  15.         P1 = 0x0F;
  16.         scan1 = P1;
  17.         if((scan1&0x0F)!=0x0F){
  18.                 delay(30);
  19.                 scan1 = P1;
  20.                 if((scan1&0x0F)!=0x0F){
  21.                         P1 = 0XF0;
  22.                         scan2 = P1;
  23.                         keycode = scan1 | scan2;
  24.                         for(j = 0;j <=15;j++){
  25.                                 if(keycode == key_code[j]){
  26.                                         key = j;
  27.                                         return(key);
  28.                                 }
  29.                         }
  30.                 }
  31.         }
  32.         else P1 = 0xFF;
  33.         return (16);
  34. }

  35. void exit_int0() interrupt 0{
  36.         rdkey();
  37.         out = 1;
  38. }

  39. void Lcd(){
  40.          LcdInitiate();         //调用LCD初始化函数  
  41.         WriteAddress(0x00);   //将显示地址指定为第1行第0列
  42.           WriteData('D');
  43.         WriteData('e');
  44.         WriteData('l');
  45.         WriteData('a');
  46.         WriteData('y');
  47.         WriteData(':');
  48.         WriteData(Dtime_H);
  49.         WriteData(Dtime_L);
  50.         WriteData('S');
  51.         WriteAddress(0x40);
  52.         WriteData('E');
  53.         WriteData('n');
  54.         WriteData('t');
  55.         WriteData('e');
  56.         WriteData('r');
  57.         WriteData(':');
  58.         delay(10);
  59. }

  60. void send(){
  61.         ES = 1;
  62.         SBUF = send_t;
  63.         while(TI == 0);
  64.         TI = 0;
  65.         ES = 0;
  66. }

  67. void main(){
  68.         IT0 = 1;        
  69.         IP = 0x01;
  70.         P1 = 0x0F;
  71.         EA = 1;
  72.         EX0 = 1;
  73.         
  74.         TCON = 0x40;
  75.         SCON = 0x50;                   //方式1 8位   
  76.         TMOD = 0x20;           //定时器1 方式2
  77.         TH1 = 0xFD;
  78.         TL1 = 0xFD;

  79.         Dtime_H = tab_1[0];
  80.         Dtime_L = tab_1[5];
  81.         Lcd();
  82.          while(1){
  83.                 P1 = 0x0F;
  84.                 if(out == 1 && key < 10){
  85.                         cnt++;
  86.                         if(cnt > 1)
  87.                                 Ttime_H = Ttime_L;
  88.                         Ttime_L = key;
  89.                         WriteData(tab_1[Ttime_L]);
  90.                         out = 0;
  91.                 }else if(out == 1 && key > 10){
  92.                         if(key == 11){  //清除
  93.                                 Lcd();
  94.                                 out = 0;
  95.                                 cnt = 0;
  96.                                 Ttime_H = 0;
  97.                         }else if(key == 15){  //确认
  98.                                 Dtime_H = tab_1[Ttime_H];
  99.                                 Dtime_L = tab_1[Ttime_L];
  100.                                 out = 0;
  101.                                 cnt = 0;
  102.                                 send_t = Ttime_H*10 + Ttime_L;
  103.                                 send();//send message
  104.                                 Lcd();
  105.                         }else if(key == 13){  //初始化
  106.                                 Ttime_H = 0;
  107.                                 WriteData(tab_1[Ttime_H]);
  108.                                 Ttime_L = 5;
  109.                                 WriteData(tab_1[Ttime_L]);
  110.                                 out = 0;
  111.                                 cnt = 2;
  112.                                 //send message
  113.                         }
  114.                 }
  115.         }
  116. }
复制代码

所有资料51hei提供下载:
traffic light.rar (37.96 KB, 下载次数: 35)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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