找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3502|回复: 3
打印 上一主题 下一主题
收起左侧

这是超声波测距的程序,在初始化定时器里为什么要清零啊

[复制链接]
跳转到指定楼层
楼主
ID:139175 发表于 2016-10-27 21:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

#include <STC89C5xRC.H>
#define uint unsigned int//宏定义unsigned int
#define uchar unsigned char//宏定义unsigned char
sbit echo=P3^2;//接收
sbit trig=P3^3;//发送
sbit led=P1^0;//蜂鸣器
sbit bw=P2^0;//百位
sbit sw=P2^1;//十位
sbit gw=P2^2;//个位
sbit sfw=P2^3;//十分位
uint timeh,timel,distance,time;
uchar bai,shi,ge,shifen;
bit flag;
uchar code list[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳极数码管不带小数点代码数组
uchar code listtwo[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//共阳极数码管带小数点代码数组
void delay(uint z)//延时z毫秒函数
{
uint x,y;
for(x=z;x>0;x--)
  for(y=123;y>0;y--);
}
void delay20us()//延时20微秒函数
{
uchar a;
for(a=7;a>0;a--);
}
void ini()//初始化函数
{
TMOD=0x01;//设置定时器0为16位定时器/计数器
TH0=0;//定时器0高8位清0
TL0=0;//定时器0低8位清0    65536   0.65s
flag=0;//中断标志位置0
trig=0;//trig信号置0
EA=0;//关闭总中断
ET0=0;//关闭定时器0中断
EX0=0;//关闭外部中断0中断
}
void display(distance)//显示函数
{
bai=distance/1000;//分离百位
shi=distance%1000/100;//分离十位
ge=distance%100/10;//分离个位
shifen=distance%10;//分离十分位
P0=list[bai];//发送百位代码
bw=0;//显示百位
delay(1);//延时1毫秒
bw=1;//消隐百位
P0=list[shi];//发送十位代码
sw=0;//显示十位
delay(1);//延时1毫秒
sw=1;//消隐十位
P0=listtwo[ge];//发送个位代码
gw=0;//显示个位
delay(1);//延时1毫秒
gw=1;//消隐个位
P0=list[shifen];//发送十分位代码
sfw=0;//显示十分位
delay(1);//延时1毫秒
sfw=1;//消隐十分位
}   
void main()//主函数
{
ini();//调用初始化函数  初始化定时器,关中断
while(1)//无限循环
{
  uchar i;
  echo=1;//接收端置1,准备接收echo信号
  trig=1;//发送trig信号
  delay20us();//延时20微秒
  trig=0;//发送trig信号完毕
  while(echo==0);//等待接收echo信号,如接收到echo信号则继续执行    为假则跳出while语句
  flag=0;//中断标志位置0
  TH0=0;//定时器0高8位清0
  TL0=0;//定时器0低8位清0
  EA=1;//打开总中断
  EX0=1;//打开外部中断0
  TR0=1;//打开定时器0
  for(i=1000;i>0;i--)//循环显示100次
  {
   display(distance);//调用显示函数
  }
  EA=0;//关闭总中断
  EX0=0;//关闭外部中断0中断
  TR0=0;//关闭定时器0
  if(flag==1)//如果进入中断
  {
   time=timeh*256+timel;//计算时间
   distance=time*0.172;//计算测定距离
  }
  else//否则
  {
   distance=0;//距离为0
  }
   if(distance<200)
   {
     led=0;
   }
   else
   {
     led=1;
   }
}
}
void ex0() interrupt 0//外部中断0中断函数
{
timeh=TH0;//把定时器0高8位装入timeh
timel=TL0;//把定时器0低8位装入timel
flag=1;//中断标志位置1
EX0=0;//关闭外部中断0中断
TR0=0;//关闭定时器0
}  




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:138155 发表于 2016-10-28 09:22 | 只看该作者

回帖奖励 +1

当然要清零了上电初始化 各寄存器 定时器都先清零 再初始赋值
回复

使用道具 举报

板凳
ID:144730 发表于 2016-10-28 09:35 | 只看该作者
不清零的话程序运行的时候可能会出错,为的是提高程序的可靠性
回复

使用道具 举报

地板
ID:144880 发表于 2016-10-28 10:28 | 只看该作者
学习编程好学吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表