//更新历史:增加温度显示,调整时闪动。12/1
// 增加零下温度显示 12/15
/*============================================================
使用1602液晶显示DS1302+S51时钟+温度显示 马文垒 2004/12/01
==============================================================
声明:1. 1602驱动程序照搬 明皓 的,非常好用
2. DS1302驱动程序是参考网友修改而来
SMC1602A(16*2)模拟口线接线方式
连接线图:
---------------------------------------------------
| LCM-----51 | LCM-----51 | LCM------51 |
---------------------------------------------|
|DB0-----P0.0 | DB4-----P0.4 | RS-------P2.4 |
|DB1-----P0.1 | DB5-----P0.5 | RW-------P2.5 |
|DB2-----P0.2 | DB6-----P0.6 | E--------P2.6 |
|DB3-----P0.3 | DB7-----P0.7 | VLCD接1K电阻到GND|
---------------------------------------------------
DS1302 接线图
Vcc2 CLK I/O /RST
| | | |
--------------
| 8 7 6 5|
| DS1302 |
| |
| 1 2 3 4|
--------------
| | | |
VCC1 GND
1 脚接+5V 2,3脚32768HZ晶振 4脚接地 5脚接S51的P35 6脚接S51的P34 7接S51的P36
8脚接后备电源,可以接老计算机主板上的3.6V电池,也可以通过二级管隔离接一个大容量电解电容
电压在2.5V以上即可维持
按键说明:1. 共三个键,低电平有效
2. P04 和 P05 同时按:初始化
3. P06 端口按键:选择要调整的项目
4. P05 端口按键:增加;P04端口按键:减少
[注:AT89S51使用12M晶振]
=============================================================*/
#include <AT89x51.h>
#include <string.h>
#include<intrins.h>
#define LCM_RS P2_4 //定义引脚
#define LCM_RW P2_5
#define LCM_E P2_6
#define LCM_Data P0
#define Busy 0x80 //用于检测LCM状态字中的Busy标识
#define uchar unsigned char
uchar id,timecount;
bit flag,sflag; //flag是时钟冒号闪烁标志,sflag是温度负号显示标志
void Disp_line1(void); //显示屏幕第一行
void Disp_line2(void); //显示屏幕第二行
void id_case1_key();
//*********** DS1302 时间显示定义部分
sbit T_CLK=P3^6;
sbit T_IO =P3^4;
sbit T_RST=P3^5;
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
void Set(uchar,uchar); //根据选择调整相应项目
void RTInputByte(uchar); /* 输入 1Byte */
uchar RTOutputByte(void); /* 输出 1Byte */
void W1302(uchar, uchar); // 向DS1302写入一个字节
uchar R1302(uchar); // 从DS1302读出一个字节
void Set1302(unsigned char * ); // 设置时间
bit sec,min,hour,year,mon,day,weekk; //闪烁标志位
//初始化后设置为:08年1月1日星期二 0点0分0秒
unsigned char inittime[7]={0x00,0x00,0x00,0x08,0x01,0x02,0x08};
// 秒 分钟 小时 日 月 星期 年
//***** 18B20温度显示定义部分
sbit DQ=P1^3; //18B20 接P13口
typedef unsigned char byte;
typedef unsigned int word;
Read_Temperature(char,char);
void mychar(void);
void adjust_res(char res); //res 分别等于 0x1f, 0x3f, 0x5f 温度读数分辨率分别对应
// 0.5, 0.25, 0.125
//******* 1602LCD驱动 **********************************************************
void WriteDataLCM(unsigned char WDLCM);
void WriteCommandLCM(unsigned char WCLCM,BuysC);
unsigned char ReadStatusLCM(void);
void LCMInit(void);
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
void Delay5Ms(void);
void Delay400Ms(void);
unsigned char code week[]={"Week."};
void main(void)
{
Delay400Ms(); //启动等待,等LCM讲入工作状态
LCMInit(); //LCM初始化
Delay5Ms(); //延时片刻(可不要)
mychar(); //显示自定义字符
TMOD=0x01;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
EA=1;
TR0=1;
ET0=1;
W1302(0x90,0xab);//打开充电二级管 , 二个二级管串联一个8K电阻
W1302(0x8e,0x80);//写保护,禁止写操作
adjust_res(0x5f); //调整18B20的分辨率 0x1f:0.5; 0x3f:0.25; 0x5f:0.125
while(1)
{
if ((P3_2|P3_3)==0) //初始化
{
Delay5Ms();
if ((P3_2|P3_3)==0) Set1302(inittime);
}
if (P3_1==0) // 设置和选择项目键
{
Delay5Ms();
if(P3_1==0){id++;if(id>7) id=0;}
while(P3_1==0);
}
switch(id)
{
case 0:
sec=0;
Disp_line1(); Disp_line2();
break;
case 1://年
year=1;
Disp_line1(); Disp_line2();
id_case1_key();
break;
case 2://月
year=0;mon=1;
Disp_line1(); Disp_line2();
id_case1_key();
break;
case 3://日
mon=0;day=1;
Disp_line1(); Disp_line2();
id_case1_key();
break;
case 4://星期
day=0;weekk=1;
Disp_line1(); Disp_line2();
id_case1_key();
break;
case 5://小时
weekk=0;hour=1;
Disp_line1(); Disp_line2();
id_case1_key();
break;
case 6://分钟
hour=0;min=1;
Disp_line1(); Disp_line2();
id_case1_key();
break;
case 7://秒
min=0;sec=1;
Disp_line1(); Disp_line2();
id_case1_key();
break;
}
}
}
//中断入口,冒号闪烁
void t0(void) interrupt 1 using 0
{
TH0=(65535-50000)/256; //50ms定时
TL0=(65535-50000)%256;
timecount++;
if(timecount>9)
{
timecount=0;
flag=~flag;
}
}
//id为1时的下一级选择
void id_case1_key()
{
if (P3_3==0) //增加
{
Delay5Ms();
if(P3_3==0) Set(id,0);
if(id!=7) while(P3_3==0);
}
if (P3_2==0) //减少
{
Delay5Ms();
if(P3_2==0) Set(id,1);
if(id!=7) while(P3_2==0);
}
}
//根据选择调整相应项目并写入DS1302
void Set(uchar sel,uchar sel_1)
{
signed char address,item;
signed char max,mini;
if(sel==7) {address=0x80; max=0;mini=0;} //秒
if(sel==6) {address=0x82; max=59;mini=0;} //分钟
if(sel==5) {address=0x84; max=23;mini=0;} //小时
if(sel==3) {address=0x86; max=31;mini=1;} //日
if(sel==2) {address=0x88; max=12;mini=1;} //月
if(sel==1) {address=0x8c; max=99;mini=0;} //年
if(sel==4) {address=0x8a; max=7; mini=1;} //星期
item=R1302(address+1)/16*10+R1302(address+1)%16;
if (sel_1==0) item++; else item--;
if(item>max) item=mini;
if(item<mini) item=max;
W1302(0x8e,0x00);//允许写操作
W1302(address,item/10*16+item%10);
W1302(0x8e,0x80);//写保护,禁止写操作
}
//屏幕显示第一行 时间和温度
void Disp_line1(void)
{
Read_Temperature(10,0); //温度显示
//冒号闪烁
if(flag==0)
{DisplayOneChar(3,0,0x3a); DisplayOneChar(6,0,0x3a);}
else
{DisplayOneChar(3,0,0x20); DisplayOneChar(6,0,0x20);}
if(sec==1) //秒闪烁标志位
{
if(flag==1)
{
DisplayOneChar(7,0,R1302(0x81)/16+0x30); //显示秒
DisplayOneChar(8,0,R1302(0x81)%16+0x30);
}
else
{
DisplayOneChar(7,0,0x20); //显示秒
DisplayOneChar(8,0,0x20);
}
}
else
{
DisplayOneChar(7,0,R1302(0x81)/16+0x30); //显示秒
DisplayOneChar(8,0,R1302(0x81)%16+0x30);
}
if(min==1) //分钟闪烁标志位
{
if(flag==1)
{
DisplayOneChar(4,0,R1302(0x83)/16+0x30); //显示分钟
DisplayOneChar(5,0,R1302(0x83)%16+0x30);
}
else
{
DisplayOneChar(4,0,0x20); //显示分钟
DisplayOneChar(5,0,0x20);
}
}
else
{
DisplayOneChar(4,0,R1302(0x83)/16+0x30); //显示分钟
DisplayOneChar(5,0,R1302(0x83)%16+0x30);
}
if(hour==1) //小时闪烁标志位
{
if(flag==1)
{
DisplayOneChar(1,0,R1302(0x85)/16+0x30);
没有合适的资源?快使用搜索试试~ 我知道了~
基于C51的超声波防撞小车程序源代码
共78个文件
c:12个
lst:11个
obj:11个
需积分: 45 16 下载量 50 浏览量
2015-08-11
16:56:49
上传
评论 4
收藏 213KB RAR 举报
温馨提示
用遥控器控制小车前进、后退、左转、右转运动来模拟驾驶员的驾驶动作;小车的最前部安装有超声波传感器,用于检测本车与前面障碍物的距离;电路板安装于小车的车架上;原车的后桥驱动电机和转向电机的布置基本不变。本装置的基本原理为:超声波发射端在单片机和前置电路的驱动下工作,接收端的信号经放大整形后在单片机的中断口产生中断,通过发射和接收的时间差计算出小车与障碍物的相对距离,再由单片机实现避障算法,做出判断决策,发出相应的控制指令,然后通过外围硬件电路实现PWM电机调速和转向控制,从而实现模型小车的主动避障。具体实现的过程:传感器实时检测本车与前面障碍物的距离,当此距离小于设定的安全距离时即通过蜂鸣器报警,并主动控制电机适当减速直至停车,当相对距离大于安全距离时方可前进,报警解除,同时LCD显示电路会实时显示当前距离和温度(测量温度的目的在于修正超声波传播速度)。硬件电路部分采用AT89S52单片机作为控制器,主要功能电路有超声波发射电路、超声波接收电路、温度检测电路、电机驱动输出控制电路、无线接收遥控接收电路、LCD显示电路和报警电路。软件部分采用分模块化设计的方法,其优点在于便于调试和查找错误。
资源推荐
资源详情
资源评论
收起资源包目录
C51_超声波程序.rar (78个子文件)
C51_超声波
main.OBJ 19KB
delay.c 297B
LCD1602.C 3KB
motor.LST 7KB
超声波.M51 37KB
delay.LST 1KB
LCD1602.LST 5KB
main.c 14KB
ds18b20.c 2KB
超声波.hex 9KB
motor.h 410B
LCD1602.H 805B
仿真
Last Loaded 恒温箱控制1.DBK 172KB
delay.c 297B
motor.LST 6KB
motor.h 450B
1.lnp 48B
1.OBJ 6KB
1.LST 5KB
1.uv2 2KB
1.c 2KB
1 11KB
motor.c 2KB
delay.h 186B
1.plg 9KB
motor.OBJ 6KB
恒温箱控制1.DSN 182KB
1.M51 12KB
1.Opt 1KB
恒温箱控制1.PWI 1KB
1.hex 2KB
main.LST 33KB
beep.LST 1KB
main.SRC 17KB
超声波 33KB
ultrasonic.OBJ 279B
超声波.Opt 3KB
main.ls1 47KB
motor.c 2KB
超声波.Uv2 2KB
超声波模块测试(数码管显示)
1.Uv2 2KB
超声波显示.OBJ 8KB
1.lnp 43B
超声波显示.C 6KB
1 7KB
1_Opt.Bak 985B
超声波显示.LST 10KB
1.plg 223B
1.M51 10KB
1.Opt 987B
1.hex 1KB
beep.c 432B
ds18b20.LST 5KB
delay.h 186B
DS1302+S51时钟+温度显示
DS1302clock.OBJ 36KB
DS1302clock.C 18KB
DS1302clock.LST 30KB
shizhong.lnp 36B
shizhong 32KB
shizhong.plg 364B
shizhong.Uv2 2KB
shizhong.M51 36KB
shizhong.hex 8KB
shizhong.Opt 2KB
ds18b20.OBJ 6KB
motor.OBJ 4KB
beep.h 127B
main.h 0B
超声波_Opt.Bak 3KB
LCD1602.OBJ 5KB
ultrasonic.c 0B
ultrasonic.LST 836B
delay.OBJ 2KB
超声波.plg 208B
ds18b20.h 293B
ultrasonic.h 0B
beep.OBJ 2KB
超声波_Uv2.Bak 2KB
共 78 条
- 1
资源评论
yutianku
- 粉丝: 4
- 资源: 10
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功