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

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

设计要求: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 arduino控制ps2手柄一直报错
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥85 maple软件,solve求反函数,出现rootof怎么办?
  • ¥15 求chat4.0解答一道线性规划题,用lingo编程运行,第一问要求写出数学模型和lingo语言编程模型,第二问第三问解答就行,我的ddl要到了谁来求了
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题
  • ¥15 Visual Studio问题
  • ¥20 求一个html代码,有偿
  • ¥100 关于使用MATLAB中copularnd函数的问题