日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2023/12/9 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于stc15f2k60s2芯片单片机编程(串口超声波时间) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

(DS1302+超聲波)上電顯示時(shí)鐘,按下S7切換為超聲波,按下S6切換,當(dāng)切換到時(shí)鐘時(shí),串口發(fā)送時(shí)間;當(dāng)切換到超聲波時(shí),串口發(fā)送距離。

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("任務(wù)");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位數(shù)據(jù),可變波特率AUXR |= 0x01; //串口1選擇定時(shí)器2為波特率發(fā)生器AUXR |= 0x04; //定時(shí)器2時(shí)鐘為Fosc,即1TT2L = 0xE0; //設(shè)定定時(shí)初值T2H = 0xFE; //設(shè)定定時(shí)初值AUXR |= 0x10; //啟動(dòng)定時(shí)器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("時(shí)");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; //定時(shí)器時(shí)鐘1T模式TMOD &= 0xF0; //設(shè)置定時(shí)器模式TL0 = 0x9A; //設(shè)置定時(shí)初值TH0 = 0xA9; //設(shè)置定時(shí)初值TF0 = 0; //清除TF0標(biāo)志TR0 = 1; //定時(shí)器0開始計(jì)時(shí) }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驅(qū)動(dòng)程序軟件環(huán)境: Keil uVision 4.10 硬件環(huán)境: CT107單片機(jī)綜合實(shí)訓(xùn)平臺 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復(fù)位 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_Hvoid 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;/************************************************************************************ **函數(shù)名稱:void gengxin() **函數(shù)功能:標(biāo)志位清零 **入口參數(shù):無 **出口參數(shù):無 **備 注:無 *************************************************************************************/ void gengxin() {if(++intr == 50){s_flag = 1;intr = 0;} } /************************************************************************************ **函數(shù)名稱:void Delay13us() **函數(shù)功能:延時(shí) **入口參數(shù):無 **出口參數(shù):無 **備 注:無 *************************************************************************************/ void Delay13us() //@11.0592MHz {unsigned char i;_nop_();_nop_();i = 33;while (--i); } /************************************************************************************ **函數(shù)名稱:void Send_Wave() **函數(shù)功能:發(fā)送波 **入口參數(shù):無 **出口參數(shù):無 **備 注:無 *************************************************************************************/ void Send_Wave() {unsigned char i;for(i=0;i<8;i++){TX=1;Delay13us();TX=0;Delay13us();} } /************************************************************************************ **函數(shù)名稱:void csb() **函數(shù)功能:超聲波初始化和計(jì)算 **入口參數(shù):無 **出口參數(shù):無 **備 注:無 *************************************************************************************/ 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

總結(jié)

以上是生活随笔為你收集整理的基于stc15f2k60s2芯片单片机编程(串口超声波时间)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。