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

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

设计要求: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 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵