蓝桥杯单片机学习过程记录(二十九)第八届国赛超声波测距机

题目如下:


已完成
应用的内容:
EEPROM、
定时器、数码管
led灯,独立按键
DA电压输出
超声波测距

/*
-----------------------------
第八届国赛超声波测距机
2020.3.22
DA输出电压未测量
*/
#include<stc15f2k60s2.h>
#include<intrins.h>
#include<iic.h>
#define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}
sbit TX=P1^0;
sbit RX=P1^1;
sbit s7=P3^0;
sbit s6=P3^1;
sbit s5=P3^2;
sbit s4=P3^3;
bit flag_1000,flag_200,flag_led1;
unsigned char eep[4];
unsigned char seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff,0xc6,0x8e};
unsigned char yi,er,san,si,wu,liu,qi,ba;
unsigned char flag_yemian;
unsigned char count_wave=1,AD_read,count_eep,count_led1;
unsigned int distance,distance_last,distance_set,t_0,count_0;
void delayms(int ms);
void dislpay_12(yi,er);
void dislpay_34(san,si);
void dislpay_56(wu,liu);
void dislpay_78(qi,ba);
void allinit();
void send_wave();
unsigned char rect_wave();
void Timer0Init(void);
void Timer1Init(void);
void key_scan();
void DA_write(unsigned char dat);
unsigned char eeprom_read(unsigned char add);
void eeprom_write(unsigned char add,unsigned char dat);
void distance_write();
//主函数
void main(){allinit();Timer0Init();Timer1Init();EA=1;ET0=1;distance_set=eeprom_read(0x06);while(1){//测距显示界面if(flag_yemian==0){yi=12;er=11;san=distance/100;si=distance%100/10;wu=distance%10;liu=distance_last/100;qi=distance_last%100/10;ba=distance_last%10;}//数据回显界面else if(flag_yemian==1){eep[0]=eeprom_read(0x01);eep[1]=eeprom_read(0x02);eep[2]=eeprom_read(0x03);eep[3]=eeprom_read(0x04);yi=count_wave;er=11;san=11;si=11;wu=11;liu=eep[count_wave-1]/100;qi=eep[count_wave-1]%100/10;ba=eep[count_wave-1]%10;}//参数设置界面else if(flag_yemian==2){yi=13;er=11;san=11;si=11;wu=11;liu=11;qi=distance_set%100/10;ba=distance_set%10;}key_scan();dislpay_12(yi,er);dislpay_34(san,si);dislpay_56(wu,liu);dislpay_78(qi,ba);}
}
//按键
void key_scan(){//s7控制调整if(s7==0){delayms(5);if(s7==0){//若为数据显示if(flag_yemian==1){count_wave++;if(count_wave==5)count_wave=1;}//若为盲区设置else if(flag_yemian==2){distance_set=distance_set+10;if(distance_set>30)distance_set=distance_set-30;}}while(!s7);}//s6控制盲区显示else if(s6==0){delayms(5);if(s6==0){//再次按下退出并保存if(flag_yemian==2){P2=0X80;P0=0XFF;flag_yemian=0;eeprom_write(0x06,distance_set);delayms(5);distance_set=eeprom_read(0x06);}else {flag_yemian=2;P2=0X80;P0=0XBF;}}while(!s6);}//s5控制测距显示else if(s5==0){delayms(5);if(s5==0){if(flag_yemian==1){flag_yemian=0;P2=0X80;P0=0XFF;}else{flag_yemian=1;P2=0X80;P0=0X7F;}}while(!s5);}//s4控制超声波测距else if(s4==0){delayms(5);if(s4==0){flag_yemian=0;distance=rect_wave();distance_write();count_eep++;flag_led1=1;count_led1=0;if(count_eep==4) count_eep=0;//进行盲区判断if(distance<distance_set)DA_write(0x00);else if((distance-distance_set)>250)DA_write(0xff);else DA_write(distance-distance_set);}while(!s4);}
}
//超声波距离写入与读取
void distance_write(){if(count_eep==0){eeprom_write(0x01,distance);delayms(5);distance=eeprom_read(0x01);distance_last=eeprom_read(0x04);}else if(count_eep==1){eeprom_write(0x02,distance);delayms(5);distance=eeprom_read(0x02);distance_last=eeprom_read(0x01);}else if(count_eep==2){eeprom_write(0x03,distance);delayms(5);distance=eeprom_read(0x03);distance_last=eeprom_read(0x02);}else if(count_eep==3){eeprom_write(0x04,distance);delayms(5);distance=eeprom_read(0x04);distance_last=eeprom_read(0x03);}
}
//eeprom读取
unsigned char eeprom_read(unsigned char add){unsigned char temp;IIC_Start();IIC_SendByte(0xa0);IIC_WaitAck();IIC_SendByte(add);IIC_WaitAck();IIC_Stop();IIC_Start();IIC_SendByte(0xa1);IIC_WaitAck();temp=IIC_RecByte();IIC_Stop();return temp;
}
//eep写入
void eeprom_write(unsigned char add,unsigned char dat){IIC_Start();IIC_SendByte(0xa0);IIC_WaitAck();IIC_SendByte(add);IIC_WaitAck();IIC_SendByte(dat);IIC_WaitAck();IIC_Stop();
}
//DA输出电压
void DA_write(unsigned char dat){IIC_Start();IIC_SendByte(0x90);IIC_WaitAck();IIC_SendByte(0x40);IIC_WaitAck();IIC_SendByte(dat);IIC_WaitAck();IIC_Stop();
}
//超声波发送,拉高40us
void send_wave(){unsigned char i=8;while(i--){TX=1;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;TX=0;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;}
}
//超声波接收
unsigned char rect_wave(){unsigned int temp;//发送send_wave();TR1=1;//接收,接收到或溢出while((RX==1)&&(TF1==0));TR1=0;//如果溢出if(TF1==1){TF1=0;temp=999;}//如果接收到信号else {temp=TH1;temp=(temp<<8)|TL1;TH1=0;TL1=0;temp=(unsigned int)(temp*0.017/12);}return temp;
}
//定时器0计时200ms
void time0() interrupt 1{t_0++;if(t_0==100){t_0=0;count_0++;flag_200=!flag_200;}if(count_0==5){count_0=0;flag_1000=!flag_1000;count_led1++;if(count_led1==7){flag_led1=0;count_led1=0;}if(flag_led1==1){if(flag_1000==0){P2=0X80;P0=0XFE;}else {P2=0X80;P0=0XFF;}}}
}
//定时器0定时2毫秒
void Timer0Init(void)
{AUXR |= 0x80; TMOD &= 0xF0;TL0 = 0x9A;TH0 = 0xA9;TF0 = 0;TR0 = 1;
}
//定时器1用于超声波接收计时
void Timer1Init(void)
{AUXR |= 0x40;TMOD &= 0x0F;   TL1 = 0;TH1 = 0;
}
//延时
void delayms(int ms){int q,w;for(q=0;q<ms;q++)for(w=0;w<845;w++);
}
//数码管
void dislpay_12(yi,er){P2=0XC0;P0=0X01;P2=0XE0;P0=seg[yi];delayms(1);P2=0XC0;P0=0X02;P2=0XE0;P0=seg[er];delayms(1);
}
void dislpay_34(san,si){P2=0XC0;P0=0X04;P2=0XE0;P0=seg[san];delayms(1);P2=0XC0;P0=0X08;P2=0XE0;P0=seg[si];delayms(1);
}
void dislpay_56(wu,liu){P2=0XC0;P0=0X10;P2=0XE0;P0=seg[wu];delayms(1);P2=0XC0;P0=0X20;P2=0XE0;P0=seg[liu];delayms(1);
}
void dislpay_78(qi,ba){P2=0XC0;P0=0X40;P2=0XE0;P0=seg[qi];delayms(1);P2=0XC0;P0=0X80;P2=0XE0;P0=seg[ba];delayms(1);P2=0XC0;P0=0XFF;P2=0XE0;P0=0XFF;delayms(1);
}
//初始化
void allinit(){P2=0XA0;P0=0X00;P2=0XC0;P0=0XFF;P2=0XE0;P0=0XFF;P2=0X80;P0=0XFF;
}

蓝桥杯单片机学习过程记录(二十九)第八届国赛超声波测距机相关推荐

  1. 蓝桥杯单片机学习过程记录(十四)第六届温度记录

    蓝桥杯单片机学习过程记录(十四)第六届温度记录 应用的内容: 定时器 数码管 时钟ds1302 温度传感器ds18b20 独立按键 结果实现的问题: 时钟和定时器两个时间走的不同,定时器5ms下200 ...

  2. 蓝桥杯单片机学习过程记录(二十七)超声波模块

    蓝桥杯单片机学习过程记录(二十七)超声波模块 超声波模块的学习,未验证. /* ------------------- 超声波模块 没模块未验证 2020.3.16 ----------------- ...

  3. [蓝桥杯单片机]刷题笔记—客观题—2019年省赛真题

    本人最近在备战蓝桥杯的单片机赛道 需要多多刷题历练 这一系列的文章会跟大家一起计算.一起翻手册找答案 (在之前的文章中有详细记录的只会简单解释,不懂的自己往前翻) 一方面帮助自己记住刷过的题 另一方面 ...

  4. 【今日开播】第十二届蓝桥杯决赛特训营开播啦!国赛冲冲冲!

    官方出品,真题串讲,决赛冲刺! 第十二届蓝桥杯的国赛马上就要开始了! 为了帮助同学们更好地备战决赛,大赛组委会特推出「第十二届大赛(软件类)决赛特训营」活动. 我们邀请了蓝桥杯大赛组委会特邀专家.蓝桥 ...

  5. 【蓝桥杯-单片机学习笔记(十二)】工厂灯光控制系统

    一.要求 在CT107D单片机综合训练平台上,设计程序,实现实时显示开机系统运行时间和按键控制灯光. 1.设计系统初始化函数,关闭蜂鸣器和继电器等无关设备. 2.设计设备检测函数,首先检测LED灯,从 ...

  6. 【蓝桥杯——单片机学习笔记】十二.LCD1602(STC15F2K60S2)

    一.原理图及引脚说明 可由Rb1电位器控制LCD的对比度 编号 引脚名 引脚说明 编号 引脚名 引脚说明 1 VSS 电源地 9 D2 Data I/O 2 VDD 电源正极 10 D3 Data I ...

  7. 【蓝桥杯-单片机学习笔记(十五)】NE555频率测量

    一.要求 在CT107D平台上测量NE555产生方波的频率值并显示在数码管上.频率数据显示用5位数码管,单位是Hz,数码管最左边显示"F".改变滑动变阻器Rb3可以改变频率大小. ...

  8. 【蓝桥杯-单片机学习笔记(十四)】DS1302

    一.DS1302介绍 1.功能介绍 DS1302包括时钟/日历寄存器和31字节(8位)的数据暂存寄存器,数据通信仅通过一条串行输入输出口,实时时钟/日历提供包括秒.分.时.日期.月份和年份信息.闰年可 ...

  9. 蓝桥杯单片机学习记录(8)(PWM脉宽调制)

    PWM脉宽调制 PWM(Pluse Width Modulation)简称脉宽调制,是一种模拟控制方式,根据相应载荷的变化来调制晶体管基极或MOS管栅极的偏置,来实现晶体管或MOS管导通时间的改变,从 ...

最新文章

  1. mysql right join实例_mysql left join,right join,inner join简单实例
  2. 分享一个WM上绘制饼图、柱形图、折线图的控件类
  3. Redis 重写原理
  4. Search in Rotated Sorted Array leetcode java
  5. Maven搭建SpringMVC+Mybatis项目详解
  6. [2014-12-30]如何动态构造Lambda表达式(动态构造Lambda查询条件表达式)
  7. 用友U815.0UFO报表知识点分享
  8. android磁盘管理工具,易我分区大师(磁盘分区管理工具)
  9. QGraphicsObject Error: Class declarations lacks Q_OBJECT macro.
  10. springboot项目版本升级
  11. 微信扫一扫二维码直接打开外部浏览器下载app怎么解决
  12. ardruino控制继电器_Arduino基础入门篇24—继电器控制
  13. 运用gm/id法设计二级运放教程
  14. web前端学习-第二天
  15. 保障IM推送、优化移动网络 网易云信解决移动IM稳定难题
  16. markdown 图片并排显示
  17. Nokia Open MSS 学习个人笔记
  18. 减震透气的清爽跑鞋,让跑步更轻松,咕咚10K悦弹体验
  19. jQuery设置attr()对样式属性失效的原因
  20. P44-前端基础CSS-Position相对定位介绍

热门文章

  1. Linux:使用云盘
  2. english accent
  3. AE基础教程(16)——第16章 运动模糊,帧混合,三维层
  4. outlook删除特定年份邮件_Outlook中删除只保留30天邮件文件夹
  5. outlook邮件开发开发HTML,CSS标签及样式失效总结
  6. 如何快速接入直播服务 七牛云企业直播解决方案来了
  7. 详谈机器视觉大师脚本编程
  8. java 当前时间_Java 获取当前时间的小时(24小时制)
  9. java实现身份证校验算法与介绍详解
  10. sqlserver2008R2在配置复制分发时报错:在执行xp_cmdshell的过程中出错