#include                  //调用单片机头文件

#define uchar unsigned char  //无符号字符型 宏定义        变量范围0~255

#define uint  unsigned int         //无符号整型 宏定义        变量范围0~65535

uchar t1_num,t2_num;   //计时间中断的次数

unsigned long speed1,juli,time2;

float f_hz        ,speed_km,speed_m;  //dlaout time1        ,speed_km,speed_m;

uchar TH11,TL11;

uchar flag_en;         //开始计算速度使能

uchar flag_stop_en;    //要确定车子是否停下了

uint juli_s;               //每秒走的距离

uint juli_z;           //总路程

float zhijing = 0.55;  //直径 0.55M

bit flag_1s = 1;           //1s

long zong_lc;          //总量程

uchar flag_200ms;

uint sudu;            //定义速度的变量

uint bj_sudu = 20;           //报警速度

//这三个引脚参考资料

sbit rs=P2^6;               //寄存器选择信号 H:数据寄存器          L:指令寄存器

sbit rw=P2^5;               //寄存器选择信号 H:数据寄存器          L:指令寄存器

sbit e =P2^7;               //片选信号   下降沿触发

uchar code table_num[]="0123456789abcdefg";

uchar i;

sbit beep = P1^5;   //蜂鸣器IO口定义

/******************1ms 延时函数*******************/

void delay_1ms(uint q)

{

uint i,j;

for(i=0;i

for(j=0;j<120;j++);

}

/********************************************************************

* 名称 : delay_uint()

* 功能 : 小延时。

* 输入 : 无

* 输出 : 无

***********************************************************************/

void delay_uint(uint q)

{

while(q--);

}

/********************************************************************

* 名称 : write_com(uchar com)

* 功能 : 1602命令函数

* 输入 : 输入的命令值

* 输出 : 无

***********************************************************************/

void write_com(uchar com)

{

i=0;

e=0;

rs=0;

rw=0;

P0=com;

delay_uint(25);

e=1;

delay_uint(50);

e=0;

}

/********************************************************************

* 名称 : write_data(uchar dat)

* 功能 : 1602写数据函数

* 输入 : 需要写入1602的数据

* 输出 : 无

***********************************************************************/

void write_data(uchar dat)

{

i=0;

e=0;

rs=1;

rw=0;

P0=dat;

delay_uint(25);

e=1;

delay_uint(50);

e=0;

}

/********************************************************************

* 名称 : write_sfm2(uchar hang,uchar add,uchar date)

* 功能 : 显示2位十进制数,如果要让第一行,第五个字符开始显示"23" ,调用该函数如下

write_sfm1(1,5,23)

* 输入 : 行,列,需要输入1602的数据

* 输出 : 无

***********************************************************************/

void write_sfm2(uchar hang,uchar add,uint 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);

}

/********************************************************************

* 名称 : write_sfm4(uchar hang,uchar add,uchar date)

* 功能 : 显示2位十进制数,如果要让第一行,第五个字符开始显示"23" ,调用该函数如下

write_sfm1(1,5,23)

* 输入 : 行,列,需要输入1602的数据

* 输出 : 无

***********************************************************************/

void write_sfm4(uchar hang,uchar add,uint date)

{

if(hang==1)

write_com(0x80+add);

else

write_com(0x80+0x40+add);

write_data(0x31+date/100000%10);

write_data(0x33+date/10000%10);

write_data(0x36+date/1000%10);

write_data('.');

write_data(0x35+date/100%10);

write_data(0x33+date/10%10);

write_data(0x32+date%10);

write_data('k');

write_data('m');

}

/********************************************************************

* 名称 : write_string(uchar hang,uchar add,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 == '\0')  break;

write_data(*p);

p++;

}

}

/********************************************************************

* 名称 : init_1602()

* 功能 : 初始化1602液晶

* 输入 : 无

* 输出 : 无

***********************************************************************/

void init_1602()      //1602初始化

{

write_com(0x38);

write_com(0x0c);

write_com(0x06);

delay_uint(1000);

write_string(1,0,"sd:00km/h       ");

write_string(2,0,"lc:00.00km      ");

}

/***********外部中断0初始化程序****************/

void init_int0()

{

EX0=1;                          //允许外部中断0中断

EA=1;                           //开总中断

IT0 = 1;                   //外部中断0负跳变中断

}

/*************定时器0初始化程序***************/

void time_init()          //定时器0初始化程序

{

EA   = 1;                   //开总中断

TMOD = 0X11;          //定时器0、工作方式1

ET0  = 1;                  //开定时器0中断

TR0  = 1;                  //允许定时器0定时

ET1  = 1;                  //开定时器1中断

TR1  = 1;                  //允许定时器1定时

}

/***********计算速度函数**************/

void menu_speed()          //计算速度函数

{

static uchar value,value1;

if(flag_1s == 1)

{

flag_1s = 0;

if(flag_en == 0)

{

value ++;

if(value >= 3)        //2秒

{

speed_km = 0;  //速度为0

sudu = (uint)speed_km;

value = 0;

}

}

if((flag_en == 1))

{

value = 0;

flag_en = 0;

//1s = 1 / 1000000us;          // 1m/s=0.001km除以1/3600h=3.6km/h

f_hz = 1000000 / (t2_num * 65536.0 + TH11 * 256 + TL11);  //算出来就是秒

t2_num = 0;        //把变量清零

TH11 = 0;

TL11 = 0;

speed_m = f_hz * zhijing * 3.14  ;        //算出来的是m/s

juli_z = (juli_z + (uint)speed_m) ;        //总路程m

speed_km = speed_m * 3.6 ;        //(带个小数点) km/s

sudu = (uint)speed_km;

if(sudu >= 99)

sudu = 99;

zong_lc += speed_m;

value1++;

if(value1 >= 20)

{

value1 = 0;

}

}

write_sfm2(1,3,sudu);

write_sfm4(2,3,juli_z);

}

}

/****************报警函数***************/

void clock_h_l()

{

static uchar value;

if((sudu >= bj_sudu))

{

value ++;  //消除实际距离在设定距离左右变化时的干扰

if(value > 5)

{

beep = ~beep;           //蜂鸣器报警

}

}

else

{

beep = 1;

}

}

/******************主程序**********************/

void main()

{

beep = 0;

delay_1ms(200) ;

P0 = P1 = P2 = P3 = 0xff;  //IO口初始为电平

init_1602();      //1602初始化

init_int0();

time_init();          //定时器0初始化程序

while(1)

{

if(flag_200ms == 1)

{

flag_200ms = 0;

menu_speed();          //计算速度函数

clock_h_l();        //报警函数

}

}

}

/*********************外部中断0中断服务程序************************/

void int0() interrupt 0

{

static uchar value;

switch(value)

{

case 0:

t1_num = 0;                 //第一次就把变量清零

TH1 = 0;

TL1 = 0;

break;

case 1:

t2_num = t1_num;  //保存

TH11 = TH1;

TL11 = TL1;

flag_en = 1;

break;

}

value ++;

if(value >= 2)

value =0;

/************

2.1   16.6

2          15.8

1.9   15.0

************/

}

/*************定时器0中断服务程序***************/

void time0_int() interrupt 1

{

static uchar value;

TH0 = 0x3c;

TL0 = 0xb0;     // 50ms

value++;

if(value % 4 == 0)

flag_200ms = 1;

if(value >= 20)  //1秒   才是一秒钟的速度

{

value = 0;

flag_1s = 1;

}

}

/*************定时器1中断服务程序***************/

void time1_int() interrupt 3

{

t1_num++;

}

单片机断电记忆方法C语言,怎样使单片机程序断电保留上次的数据?相关推荐

  1. 单片机断电记忆方法C语言,单片机实现具有掉电记忆功能的计时器

    #define uchar unsigned char #define uint unsigned int /*IIC总线端口定义*/ sbit SDA = P2^0; sbit SCL = P2^1 ...

  2. 易语言遍历两个数组成员保留不重复数据

    比较两个一维数组里的成员,保留不重复的数组成员,封装了一个去数组重复成员的模块. 数组比较模块源码 .版本 2.子程序 数组比较 .参数 arrA, 整数型, 数组 .参数 arrB, 整数型, 数组 ...

  3. 基于单片机的倒车雷达系统设计c语言,基于AT89C2051单片机实现超声波倒车雷达系统的设计...

    描述 倒车雷达(Car Reversing Aid Systems)的全称是"倒车防撞雷达",也称"泊车辅助装置",是汽车泊车安全辅助装置,能以声音或者更为直观 ...

  4. 单片机51测温度c语言,基于51单片机的温度检测及显示设计

    2.2 软件设计 用C语言进行单片机程序设计,采用结构化程序设计思想:在总体设计中采用"自顶而下"(TOP-DOWN)的方法,在程序设计中采用模块化编程.把整体任务分成一个个子任务 ...

  5. 单片机检测电机频率c语言,基于51单片机的电动机测速表的设计.doc

    基于51单片机的电动机测速表的设计 基于51单片机的电动机测速表设计 摘 要 本文介绍了采用光电传感器实施电机转速测量的方法.基本原理,完成了一种基于AT89C51单片机平台的电动机测速表的软硬件设计 ...

  6. 用单片机c51电子秤的c语言,基于51单片机的电子秤系统设计

    微机原理论文第八篇:基于51单片机的电子秤系统设计 摘要:本文主要分析51单片机下的数字电子秤.在设计过程中,这种电子秤具体包括电源.传感器.蓝牙.转换器.单片机.键盘.开关.显示器等组成部分,在实践 ...

  7. 单片机常见加密方法有哪些?如何对单片机进行解密?

    为增进大家对单片机的认识,本文将对单片机的常见加密方法以及单片机解密方法予以介绍. 单片机可以说是一个小型计算机,通过单片机,可以开发出来很多有意思的东西.为增进大家对单片机的认识,本文将对单片机的常 ...

  8. 51单片机dds信号发生器 扫频 c语言,基于AT89C51单片机和DDS器件实现频率特征测试仪的设计...

    1. 引 言 频率特性是一个系统(或元件)对不同频率正弦输入信号的响应特性.如图1所示,被测系统输入幅值为Ar.角频率为ω的正弦信号,如果该系统是线性的,则其稳态输出也是正弦信号,频率ω不变,幅值为A ...

  9. 51单片机节日彩灯控制c语言,采用AT89C51单片机设计的可编程彩灯控制

    本文介绍一种采用单片机设计的可编程彩灯控制器,使用者布置好彩灯接好线路后不需要改变接线,就可以按自己的要求编入各路彩灯的亮灭顺序和延时时间,随时改变显示花样,可配合各种字符.图案,增加艺术效果,也可用 ...

最新文章

  1. 编译器扩展SEH(2)
  2. P4245 【模板】任意模数多项式乘法(NTT)
  3. 集合练习:登录注册功能
  4. “SQL 被低估了!”
  5. 2019西电网安实验班选拔考试
  6. 我的内容管理系统(CMS)寻找历程 -- Mambo出鞘,谁与争锋?
  7. Python 字符串与二进制串的相互转换
  8. System学习笔记004---Windows系统中hosts文件的作用_Zookeeper在SpringBoot中报错需要配置一下这个文件
  9. Spring管理Hibernate
  10. Vue实现一个按钮切换显示不同的div内容
  11. 最近完成的一个可伸缩性的WEB开发框架
  12. [存]超酷JS拖拽翻页效果
  13. Python3入门精通基础教程(合集)
  14. Mysql中key 、primary key
  15. click事件修改css_CSS Click事件
  16. git push如何强制提交
  17. 计时+事件倒计时网页源码分享
  18. ubuntu配置静态ip的方法
  19. 移动医疗应用遍地开花,却抓不住用户的核心需求
  20. [慎用] Windows10 第三方磁盘管理工具

热门文章

  1. PMI-ACP考试如何办理紧急缓考?
  2. c语言初阶(2-函数-上篇)
  3. 乐吾乐2D可视化为智慧电力赋能(二)
  4. 安装软件时,“Windows Installer Coordinator”一直循环
  5. 安卓控件 - 列表视图
  6. U盘容量会“缩水”当心文件丢失
  7. Windows Media Player 无法播放
  8. 选择适合的Silverlight通信技术
  9. 比例运算电路小结(电路组态 输入电阻)
  10. VBA字符串操作:从右向左截取特定分隔符后的内容