找回密码
 立即注册

QQ登录

只需一步,快速开始

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

第四届蓝桥杯单片机省赛题程序

[复制链接]
跳转到指定楼层
楼主
ID:413345 发表于 2020-4-8 18:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. //头文件
  2. #include<iap15f2k61s2.h>
  3. #include<intrins.h>
  4. #include<stdio.h>
  5. #include"ds1302.h"
  6. #include"iic.h"
  7. //IO口定义
  8. sbit relay=P0^4;
  9. sbit buzzer=P0^6;
  10. sbit Trig=P1^0;
  11. sbit Echo=P1^1;
  12. //变量定义
  13. #define keyin P3
  14. #define time_display 0
  15. #define csb_display 1
  16. #define settime_display 2
  17. #define setdistance_display 3
  18. bit csb_flag=0;
  19. bit san_flag=0;
  20. bit flag=0;
  21. unsigned char LED_SMGwei[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x00};
  22. unsigned char SMGduan[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00,0x40};
  23. unsigned char table[8];
  24. unsigned char display_turn=0;
  25. unsigned int csb_du=0;
  26. unsigned char trg,cont;
  27. unsigned char set_shi,set_fen,set_miao;
  28. unsigned char notice_distance=30;
  29. unsigned char time_weizhi=0;
  30. //微秒延迟
  31. void Delay_us(unsigned int time)                //@11.0592MHz
  32. {
  33.         unsigned int m=0;
  34.         for(m=0;m<=time;m++)
  35.         {
  36.         _nop_();
  37.         _nop_();
  38.         _nop_();
  39.         }
  40. }
  41. //定时器
  42. void Timer0Init(void)                //1毫秒@11.0592MHz
  43. {
  44.         AUXR |= 0x80;                //定时器时钟1T模式
  45.         TMOD &= 0xF0;                //设置定时器模式
  46.         TL0 = 0xCD;                //设置定时初值
  47.         TH0 = 0xD4;                //设置定时初值
  48.         TF0 = 0;                //清除TF0标志
  49.         TR0 = 1;                //定时器0开始计时
  50.         ET0=1;
  51.         EA=1;
  52. }
  53. void timer0() interrupt 1
  54. {
  55.         static unsigned char count=0,count2=0,i=0;
  56.         static unsigned int count1=0;
  57.         count++;count2++;
  58.         if(count==1)
  59.         {
  60.                 count=0;
  61.                 P2=0xe0;P0=~SMGduan[table[ i]];P2=0x00;                P2=0xc0;P0=LED_SMGwei[ i];P2=0x00;                i++;                if(i==8)i=0;        }        if(count2==200)        {                count2=0;                csb_flag=1;        }        if(flag)        {                count1++;                if(count1==500)                {                        count1=0;                        san_flag=!san_flag;                }        }}//毫秒延迟void Delay_ms(unsigned int time)                //@11.0592MHz{        unsigned char i, j;        unsigned int m;  for(m=0;m<=time;m++)        {        _nop_();        _nop_();        _nop_();        i = 11;        j = 190;        do        {                while (--j);        } while (--i);  }}        //独立按键void KeyRead(void) {     unsigned char ReadData;                 ReadData=keyin^0xff;          trg=ReadData&(ReadData^cont);          cont=ReadData;}//蜂鸣器继电器控制void buzzer_relay(unsigned char buzzer_mode,unsigned char relay_mode){        P2=0xa0;relay=relay_mode;buzzer=buzzer_mode;P2=0x00;}//led控制void LED(unsigned char i){   P0=~LED_SMGwei[ i];P2=0x80;P2=0x00;        }//超声波float csb(){        float length=0;        unsigned int t=0;        unsigned char i=8;        do        {         Trig=!Trig;   Delay_us(20);        }        while(i--);        TR1=1;        while((Echo==1)&&(TF1==0));        TR1=0;        if(TF1==1)        {                TF1=0;                length=999;        }        else         {                t=TH1;                t<<=8;                t|=TL1;                length=t*0.017*1.085;        }        TH1=0;  TL1=0;        if(length==999)return length=999;        else        return (length+8);} //显示void display(unsigned int du,unsigned char mode,unsigned char num){         if(mode==1)        {                table[0]=du>=10000000? du/10000000%10:16;                table[1]=du>=1000000? du/1000000%10:16;                table[2]=du>=100000? du/100000%10:16;                table[3]=du>=10000? du/10000%10:16;                table[4]=du>=1000? du/1000%10:16;                table[5]=du>=100? du/100%10:16;                table[6]=du>=10? du/10%10:16;                table[7]=du>=0? du%10:16;                }        else if(mode==0)        table[num]=du;}unsigned char shi;unsigned char fen;unsigned char miao;void clock(){        EA=0;        miao=(Read_Ds1302_Byte(0x81)/16)*10+Read_Ds1302_Byte(0x81)%16;        fen=(Read_Ds1302_Byte(0x83)/16)*10+Read_Ds1302_Byte(0x83)%16;        shi=(Read_Ds1302_Byte(0x85)/16)*10+Read_Ds1302_Byte(0x85)%16;        EA=1;        display(miao%10,0,7);        display(miao/10,0,6);        display(17,0,5);        display(fen%10,0,4);        display(fen/10,0,3);        display(17,0,2);        display(shi%10,0,1);        display(shi/10,0,0);}void set_display(unsigned char mode){        if(mode==settime_display)        {                if(san_flag==1&&time_weizhi==1){                        display(16,0,1);                        display(16,0,0);                        display(set_fen%10,0,4);                        display(set_fen/10,0,3);                }                else if(san_flag==0&&time_weizhi==1){                        display(set_shi%10,0,1);                        display(set_shi/10,0,0);                        display(set_fen%10,0,4);                        display(set_fen/10,0,3);                }                if(san_flag==1&&time_weizhi==2){                        display(16,0,4);                        display(16,0,3);                        display(set_shi%10,0,1);                        display(set_shi/10,0,0);                }                else if(san_flag==0&&time_weizhi==2){                        display(set_fen%10,0,4);                        display(set_fen/10,0,3);                        display(set_shi%10,0,1);                        display(set_shi/10,0,0);                }                display(set_miao%10,0,7);                display(set_miao/10,0,6);                display(17,0,5);                display(17,0,2);        }        else if(mode==setdistance_display){                display(notice_distance,1,0);        }}void display_mode(unsigned char mode){                if(mode==time_display)        {                clock();        }        else if(mode==csb_display)        {                display(csb_du,1,0);        }        else                set_display(mode);}//数码管void SMG(){                P2=0xc0;P0=0xff;P2=0x00;                P2=0xe0;P0=0x00;P2=0x00;}void main(){        LED(0);        SMG();        buzzer_relay(1,0);        Delay_ms(1000);        LED(8);        buzzer_relay(0,0);        display_turn=time_display;        settime(11,50,59);        write_24c02(0x50,30);        notice_distance=read_24c02(0x50);        Timer0Init();        while(1)        {                if(csb_flag)                {                        csb_du=csb();                        csb_flag=0;                }                display_mode(display_turn);                KeyRead();                if(trg==0x01)                {                        display_turn=!display_turn;                }                if(trg==0x02)                {                        if(display_turn==time_display){                                if(time_weizhi==0)                                {                                        set_shi=shi;set_fen=fen;set_miao=miao;                                        display_turn=settime_display;                                }                                time_weizhi+=1;flag=1;                        }                        else if(display_turn==settime_display)                        {                                time_weizhi+=1;                                if(time_weizhi==3){                                        settime(set_shi,set_fen,set_miao);                                        time_weizhi=0;flag=0;                                        display_turn=time_display;                                }                        }                        if(display_turn==csb_display){                                display_turn=setdistance_display;                        }                        else if(display_turn==setdistance_display){                                write_24c02(0x50,notice_distance);                                display_turn=csb_display;                        }                }                if(trg==0x04)                {                        if(display_turn==settime_display)                        {                                if(time_weizhi==1)                                {                                        set_shi+=1;                                        if(set_shi==24)set_shi=23;                                }                                if(time_weizhi==2)                                {                                        set_fen+=1;                                        if(set_fen==60)set_fen=59;                                }                        }                        else if(display_turn==setdistance_display){                                notice_distance+=1;                                if(notice_distance==999)notice_distance=999;                        }                }                if(trg==0x08)                {                        if(display_turn==settime_display)                        {                                if(time_weizhi==1)                                {                                        if(set_shi==0){set_shi=0;continue;}                                        set_shi-=1;                                }                                if(time_weizhi==2)                                {                                                                                if(set_fen==0){set_fen=0;continue;}                                        set_fen-=1;                                }                        }                        else if(display_turn==setdistance_display){                                                                if(notice_distance==0){notice_distance=0;break;}                                notice_distance-=1;                        }                }        }}
复制代码


第四届省赛.7z

32.16 KB, 下载次数: 4, 下载积分: 黑币 -5

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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