51单片机视力保护-实物+原理图+程序
单片机源程序如下:
#include
#define uchar unsigned char //无符号字符型 宏定义 变量范围0~255
#define uint unsigned int //无符号整型 宏定义 变量范围0~65535
#include
sbit CS=P1^4; //CS定义,连接ADC0832CS脚
sbit SCL=P1^5; //SCL定义,连接ADC0832SCL脚
sbit DO=P1^6; //DO定义,连接ADC0832DO脚
//这三个引脚参考资料
sbit rs=P1^0; //1602数据/命令选择引脚 H:数据 L:命令
sbit rw=P1^1; //1602读写引脚 H:数据寄存器 L:指令寄存器
sbit e =P1^2; //1602使能引脚 下降沿触发
sbit c_send = P3^2; //超声波发射
sbit c_recive = P3^3; //超声波接收
uchar flag_hc_value; //超声波中间变量
long distance; //距离
uint set_d; //距离
bit flag_csb_juli; //超声波超出量程
uint flag_time0; //用来保存定时器0的时候的
bit flag_200ms = 1 ;
uchar guangxian; //光线的显示变量
uchar qiang_gx; //设置光线的强的变量
uchar ruo_gx; //设置光线的弱的变量
uchar value;
uchar flag_alarm; //报警变量
uchar miao = 0,fen = 0,shi;
uchar s_miao = 55,s_fen = 44,s_shi=0;
bit xuexi_start; //开始学习标志位
uchar menu_1; //菜单设置变量
uchar i;
uchar flag_gx ; //光线报警
uchar flag_juli ; //距离报警
uchar flag_time = 0; //时间报警
/***********************语音模块控制IO口的定义************************/
sbit VRST = P2^4;
sbit VBUSY= P2^3;
sbit VSDA = P2^2;
sbit VCS = P2^1;
sbit VSCL = P2^0;
/***********************1ms延时函数*****************************/
void delay_1ms(uint q)
{
uint i,j;
for(i=0;i for(j=0;j<120;j++); } /******************************************************************** * 名称 : delay() * 功能 : 延时,延时时间大概为5US。 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void delay_uint(uint q) { while(q--); } /******************************************************************** * 名称 : write_com(uchar com) * 功能 : 1602命令函数 * 输入 : 输入的命令值 * 输出 : 无 ***********************************************************************/ void write_com(uchar com) { e=0; rs=0; rw=0; P0=com; delay_uint(3); e=1; delay_uint(25); e=0; } /******************************************************************** * 名称 : write_data(uchar dat) * 功能 : 1602写数据函数 * 输入 : 需要写入1602的数据 * 输出 : 无 ***********************************************************************/ void write_data(uchar dat) { e=0; rs=1; rw=0; P0=dat; delay_uint(3); e=1; delay_uint(25); e=0; } /***********************lcd1602上显示两位十进制数************************/ void write_sfm2(uchar hang,uchar add,uchar date) { if(hang==1) write_com(0x80+add); else write_com(0x80+0x40+add); write_data(0x30+date/10%10); write_data(0x30+date%10); } /***********************lcd1602上显示超声波距离************************/ void write_sfm_csb(uchar hang,uchar add,uint date) { if(hang==1) write_com(0x80+add); else write_com(0x80+0x40+add); write_data(0x30+date/100%10); write_data('.'); write_data(0x30+date/10%10); write_data(0x30+date%10); } /******************************************************************** * 名称 : init_1602() * 功能 : 1602初始化,请参考1602的资料 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void init_1602() { write_com(0x38); // write_com(0x0c); write_com(0x06); } /******************************************************************** * 名称 : write_string(uchar hang,uchar lie,uchar *p) * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下 write_string(1,5,"ab cd ef;") * 输入 : 行,列,需要输入1602的数据 * 输出 : 无 ***********************************************************************/ void write_string(uchar hang,uchar add,uchar *p) { if(hang==1) write_com(0x80+add); else write_com(0x80+0x40+add); while(1) { if(*p == '
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』