基于51单片机的蓝牙串口控制电路原理图
全部资料下载:
蓝牙串口控制电路.zip
(15.8 MB, 下载次数: 40)
三按键模式控制程序:
- #include<reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- int Time[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴极数码管0~9段码
- int hour_shi=2,hour_ge=0,min_shi=1,min_ge=6;
- int NLh_shi=0,NLh_ge=0,NLm_shi=0,NLm_ge=0;
- int star_flag=1;
- int kk=4600; //一秒钟是75,一分钟是4500(用一个LED灯来做状态指示),但是还是有点误差
- char sbuf_in;
- sbit jdq=P1^0;
- sbit jdq1=P1^1;
- sbit jdq2=P1^2;
- sbit jdq3=P1^3;
- sbit fmq=P1^4;
- sbit button4=P2^7;
- sbit button3=P2^6;
- sbit button2=P2^5;
- sbit button1=P2^4;
- void delay(uchar i)
- {
- uchar j;
- while(i--)
- for(j=0;j<120;j++);
- }
- void BT_Uart_inti() //单片机串口初始化
- {
- //SCON=0X50; //串口工作方式1,允许串口接收
- SM0=0;
- SM1=1;
- REN=1;
- //RI=1; //接收标志位,0:正在接收 1:接收完毕 (如果RI=1就一直执行串口中断)
- TMOD=0X20; //定时器T1工作方式2
- TH1=0XFD; //9600bit/s下的定时器初值
- TL1=0XFD;
- TR1=1; //启动定时器T1
- EA=1; //开总中断
- ES=1; //开串行口中断
- }
- void smg_init() //数码管初始化
- {
- uint n;
- for(n=0;n<4;n++)
- {
- P2=(0XFE<<n);
- P0=0X49;
- delay(500);
- P0=0X3F;
- delay(500);
- }
- fmq=0; //关闭蜂鸣器
- }
- /*void Send_char(uchar dat) //发送端
- {
- SBUF=dat; //将字符送入发送寄存器
- while(!TI); //T1为发送状态标志位,0:发送中 1:发送结束
- TI=0; //手动清零标志位
- }*/
- void Smg_display()
- {
- P2=0XFE;
- P0=Time[hour_shi];
- delay(3);
- P2=0XFD;
- P0=Time[hour_ge];
- delay(3); //若延时大于此数值,则数码管闪烁明显
- P2=0XFB;
- P0=Time[min_shi];
- delay(3);
- P2=0XF7;
- P0=Time[min_ge];
- delay(3); //若延时大于此数值,则数码管闪烁明显
- }
- void Time_off()
- {
- uint k;
- for(k=0;k<20;k++) //不知为何只循环一半次数
- {
- Smg_display(); //如果不调用显示函数则无法正常显示数值
- jdq=~jdq;
- jdq1=~jdq1;
- jdq2=~jdq2;
- jdq3=~jdq3;
- fmq=~fmq;
- delay(33);
- Smg_display();
- delay(33);
- }
- }
- void Smg_display2()
- {
- P2=0XFE;
- P0=Time[NLh_shi];
- delay(3);
- P2=0XFD;
- P0=Time[NLh_ge];
- delay(3); //若延时大于此数值,则数码管闪烁明显
- P2=0XFB;
- P0=Time[NLm_shi];
- delay(3);
- P2=0XF7;
- P0=Time[NLm_ge];
- delay(3); //若延时大于此数值,则数码管闪烁明显
- }
- void Button4()
- {
- if(button1==0)
- {
- delay(15);
- if(button1==0)
- {
- star_flag++;
- if(star_flag>3)
- star_flag=1;
- }
- }
- if(star_flag==1) //启动时钟
- {
- jdq=0;jdq1=1;jdq2=1;jdq3=0; //用LED来做状态显示,靠边的两盏灯常亮表示正在工作
- Smg_display(); //调用数码管显示函数
- kk--;
- if(kk<0)
- {
- kk=4600;
- min_ge++;
- if(min_ge>9)
- {
- min_ge=0;
- min_shi++;
- if(min_shi>5)
- {
- min_shi=0;
- hour_ge++;
- if(hour_shi==2&&hour_ge>3)
- {
- hour_shi=0; hour_ge=0;
- min_shi=0; min_ge=0;
- }
- if(hour_ge>9)
- {
- hour_ge=0;
- hour_shi++;
- }
- }
- }
- }
- }
- if(star_flag==2) //暂停时钟(用来校准时间)
- {
- jdq=0;jdq1=0;jdq2=0;jdq3=0; //四盏灯全亮表示进入暂停状态
- Smg_display(); //调用数码管显示函数
- if(button2==0) //时位自增
- {
- delay(88);
- if(button2==0)
- {
- hour_ge++;
- if(hour_shi==2&&hour_ge>3)
- {
- hour_shi=0;
- hour_ge=0;
- }
- if(hour_ge>9)
- {
- hour_ge=0;
- hour_shi++;
- }
- }
- }
- if(button3==0) //分位自减
- {
- delay(88);
- if(button3==0)
- {
- min_ge--;
- if(min_ge<0)
- {
- min_ge=9;
- min_shi--;
- if(min_shi<0)
- min_shi=5;
- }
- }
- }
- }
- if(button4==0)
- {
- delay(88);
- if(button4==0)
- star_flag=3;
- }
- if(star_flag==3) //设置闹铃时间
- {
- jdq=1,jdq1=1;jdq2=1;jdq3=1; //四盏灯全灭表示进入设置闹铃状态
- Smg_display2();
- if(button2==0) //时位自增
- {
- delay(88);
- if(button2==0)
- {
- NLh_ge++;
- if(NLh_shi==2&&NLh_ge>3)
- {
- NLh_shi=0;
- NLh_ge=0;
- }
- if(NLh_ge>9)
- {
- NLh_ge=0;
- NLh_shi++;
- }
- }
- }
- }
- if(button3==0) //分位自减
- {
- delay(88);
- if(button3==0)
- {
- NLm_ge--;
- if(NLm_ge<0)
- {
- NLm_ge=9;
- NLm_shi--;
- if(NLm_shi<0)
- NLm_shi=5;
- }
- }
- }
- }
- /*void Add_Sub(void)
- {
- smg_ge--;
- if(smg_ge<0)
- {smg_shi--;smg_ge=9;}
- if(smg_shi<0)
- {smg_shi=9;smg_ge=9;}
- }*/
- void main()
- {
- BT_Uart_inti();
- Time_off();
- smg_init();
- while(1)
- {
- Button4();
- if(hour_shi==NLh_shi&&hour_ge==NLh_ge&&min_shi==NLm_shi&&min_ge==NLm_ge)
- Time_off();
- }
- }
- void BT_serial_smg() interrupt 4 //中断编号4为串行口中断
- {
- //Smg_display();
- if(RI) //接收标志位,0:正在接收 1:接收完毕 (如果RI=1就一直执行中断)
- {//Smg_display();k--;if(k==0){Add_Sub();k=66;}
- RI=0; //同样需要手动清零
- sbuf_in=SBUF; //将接收缓冲器接收的字符送入变量中
- }
- }
复制代码
|