m0_58527071 2021-10-10 10:54 采纳率: 100%
浏览 55
已结题

嵌入式题目 嵌入式编程课设 在线等

设计要求:1.按照红-绿-黄顺序轮流点亮
2、南北方向、东西方向轮流放行,红灯15s,绿灯12s,黄灯闪烁3秒,同时有数码管显示倒计时3、必须用到定时器、中断
设计思路:
1.利用硬件定时器+硬件计数器实现1s倒计时
2.定义1个标志位作为方向标志,判断标志位确定是东西向红灯还是南北向红灯
3.定义两个时间变量,并用数码管显示。
4.南北向红灯时,判断较大的时间变量是否小于3,确定是否需要东西向黄灯闪烁,判断较大的时间变量是否为0,确定该南北向红灯时间结束,并将方面标志位置1。
东西向红灯时,判断较大的时间变量是否小于3,确定是否需要南北向黄灯闪烁,判断较大的时间变量是否为0,确定该东西向红灯时间结束,并将方面标志位置0。

  • 写回答

1条回答 默认 最新

  • jianqiang.xue 嵌入式领域优质创作者 2021-10-10 11:12
    关注
    
    #include<reg51.h>
    
    #define uint unsigned int
    
    #define uchar unsigned char
    
    
     
    
    #define red (~0x01)
    
    #define yellow (~0x02)
    
    #define green (~0x04)
    
    #define left (~0x08)
    
    #define nbred (~0x10)
    
    #define nbyellow (~0x20)
    
    #define nbgreen (~0x40)
    
    #define nbleft (~0x80)
    
    uint num2;
    
    uchar dx_js,nb_js;
    
    uchar zt;  
    
    
    uchar code dxcz[]={0,12,3    ,15,15-12,};
    
    uchar code nbcz[]={0,15,15-12,12,    3,};
    
    uchar code tab1[]={0,12,    3,12,    3,};
    
    uchar code tab2[]={0,
    
    0xFF&green&nbred,
    
    0xFF&yellow&nbred,
    
    0xFF&red&nbgreen,
    
    0xFF&red&nbyellow,
    
    };
    
    
    
    sbit D0=P2^0;
    
    sbit D1=P2^1;
    
    sbit D2=P2^2;
    
    sbit D3=P2^3;
    
    uchar ds[4];
    
    uchar code tab[]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,};
    
    
    //数码管显示
    
    void smxs(){
    
    static uchar a;
    
    if(a>3)a=0;
    
    P2&=0xf0;
    
    P0=tab[ds[a]];
    
    switch(a){
    
    case 0:D0=1;break;
    
    case 1:D1=1;break;
    
    case 2:D2=1;break;
    
    case 3:D3=1;break;
    
    }
    
    a++;
    
    }
    
    
    void init() //初始化函数
    
    {   TMOD=0x01;
    
    TH0=(65536-1000)/256;
    
    TL0=(65536-1000)%256;
    
    EA=1;
    
        ET0=1;
    
    }
    
    void main()//主函数
    
    {
    
    
    init();
    
    zt=1;
    
    num2=0;
    
        dx_js=dxcz[zt];
    
    nb_js=nbcz[zt];
    
    TR0=1;
    
    while(1){
    
    P1=tab2[zt];
    
    ds[0]=dx_js/10;
    
    ds[1]=dx_js%10;
    
    ds[2]=nb_js/10;
    
    ds[3]=nb_js%10;
    
    }
    
    }
    
    
    
    
    void timer0() interrupt 1//定时器,实现倒计时
    
    {    
    
    TH0=(65536-1000)/256;
    
    TL0=(65536-1000)%256;
    
    if(++num2==1000){//1s
    
    num2=0;
    
    dx_js--;//倒计时
    
    nb_js--;
    
    if(dx_js==0||nb_js==0){//到0
    
    zt++;//状态加1
    
    if(zt==5){
    
    zt=1;
    
    }
    
    dx_js=dxcz[zt];//重新开始计时
    
    nb_js=nbcz[zt];
    
    }
    
    }
    
    smxs();
    
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 10月28日
  • 已采纳回答 10月20日
  • 修改了问题 10月10日
  • 创建了问题 10月10日

悬赏问题

  • ¥15 请问为什么我配置IPsec后PC1 ping不通 PC2,抓包出来数据包也并没有被加密
  • ¥200 求博主教我搞定neo4j简易问答系统,有偿
  • ¥15 nginx的使用与作用
  • ¥100 关于#VijeoCitect#的问题,如何解决?(标签-ar|关键词-数据类型)
  • ¥15 一个矿井排水监控系统的plc梯形图,求各程序段都是什么意思
  • ¥50 安卓10如何在没有root权限的情况下设置开机自动启动指定app?
  • ¥15 ats2837 spi2从机的代码
  • ¥200 wsl2 vllm qwen1.5部署问题
  • ¥100 有偿求数字经济对经贸的影响机制的一个数学模型,弄不出来已经快要碎掉了
  • ¥15 数学建模数学建模需要