找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于51单片机的航标灯设计

[复制链接]
跳转到指定楼层
楼主
ID:356519 发表于 2018-6-25 01:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
基于51单片机的航标灯硬件部分
实验原理图
示波器模拟波形
①第一种波形
  Key1置’0’   Key0置’0’
②第二种波形
  Key1置’0’   Key0置’1’
③第三种波形
Key1置’1’   Key0置’0’
④第四种波形
Key1置’1’   Key0置’1’

单片机源码:
  1. #include "reg51.h"
  2. #define COUNT_50MS 500 //focs=12MHz T=1us 50ms gcd:50ms的倍数
  3. #define D_OPEN  1      //开灯
  4. #define D_CLOSE !D_OPEN        //关灯
  5. sbit D=P0^0;  //灯输出控制,高电平有效
  6. sbit OPCON=P1^2;//光照检测  ,低电平有效(晚上)
  7. sbit Key0=P1^0;
  8. sbit Key1=P1^1;
  9. //结构体类型声明1
  10. struct IALA
  11. {
  12.         unsigned char gcd;        //各时间间隔最大公约数
  13.         unsigned char state[6]; //无符号字符型时间常数
  14. };
  15. unsigned int State[6];
  16. //结构体全局变量定义,code:常数
  17. struct IALA code IALA4[4]={
  18.        
  19.         { 0,0,0,0,0,0,0},
  20.         {10,1,3,0,0,0,0},
  21.         {10,1,1,1,7,0,0},
  22.         {10,1,2,1,2,1,5}
  23. };
  24. //T0_初始化函数
  25. void T0_Init(void)
  26. {
  27.         TMOD=(TMOD&0xf0)|0x01;
  28.         TH0=(65536-COUNT_50MS)/256;
  29.         TL0=(65536-COUNT_50MS)%256;
  30.         ET0=1; //中断使能
  31.         EA=1;
  32.         TR0=1; //T0启动       
  33. }
  34. //T0_ISR程序
  35. unsigned int it=0;
  36. void T0_ISR(void) interrupt 1
  37. {
  38.         unsigned char j;
  39.         TH0=(65536-COUNT_50MS)/256;
  40.         TL0=(65536-COUNT_50MS)%256;
  41.         if(OPCON==0)//黑夜、暗照度
  42.           {
  43.                 it++;                
  44.                 for(j=0;j<6;j++)
  45.                 { if(it==State[j])
  46.                         D=(j%2)?D_OPEN:D_CLOSE; //判断是开灯还是关灯状态        
  47.             }
  48.                 if(it>=State[5])
  49.                 {
  50.                   it=0;
  51.                 }         
  52.         }
  53.     else          //白天、亮照度
  54.           {
  55.            D=D_CLOSE;
  56.            it = 0;
  57.           }       

  58. }
  59. //按键判断
  60. unsigned char GetKey()
  61. {                               
  62.         unsigned char key;
  63.         if(Key1==0&&Key0==0)
  64.         {
  65.                 key=0;
  66.         }
  67.         else if(Key1==0&&Key0==1)
  68.         {
  69.                 key=1;
  70.         }               
  71.         else if(Key1==1&&Key0==0)
  72.         {
  73.                 key=2;
  74.         }
  75.         else if(Key1==1&&Key0==1)
  76.         {
  77.                 key=3;       
  78.         }
  79.         return(key);
  80. }
  81. void main(void)
  82. {       
  83.         unsigned char key,pre_key=0,i;
  84.         unsigned int sum;
  85.         T0_Init();
  86.         D=0;
  87.         while(1)       
  88.         {
  89.             key=GetKey();                  //获取key1、Key0特征码
  90.                 if(key!=pre_key)        //若有新的按键,载入控灯时间
  91.                 {
  92.                           sum=0;
  93.                           for(i=0;i<6;i++)
  94.                           {       
  95.                                 sum=sum+IALA4[key].gcd*IALA4[key].state[i];
  96.                                 State[i]=sum;       
  97.                           }
  98.                 }               
  99.                 pre_key=key;
  100.         }
  101. }
复制代码

完整的Word格式文档51黑下载地址:
实验三 航标灯.doc (178.5 KB, 下载次数: 19)


评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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