基于stc15f2k60s2芯片单片机编程(串口超声波时间)

    科技2024-07-26  73

    (DS1302+超声波)上电显示时钟,按下S7切换为超声波,按下S6切换,当切换到时钟时,串口发送时间;当切换到超声波时,串口发送距离。

    main.c

    #include <stc15f2k60s2.h> #include <intrins.h> #include "chaoshengbo.h" #include "ds1302.h" sbit s7=P3^0; sbit s6=P3^1; void Timer0Init(void); void xianshi_csb(); void xianshi_ds(); void Delay10ms(); void anjian(); void sendstring(unsigned char *s); void UartInit(void); void sengbyte(unsigned char dat); //void chuankou(); unsigned char date; extern unsigned int distance,intr,t; unsigned char display[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}; unsigned char smg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; unsigned int s; unsigned char work=0;//模式选择 unsigned char kou_flag; void main() { Timer0Init();EA=1;ET0=1; P2=(P2&0X1F)|0XA0; P0=0X00; P2&=0X1F; UartInit();ES=1; Ds1302Init(); sendstring("任务");sendstring("十四"); while(1) { // chuankou(); anjian(); xianshi_csb(); xianshi_ds(); } } void anjian() { if(s7==0) { Delay10ms(); if(s7==0) { work=2; } while(!s7); } if(s6==0) { Delay10ms(); if(s6==0) { work=1; } while(!s6); } } void UartInit(void) //9600bps@11.0592MHz { SCON = 0x50; //8位数据,可变波特率 AUXR |= 0x01; //串口1选择定时器2为波特率发生器 AUXR |= 0x04; //定时器2时钟为Fosc,即1T T2L = 0xE0; //设定定时初值 T2H = 0xFE; //设定定时初值 AUXR |= 0x10; //启动定时器2 } void uartint() interrupt 4 { if(RI==1)//是否接受完整 { RI=0; date= SBUF ; sengbyte(date); } } void sengbyte(unsigned char dat) { SBUF=dat; while(TI==0); TI=0; } void sendstring(unsigned char *s) { while(*s) { sengbyte(*s++); } } void xianshi_ds() { if((work==0)||(work==1)) { Ds1302ReadTime(); display[0]=smg[TIME[2]/16]; display[1]=smg[TIME[2]%16]; // display[2]=smg[distance%10/1]; display[3]=smg[TIME[1]/16]; display[4]=smg[TIME[1]%16]; // display[5]=smg; display[6]=smg[TIME[0]/16]; display[7]=smg[TIME[0]%16]; if((TIME[0]%16)%2==0) { display[2]=display[5]=0xff; } else { display[2]=display[5]=0xbf; } } if((kou_flag==1)&&(work==1)) { kou_flag=0; sendstring("时");sendstring("间");sendstring("为");sendstring(":"); sengbyte((TIME[2]/16)+0X30); sengbyte((TIME[2]%16)+0X30); sendstring("-"); sengbyte((TIME[1]/16)+0X30); sengbyte((TIME[1]%16)+0X30); sendstring("-"); sengbyte((TIME[0]/16)+0X30); sengbyte((TIME[0]%16)+0X30); sendstring("\r\n"); } } void xianshi_csb() { if(work==2) { csb(); display[0]=smg[distance%1000/100]; display[1]=smg[distance%100/10]; display[2]=smg[distance%10/1]; display[3]=0XFF; display[4]=0XFF; display[5]=0XFF; display[6]=0XFF; display[7]=0XFF; if(kou_flag==1) { kou_flag=0; sendstring("距");sendstring("离");sendstring("为");sendstring(":"); sengbyte(distance%1000/100+0x30); sengbyte(distance%100/10+0x30); sengbyte(distance%10/1+0x30); sendstring("\r\n"); } } } void Timer0Init(void) //2毫秒@11.0592MHz { AUXR |= 0x80; //定时器时钟1T模式 TMOD &= 0xF0; //设置定时器模式 TL0 = 0x9A; //设置定时初值 TH0 = 0xA9; //设置定时初值 TF0 = 0; //清除TF0标志 TR0 = 1; //定时器0开始计时 } void tim1() interrupt 1 { unsigned char i; unsigned int c; P2=(P2&0X1F)|0XE0; P0=0XFF; P2&=0X1F; P2=(P2&0X1F)|0XC0; P0=1<<i; P2&=0X1F; P2=(P2&0X1F)|0XE0; P0=display[i]; P2&=0X1F; i++;if(i>=8)i=0; gengxin(); c++;if(c==500){kou_flag=1;c=0;} } void Delay10ms() //@11.0592MHz { unsigned char i, j; i = 108; j = 145; do { while (--j); } while (--i); }

    ds1302.c

    /* 程序说明: DS1302驱动程序 软件环境: Keil uVision 4.10 硬件环境: CT107单片机综合实训平台 8051,12MHz 日 期: 2011-8-9 */ #include <stc15f2k60s2.h> #include <intrins.h> unsigned char code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d}; unsigned char code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c}; char TIME[7] = {0X00,0x00,0x12,0x07,0x09,0x01,0x20}; sbit SCK=P1^7; sbit SDA=P2^3; sbit RST = P1^3; // DS1302复位 void Write_Ds1302(unsigned char temp) { unsigned char i; for (i=0;i<8;i++) { SCK=0; SDA=temp&0x01; temp>>=1; SCK=1; } } void Write_Ds1302_Byte( unsigned char address,unsigned char dat ) { RST=0; _nop_(); SCK=0; _nop_(); RST=1; _nop_(); Write_Ds1302(address); Write_Ds1302(dat); RST=0; } unsigned char Read_Ds1302_Byte ( unsigned char address ) { unsigned char i,temp=0x00; RST=0; _nop_(); SCK=0; _nop_(); RST=1; _nop_(); Write_Ds1302(address); for (i=0;i<8;i++) { SCK=0; temp>>=1; if(SDA) temp|=0x80; SCK=1; } RST=0; _nop_(); SCK=0; _nop_(); SCK=1; _nop_(); SDA=0; _nop_(); SDA=1; _nop_(); return (temp); } void Ds1302Init() { unsigned char n; Write_Ds1302_Byte(0x8e,0x00); for(n=0;n<3;n++) Write_Ds1302_Byte(WRITE_RTC_ADDR[n],TIME[n]); Write_Ds1302_Byte(0x8e,0x80); } void Ds1302ReadTime() { unsigned char n; for(n=0;n<3;n++) TIME[n]=Read_Ds1302_Byte(READ_RTC_ADDR[n]); }

    ds1302.h

    #ifndef __DS1302_H #define __DS1302_H void Write_Ds1302(unsigned char temp); void Write_Ds1302_Byte( unsigned char address,unsigned char dat ); unsigned char Read_Ds1302_Byte( unsigned char address ); extern char TIME[7]; void Ds1302ReadTime(); void Ds1302Init(); #endif

    chaoshengbo.c

    #include "chaoshengbo.h" sbit TX=P1^0; sbit RX=P1^1; bit s_flag,flag; unsigned int distance,intr,t; /************************************************************************************ **函数名称:void gengxin() **函数功能:标志位清零 **入口参数:无 **出口参数:无 **备 注:无 *************************************************************************************/ void gengxin() { if(++intr == 50) { s_flag = 1; intr = 0; } } /************************************************************************************ **函数名称:void Delay13us() **函数功能:延时 **入口参数:无 **出口参数:无 **备 注:无 *************************************************************************************/ void Delay13us() //@11.0592MHz { unsigned char i; _nop_(); _nop_(); i = 33; while (--i); } /************************************************************************************ **函数名称:void Send_Wave() **函数功能:发送波 **入口参数:无 **出口参数:无 **备 注:无 *************************************************************************************/ void Send_Wave() { unsigned char i; for(i=0;i<8;i++) { TX=1; Delay13us(); TX=0; Delay13us(); } } /************************************************************************************ **函数名称:void csb() **函数功能:超声波初始化和计算 **入口参数:无 **出口参数:无 **备 注:无 *************************************************************************************/ void csb() { if(s_flag) { s_flag=0; Send_Wave(); TR1=1; while((RX==1)&&(TF1==0)); TR1=0; if(TF1==1) { TF1=0; flag=0; } else { t = TH1; t <<= 8; t |= TL1; distance = t*0.0184; flag=1; } TH1=0; TL1=0; } }

    chaoshengbo.h

    #ifndef __CHAOSHENGNBO_H_ #define __CHAOSHENGBO_H_ #include <stc15f2k60s2.h> #include <intrins.h> extern bit s_flag,flag; void csb(); void gengxin(); extern unsigned char table[]; extern unsigned char display[]; extern unsigned int intr,distance; #endif
    Processed: 0.011, SQL: 9