附录三:物料清单
元件注解 元件类型 10K 电阻 10uF 电容 12M 晶振 D 指示灯 发光二极管 DS04 数码管 SW-灰色 电源开关 开关 U1 单片机 蜂鸣器 蜂鸣器 9012 三极管 20 电容 Header 4 超声波接口 SW-PB 独立按键 按键 9012 三极管 2K 电阻 1K 电阻 电阻 元件称号 R14 C1 Y1 D1 DS1 SW1 U1 B1 Q5 C2, C3 P1 S1, S2, S3, S4 Q1, Q2, Q3, Q4 R4, R5, R6, R7, R13, R15 R1, R2, R3, R8, R9, R10, R11, R12 数量 1 1 1 1 1 1 1 1 1 2 1 4 4 6 8
24
附录四:程序源代码
#include
#define uchar unsigned char #define uint unsigned int
//数码管段选定义 0 1 2 3 4 5 6 7 8 9
uchar code
smg_du[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, 0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff}; //断码 //数码管位选定义
uchar code smg_we[]={0xe0,0xd0,0xb0,0x70};
uchar dis_smg[8] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8};
sbit smg_we1 = P3^4; //数码管位选定义 sbit smg_we2 = P3^5; sbit smg_we3 = P3^6; sbit smg_we4 = P3^7;
sbit c_send = P3^2; //超声波发射 sbit c_recive = P3^3; //超声波接收
uchar flag_hc_value; //超声波中间变量
sbit beep = P2^3; //蜂鸣器IO口定义
bit flag_key_b_en,flag_key_set_en; //按键蜂鸣器使能
uchar smg_i = 3; //显示数码管的个位数 bit flag_300ms ;
bit key_500ms ;
long distance; //距离 uint set_d; //距离
bit flag_csb_juli; //超声波超出量程
uint flag_time0; //用来保存定时器0的时候的
// 按键的IO变量的定义 uchar key_can; //按键值的变量
uchar zd_break_en,zd_break_value; //自动退出设置界面 uchar menu_shudu = 10; //用来控制连加的速度
25
bit flag_lj_en; //按键连加使能
bit flag_lj_3_en; //按键连3次连加后使能 加的数就越大了 uchar key_time,flag_value; //用做连加的中间变量 uchar menu_1; //菜单设计的变量 uchar a_a;
/***********************1ms延时函数*****************************/ void delay_1ms(uint q) {
uint i,j;
for(i=0;i for(j=0;j<120;j++); } /***********************处理距离函数****************************/ void smg_display() { dis_smg[0] = smg_du[distance % 10]; dis_smg[1] = smg_du[distance / 10 % 10]; dis_smg[2] = smg_du[distance / 100 % 10] & 0x7f; } /******************把数据保存到单片机内部eepom中******************/ void write_eepom() { SectorErase(0x2000); byte_write(0x2000, set_d % 256); byte_write(0x2001, set_d / 256); byte_write(0x2058, a_a); } /******************把数据从单片机内部eepom中读出来*****************/ void read_eepom() { set_d = byte_read(0x2001); set_d <<= 8; set_d |= byte_read(0x2000); a_a = byte_read(0x2058); } 26 /**************开机自检eepom初始化*****************/ void init_eepom() { read_eepom(); //先读 if(a_a != 1) //新的单片机初始单片机内问EEPOM { set_d = 100; a_a = 1; write_eepom(); } } /****************独立按键处理函数********************/ void key() { static uchar key_new = 0,key_old = 0,key_value = 0; if(key_new == 0) { //按键松开的时候做松手检测 if((P2 & 0x07) == 0x07) key_value ++; else key_value = 0; if(key_value >= 5) { key_value = 0; key_new = 1; flag_lj_en = 0; //关闭连加使能 flag_lj_3_en = 0; //关闭3秒后使能 flag_value = 0; //清零 key_time = 0; write_eepom(); } } else { if((P2 & 0x07) != 0x07) key_value ++; //按键按下的时候 else key_value = 0; if(key_value >= 5) { key_value = 0; key_new = 0; flag_lj_en = 1; //连加使能 27 zd_break_en = 1; //自动退出设置界使能 zd_break_value = 0; //自动退出设置界变量清零 flag_key_b_en = 1; //按键蜂鸣器使能 } } key_can = 20; if(key_500ms == 1) //连加 { key_500ms = 0; key_new = 0; key_old = 1; zd_break_value = 0; } if((key_new == 0) && (key_old == 1)) { switch(P2 & 0x07) { case 0x06: key_can = 3; break; //得到k2键值 case 0x05: key_can = 2; break; //得到k3键值 case 0x03: key_can = 1; break; //得到k4键值 } // dis_smg[3] = smg_du[key_can % 10]; } key_old = key_new; } void smg_we_switch(uchar i) { switch(i) { case 0: smg_we1 = 0; smg_we2 = 1; smg_we3 = 1; smg_we4 = 1; break; case 1: smg_we1 = 1; smg_we2 = 0; smg_we3 = 1; smg_we4 = 1; break; case 2: smg_we1 = 1; smg_we2 = 1; smg_we3 = 0; smg_we4 = 1; break; case 3: smg_we1 = 1; smg_we2 = 1; smg_we3 = 1; smg_we4 = 0; break; } } /***********************数码显示函数 28