请问一个只有两个定时器的单片机定时器初值计算怎么控制两个以上的汽缸,先后运动。

网站已改版,请使用新地址访问:
fengmingqi 同时用两个定时器控制蜂鸣器发声,
0 频率, 1 同个
持续的时 SCM 单片机开发 238万源代码下载- www.pudn.com
&文件名称: fengmingqi
& & & & &&]
&&所属分类:
&&开发工具: C-C++
&&文件大小: 1 KB
&&上传时间:
&&下载次数: 10
&&提 供 者:
&详细说明:同时用两个定时器控制蜂鸣器发声,
定时器0控制频率,定时器1控制同个
频率持续的时间,间隔2s依次输出
1,10,50,100,200,400,800,
1k(hz)的方波?
设晶振频率为12MHz。-At the same time the buzzer sound with two timers, Timer 0 control the frequency of Timer 1 control with a frequency, duration, interval 2s turn out 1,10,50,100,200,400,800, 1k (hz) square wave? set crystal frequency 12MHz.
文件列表(点击判断是否您需要的文件,如果是垃圾请在下面评价投诉):
&&fengmingqi.txt
&输入关键字,在本站238万海量源码库中尽情搜索:
&[] - 利用动态扫描和定时器1在数码管上显示出从765432开始以1/10的速度往下递减到765398并保持住此数,与此同时利用定时器0以500Ms进行流水灯从上至下移动,当数码管上数减到停止时,实验板上流水灯也停止然后全部开始闪烁,3秒后(用T0定时)流水灯全部关闭,数码管上显示“HELLO",到此停止住
&[] - 基于80C51单片机的定时器应用程序。本程序实现的功能为:同时用两个定时器控制蜂鸣器发声,定时器0控制频率,定时器1控制同个频率持续的时间,间隔300ms依次输出1,10,50,100,200,400,800,
1k(hz)的方波
&[] - 基于80C51单片机的定时器应用程序。本程序实现的功能为:同时用两个定时器控制蜂鸣器发声,定时器0控制频率,定时器1控制同个频率持续的时间,间隔300ms依次输出1,10,50,100,200,400,800,
1k(hz)的方波技术小站:
& 在线直播
时间:5月29日 10:00 - 11:30
& 在线直播
时间:6月13日 10:00 - 11:30
& 在线直播
时间:7月11日 10:00 - 11:30
& 地点:深圳
时间:5月24日 9:00 - 18:00
张飞电子工程师速成全集
10天掌握PCB AD画板
教你高速PCB项目整体设计
如何设计STM32单片机系统?
物联网操作系统从写到用
讲师:华清远见
讲师:林超文
讲师:郑振宇
讲师:李述铜
移入鼠标可放大二维码
52单片机有几个定时器?52单片机定时器1和52单片机定时器2程序对比 - 全文
来源:电子发烧友网整理 作者:日 14:30
[导读] 52单片机有几个定时器?STC89C52RC其实是有三个定时器的单片机,STC89C52RC共有3个定时器,分别是T0、T1、T2。而51单片机只有T0,T1 两个定时器。下文将详细把52单片机定时器1和52单片机定时器2程序对比分析。
  52单片机有几个定时器?
  STC89C52RC是有三个定时器的单片机,STC89C52RC共有3个定时器,分别是T0、T1、T2。
  而51单片机只有T0,T1 两个定时器。
  52单片机的默认(此时的IP寄存器不做设置)中断优先级为:
  外部中断0 & 定时/计数器0 & 外部中断1& 定时/计数器1 & 定时/计数器2 & 串行中断;
  而在做定时则用一般采用16位模式,也就是TMOD=0x11(10或01单独一个定时器的话),初值的计算是这样的:
  假设时间是X毫秒,晶振为YMhz,那么:
  THn=(*X*Y/12)/256
  TLn=(*X*Y/12)%256
  之后就是TRn=1(开启定时器)
  ETn=1(开启定时器中断)
  下面我们给大家分享一下52单片机定时器0、52单片机定时器1和52单片机定时器2的各自程序。
  STC89C52单片机定时器0的中断实验
  //////////////////////////////////////////////////////////////////////////
  实现功能: 配置定时器0的相关寄存器,使其实现定时器中断功能,然后通过发光
  二极管的闪烁展现出中断的进行
  实验板型号:BS-XYD-C52
  实验名称: 定时器0的中断实验
  //////////////////////////////////////////////////////////////////////////
  #include《reg52.h》
  #define uchar unsigned char //定义unsigned char 为 uchar
  #define uint unsigned int //定义unsigned int 为 uint
  sbit Led=P1^0; //将P1^0口定义为led,方便程序编写
  //////////////////////////////////////////////////////////////////////////
  函数名称:Init_me0
  函数功能:配置定时器0,配置的模式是定时器0采用16位计数器模式,同时允许定时器0
  中断,并打开总中断
  参数介绍:无
  返回值: 无
  注意事项:无
  //////////////////////////////////////////////////////////////////////////
  void Init_me0(void)
  TMOD |= 0x01;
  TH0=0x00;
  TL0=0x00; //定时器0的,写入数值寄存器的低8位
  EA=1; //总中断打开
  ET0=1; //定时器T0允许中断
  TR0=1; //定时器T0开始工作
  //////////////////////////////////////////////////////////////////////////
  函数名称:main
  函数功能:实现定时器0中断,且通过名为D1的发光二级管展现出来
  参数介绍:无
  返回值: 无
  注意事项:无
  //////////////////////////////////////////////////////////////////////////
  void main()
  Init_me0(); //初始化定时器0
  while(1);
  //////////////////////////////////////////////////////////////////////////
  函数名称:Interrupt_handler_me0
  函数功能:重新给寄存器TH0和TL0赋值,并且让开发板上的名为D1的发光二级管,每次
  取相反的值,使其不断地闪烁,也达到测试定时器0中断的效果
  参数介绍:无
  返回值: 无
  注意事项:无
  //////////////////////////////////////////////////////////////////////////
  void Interrupt_handler_time0(void) interrupt 1
  TH0=0x00; //重新赋值
  TL0=0x00;
  Led=~L //指示灯反相,可以看到闪烁。& ~ &按位取反运算符
  STC89C52单片机定时器1实现计数器的程序
  ///////////////////////////////////////////////////////////////////////////
  实现功能: 配置定时器1的相关寄存器,使其实现定时器中断功能,然后通过在数码管显示
  实验板型号:BS-XYD-C52
  实验名称: 定时器1实现计数器
  ///////////////////////////////////////////////////////////////////////////
  #include《reg52.h》
  #define uchar unsigned char //定义unsigned char 为 uchar
  #define uint unsigned int //定义unsigned int 为 uint
  uchar cTime_10ms_ //中断次数计数单元
  uchar cTime_1s_ //判断是否为1s的变量
  uchar uDis_buff[2]; //显示缓冲区,存放要显示的2个字符的段码值
  uchar cT //秒计数单元
  #define Time_1s_Sign 100 //根据中断周期,判断是否到一秒的标志
  sbit Duan=P2^6; //定义数码管的段选使能端
  sbit Wei =P2^7; //定义数码管的位选使能端
  #define Digital_tube_Wei_Enable Wei=1; //开启控制数码管的位选使能端
  #define Digital_tube_Wei_Disable Wei=0; //关闭控制数码管的位选使能端
  #define Digital_tube_Duan_Enable Duan=1; //开启控制数码管的段选使能端
  #define Digital_tube_Duan_Disable Duan=0; //关闭控制数码管的段选使能端
  #define Digital_tube_Duan P0 //定义数码管数据端口
  uchar code Dis_table[]= //将BCD码转换成数码管扫描码的数组
  {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00};
  uchar code Dis_Position[]= //定义数码管位选的数组
  {0x3e,0x3d,0x3b,0x37,0x1f,0x2f};
  ///////////////////////////////////////////////////////////////////////////
  函数名称:毫秒延时函数
  函数功能:实现毫秒级的延时
  参数介绍:Delay_MS: 定义需要延时的毫秒的数值
  iNumber: 记录Delay_MS的数值,以for语句实现所要求的延时
  iValue: 要延时毫秒所要进行的循环数值,本数值为实际测得
  返回值: 无
  注意事项:本实验是在所用晶振为12M的前提下实现的毫秒延时,本函数是通过循环的形
  式完成,所以如果改变了晶振的频率,请做相应的改变
  ///////////////////////////////////////////////////////////////////////////
  void DelayMs(uint Delay_MS)
  uint iNumber,iV
  for(iNumber=0;iNumber《Delay_MS;iNumber++) //用for语句实现单片机的延时
  iValue=107; //107这个数值是通过测定而得
  while(iValue--);
  ///////////////////////////////////////////////////////////////////////////
  函数名称:One_DigitalTube_display
  函数功能:完成在实验板上数码管指定显示,即在特定的数码管上显示特定的数字,比
  在第一个数码管上显示0
  参数介绍:uData:要显示的数字的BCD码数组
  uNumber:选择哪个数码管显示,即让某个特定数码管显示
  返回值: 无
  注意事项:实验板上的数码管是共阴极的数码管,如果使用共阳极的数码管,请注意不
  要弄反了
  ///////////////////////////////////////////////////////////////////////////
  void One_DigitalTube_display(uchar uData,uchar uNumber)
  Digital_tube_Duan_E //使能数码管的段选
  Digital_tube_Duan=Dis_table[uData];//输入所要显示的数值
  Digital_tube_Duan_D //关闭数码管的段选
  Digital_tube_Duan=Dis_Position[uNumber]; //点亮特定的数码管
  Digital_tube_Wei_E //使能数码管的位选
  Digital_tube_Wei_D //关闭数码管的位选
  DelayMs(5); //调整时序,以实现稳定显示
  ///////////////////////////////////////////////////////////////////////////
  函数名称:Time_to_disbuffer
  函数功能:把要在数码管上显示的数值,进行取余、取整,即对数值进行分割,这样以
  便显示在分离的数码管
  参数介绍:无
  返回值: 无
  注意事项:无
  ///////////////////////////////////////////////////////////////////////////
  void Time_to_disbuffer()
  uDis_buff[1]=cT //对cTime的数值取余,即就是取cTime的个位
  uDis_buff[0]=cTime/10; //对cTime的数值取整,即就是取cTime的十位
  ///////////////////////////////////////////////////////////////////////////
  函数名称:Init_time1
  函数功能:配置定时器1,配置的模式是定时器1采用16位定时器模式,在定时器1的输入
  数值寄存器输入特定的数值,使其每次中断的周期为10ms,同时允许定时器1
  中断,并打开总中断
  参数介绍:无
  返回值: 无
  注意事项:无
  ///////////////////////////////////////////////////////////////////////////
  void Init_time1(void)
  TMOD |= 0x10;
  TH1=()/256;
  TL1=()%6; //定时器0的,写入数值寄存器的低8位
  EA=1; //总中断打开
  ET1=1; //定时器T0允许中断
  TR1=1; //定时器T0开始工作
  ///////////////////////////////////////////////////////////////////////////
  函数名称:Timer_Display
  函数功能:把显示缓冲区的数值显示在数码管上
  参数介绍:cNumber:记录for语句的循环次数
  返回值: 无
  注意事项:无
  ///////////////////////////////////////////////////////////////////////////
  void Timer_Display()
  uchar cN
  for(cNumber=0;cNumber《2;cNumber++)
  One_DigitalTube_display(uDis_buff[cNumber],cNumber);
  DelayMs(2);
  ///////////////////////////////////////////////////////////////////////////
  函数名称:main
  函数功能:利用定时器1中断,在数码管上实现以一分钟为周期的计数器
  参数介绍:无
  返回值: 无
  注意事项:无
  ///////////////////////////////////////////////////////////////////////////
  void main()
  Init_time1(); //初始化定时器1
  cTime=0;
  while(1)
  if(cTime_1s_ok)
  cTime_1s_ok=0;
  if(++cTime》=60) //每次自加一,同时判断是否到1分钟
  cTime=0;
  Time_to_disbuffer(); //新调整好的时间送入显示缓冲区
  Timer_Display(); //更新显示内容
  ///////////////////////////////////////////////////////////////////////////
  函数名称:Interrupt_handler_time1
  函数功能:重新给寄存器TH1和TL1赋值,判断是否到达一秒,如果到一秒了,把相应的
  变量赋予正值,以方便其他的程序编写
  参数介绍:无
  返回值: 无
  注意事项:无
  ///////////////////////////////////////////////////////////////////////////
  void Interrupt_handler_time1(void) interrupt 3
  TH1=()/256;//定时10毫秒
  TL1=()%6;
  cTime_10ms_counter++;
  if(cTime_10ms_counter==Time_1s_Sign) //判断是否到达一秒
  cTime_10ms_counter=0;
  cTime_1s_ok=1;
  STC89C52单片机的定时器2的实现时钟的程序
  ////////////////////////////////////////////////////////////////////////
  实现功能: 配置定时器2的相关寄存器,使其实现定时器中断功能,然后根据中断
  的周期频率实现准确的时钟系统,在数码管上显示实现
  实验板型号:BS-XYD-C52
  实验名称: 定时器2实现时钟系统
  /////////////////////////////////////////////////////////////////////////
  #include《reg52.h》
  #define uchar unsigned char //定义unsigned char 为 uchar
  #define uint unsigned int //定义unsigned int 为 uint
  uchar cTime_10ms_ //中断次数计数单元
  uchar cTime_1s_ //判断是否为1s的变量
  uchar uDis_buff[6]; //显示缓冲区,存放要显示的6个字符的段码值
  uchar cTime[3]; //时、分、秒计数单元
  #define Time_1s_Sign 100 //根据中断周期,判断是否到一秒的标志
  sbit led=P1^0;
  sbit Duan=P2^6; //定义数码管的段选使能端
  sbit Wei =P2^7; //定义数码管的位选使能端
  #define Digital_tube_Wei_Enable Wei=1; //开启控制数码管的位选使能端
  #define Digital_tube_Wei_Disable Wei=0; //关闭控制数码管的位选使能端
  #define Digital_tube_Duan_Enable Duan=1; //开启控制数码管的段选使能端
  #define Digital_tube_Duan_Disable Duan=0; //关闭控制数码管的段选使能端
  #define Digital_tube_Duan P0 //定义数码管数据端口
  uchar code Dis_table[]= //将BCD码转换成数码管扫描码的数组
  {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00};
  uchar code Dis_Position[]= //定义数码管位选的数组
  {0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
  /////////////////////////////////////////////////////////////////////////
  函数名称:毫秒延时函数
  函数功能:实现毫秒级的延时
  参数介绍:Delay_MS: 定义需要延时的毫秒的数值
  iNumber: 记录Delay_MS的数值,以for语句实现所要求的延时
  iValue: 要延时毫秒所要进行的循环数值,本数值为实际测得
  返回值: 无
  注意事项:本实验是在所用晶振为12M的前提下实现的毫秒延时,本函数是通过循环的形
  式完成,所以如果改变了晶振的频率,请做相应的改变
  /////////////////////////////////////////////////////////////////////////
  void DelayMs(uint Delay_MS)
  uint iNumber,iV
  for(iNumber=0;iNumber《Delay_MS;iNumber++) //用for语句实现单片机的延时
  iValue=107; //107这个数值是通过测定而得
  while(iValue--);
  /////////////////////////////////////////////////////////////////////////
  函数名称:One_DigitalTube_display
  函数功能:完成在实验板上数码管指定显示,即在特定的数码管上显示特定的数字,比
  在第一个数码管上显示0
  参数介绍:cData:要显示的数字的BCD码数组
  cNumber:选择哪个数码管显示,即让某个特定数码管显示
  返回值: 无
  注意事项:实验板上的数码管是共阴极的数码管,如果使用共阳极的数码管,请注意不
  要弄反了
  /////////////////////////////////////////////////////////////////////////
  void One_DigitalTube_display(uchar cData,uchar cNumber)
  Digital_tube_Duan_E //使能数码管的段选
  Digital_tube_Duan=Dis_table[cData];//输入所要显示的数值
  Digital_tube_Duan_D //关闭数码管的段选
  Digital_tube_Wei_E //使能数码管的位选
  Digital_tube_Duan=Dis_Position[cNumber]; //点亮特定的数码管的公共端
  Digital_tube_Wei_D //关闭数码管的位选
  DelayMs(1); //调整时序,以实现稳定显示
  /////////////////////////////////////////////////////////////////////////
  函数名称:Time_to_disbuffer
  函数功能:把要在数码管上显示的数值,进行取余、取整,即对数值进行分割,这样以
  便显示在分离的数码管
  参数介绍:cNumber1: 记录时、分、秒计数单元数组的变量
  cNumber2:记录显示缓冲区数组的变量
  返回值: 无
  注意事项:无
  /////////////////////////////////////////////////////////////////////////
  void Time_to_disbuffer()
  uchar cNumber1,cNumber2=0;
  for(cNumber1=0;cNumber1《=2;cNumber1++)
  uDis_buff[cNumber2++]=cTime[cNumber1]/10; //对cTime的数值取整,即
  //就是取cTime的十位
  uDis_buff[cNumber2++]=cTime[cNumber1]; //对cTime的数值取余,即
  //就是取cTime的个位
  /////////////////////////////////////////////////////////////////////////
  函数名称:Init_time2
  函数功能:配置定时器2,配置的模式是定时器1采用16位定时器模式,在定时器1的输入
  数值寄存器输入特定的数值,使其每次中断的周期为10ms,同时允许定时器1
  中断,并打开总中断
  参数介绍:无
  返回值: 无
  注意事项:无
  /////////////////////////////////////////////////////////////////////////
  void Init_time1(void)
  TH2=()/256;
  TL2=()%6; //定时器0的,写入数值寄存器的低8位
  EA=1; //总中断打开
  ET2=1; //定时器T0允许中断
  TR2=1; //定时器T0开始工作
  /////////////////////////////////////////////////////////////////////////
  函数名称:Timer_Display
  函数功能:把显示缓冲区的数值显示在数码管上
  参数介绍:cNumber:记录for语句的循环次数
  返回值: 无
  注意事项:无
  /////////////////////////////////////////////////////////////////////////
  void Timer_Display()
  uchar cN
  for(cNumber=0;cNumber《6;cNumber++)
  One_DigitalTube_display(uDis_buff[cNumber],cNumber);
  if(cNumber==1|cNumber==3)
  Digital_tube_Duan_E //使能数码管的段选
  Digital_tube_Duan=0x80; //输入所要显示的数值
  Digital_tube_Duan_D //关闭数码管的段选
  Digital_tube_Wei_E //使能数码管的位选
  Digital_tube_Duan=Dis_Position[cNumber]; //点亮特定的数码管的公共端
  Digital_tube_Wei_D //关闭数码管的位选
  DelayMs(1);
  /////////////////////////////////////////////////////////////////////////
  函数名称:main
  函数功能:利用定时器2中断,实现准确的时钟系统,然后在数码管上显示实现
  参数介绍:无
  返回值: 无
  注意事项:无
  /////////////////////////////////////////////////////////////////////////
  void main()
  Init_time1(); //初始化定时器1
  cTime[0]=23,cTime[1]=58,cTime[2]=58;
  Time_to_disbuffer(); //把预设时间送入显示缓冲区
  while(1)
  if(cTime_1s_ok) //判断是否到1秒了
  cTime_1s_ok=0;
  if(++cTime[2]》=60) //每次自加一,同时判断是否到1分钟
  cTime[2]=0;
  if(++cTime[1]》=60) //每次自加一,同时判断是否到1小时了
  cTime[1]=0;
  if(++cTime[0]》=24) //每次自加一,同时判断是否到24点了
  cTime[0]=0;
  Time_to_disbuffer(); //新调整好的时间送入显示缓冲区
  Timer_Display(); //更新显示内容
  /////////////////////////////////////////////////////////////////////////
  函数名称:Interrupt_handler_time2
  函数功能:重新给寄存器TH2和TL2赋值,判断是否到达一秒,如果到一秒了,把相应的
  变量赋予正值,以方便其他的程序编写
  参数介绍:无
  返回值: 无
  注意事项:无
  /////////////////////////////////////////////////////////////////////////
  void Interrupt_handler_time2(void) interrupt 5
  TF2=0;
  TH2=()/256;//定时10毫秒
  TL2=()%6;
  cTime_10ms_counter++;
  if(cTime_10ms_counter==Time_1s_Sign) //判断是否到达一秒
  cTime_10ms_counter=0;
  cTime_1s_ok=1;
关注电子发烧友微信
有趣有料的资讯及技术干货
下载发烧友APP
打造属于您的人脉电子圈
关注发烧友课堂
锁定最新课程活动及技术直播
声明:电子发烧友网转载作品均尽可能注明出处,该作品所有人的一切权利均不因本站而转移。
作者如不同意转载,既请通知本站予以删除或改正。转载的作品可能在标题或内容上或许有所改动。
52单片机相关文章
52单片机相关下载
定时器相关文章
定时器相关下载
论坛精华干货
供应链服务
版权所有 (C) 深圳华强聚丰电子科技有限公司
电信与信息服务业务经营许可证:粤B2-后使用快捷导航没有帐号?
请完成以下验证码
查看: 5225|回复: 8
关于两个单片机的串口通信问题
在线时间4 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 30, 距离下一级还需 170 积分
一粒金砂(中级), 积分 30, 距离下一级还需 170 积分
大家好,我是新手,有个问题想请教大家。两个单片机U1(下图左边)和U2(下图右边),都要有收发功能,一个单片机U1根据自己接口的按键,给另一个单片机U2发送控制数据,U2根据收到的数据控制与其相连的的LED亮灭,U2也会根据与自身相连的按键,发送出数据给单片机U1,控制与U1相连数码管的字符显示。下面是代码和原理图,仿真不通过,不知道错在哪里,求高手指导一下。
am2nnc0ntnc1v.png.thumb.jpg.png (136.47 KB, 下载次数: 2)
19:01 上传
这里是代码,分别是U1和U2的://U1
#include
sbit K1=P1^0;
sbit K2=P1^1;
sbit K3=P1^2;
//transmitted byte,所发送的字节
//received byte,所接收的字节
void delay(unsigned int i)
{
& && &&&unsigned int m,n;
& && &&&for(m=i;m>0;m--)
& && &&&for(n=125;n>0;n--);
}
void main()
{& && && && && &
& && &&&EA=1;//全局中断开
& && &&&ES=1;//串口中断开
& && &&&ET1=1;//计时器1中断开
& && &&&TMOD=0x20;//计时器1工作方式2
& && &&&TH1=0//波特率9600
& && &&&TL1=0
& && &&&SCON=0x50;//串口初始化方式1,REN=1,允许接收
& && &&&PCON=0x00;//SMOD=0,波特率不倍增
& && &&&TR1=1;//打开计时器1
& && &&&//tb=0x00;
& && &&&while(1)
& && &&&{
& && && && && & REN=0;
& && && && && & //发送
& && && && && & if(K1==0)
& && && && && & {
& && && && && && && && &delay(50);
& && && && && && && && &if(K1==0)
& && && && && && && && && && &&&tb=0
& && && && && & }
& && && && && & if(K2==0)
& && && && && & {
& && && && && && && && &delay(50);
& && && && && && && && &if(K2==0)
& && && && && && && && && && &&&tb=0x7f;
& && && && && & }
& && && && && & if(K3==0)
& && && && && & {
& && && && && && && && &delay(50);
& && && && && && && && &if(K3==0)
& && && && && && && && && && &&&tb=0
& && && && && & }
& && && && && && && && && && && && && &
& && && && && & SBUF=
& && && && && & while(TI==0);
& && && && && & TI=0;
& && && && && && && && && && &&&
& && && && && & //接收
& && && && && & REN=1;
& && && && && & rb=SBUF;
& && && && && & while(RI==0);
& && && && && & RI=0;
& && && && && & P2=
& && && && && & REN=0;& && && && && &
& && &&&}& && && && && && && && && && &&&
}
复制代码这个是U2的://U2
#include
//定义共阴极七段码管的数字0~F,以及小数点、空白、全显示
#define SEG0 0x3f
#define SEG1 0x06
#define SEG2 0x5b
#define SEG3 0x4f
#define SEG4 0x66
#define SEG5 0x6d
#define SEG6 0x7d
#define SEG7 0x07
#define SEG8 0x7f
#define SEG9 0x6f
unsigned char digits[]={SEG0,SEG1,SEG2,SEG3,SEG4,SEG5,SEG6,SEG7,SEG8,SEG9};
sbit K4=P1^0;
void main()
{& && &&&
& && &&&EA=1;//全局中断开
& && &&&ES=1;//串口中断开
& && &&&ET1=1;//计时器1中断开
& && &&&TMOD=0x20;//计时器1工作方式2
& && &&&TH1=0//波特率9600
& && &&&TL1=0
& && &&&SCON=0x50;//串口初始化方式1,接收REN=1
& && &&&PCON=0x00;//SMOD=0,波特率不倍增
& && &&&TR1=1;//打开计时器1
& && &&&P2=0
& && &&&rb=0;
& && &&&while(1)
& && &&&{& && && && && &
& && && && && & //REN=0;
& && && && && &
& && && && && & //发送
& && && && && && && && && && &&&
& && && && && & if(K4==0)
& && && && && & {& && &&&
& && && && && && && && &delay(50);
& && && && && && && && &if(K4==0)
& && && && && && && && &{
& && && && && && && && && && &&&tb=(tb+1)%10;
& && && && && && && && && && &&&tb=digits[tb];& && && && && && && && &
& && && && && && && && && && &&&SBUF=
& && && && && && && && && && &&&while(TI==0);
& && && && && && && && && && &&&TI=0;
& && && && && && && && &}
& && && && && & }
& && && && && &
& && && && && & //接收
& && && && && & REN=1;
& && && && && & rb=SBUF;
& && && && && & while(RI==0);
& && && && && & RI=0;
& && && && && & P2=
& && && && && & REN=0;
& && &&&}& && &&&
}
复制代码
[ 本帖最后由 cdinten 于
19:01 编辑 ]
什么叫代码中显示不出来?
两个显示没有用延时子函数吧
单片机的串口通信有三条线 “RXD TXD GND ”
两个单片机的GND也要连在一起 为什么没有等待按键弹起的语句 定时器1开中断貌似没用啊
我就大概看了一下吧&
在线时间4 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 30, 距离下一级还需 170 积分
一粒金砂(中级), 积分 30, 距离下一级还需 170 积分
头文件包含是正确的,不知道为什么代码中显示不出来~~
在线时间9 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 30, 距离下一级还需 170 积分
一粒金砂(中级), 积分 30, 距离下一级还需 170 积分
回复 楼主cdinten 的帖子
什么叫代码中显示不出来?
两个显示没有用延时子函数吧
单片机的串口通信有三条线 “RXD TXD GND ”&&两个单片机的GND也要连在一起 为什么没有等待按键弹起的语句 定时器1开中断貌似没用啊
我就大概看了一下吧 我也是刚学的&&大家一起讨论讨论
那个代码中显示不出来,说的是我在帖子中贴出的代码,include后面的头文件包含莫名其妙地没有显示出来,不是仿真的时候数码管没有显示。另外,我的数码管是共阴的,接线不会有问题。你所说的共地问题在实际连接线路&
定时器1 是产生波特率用的&
在线时间2430 小时
芯币3826枚
E金币392枚
TA的帖子TA的资源
一粒金砂(高级), 积分 495, 距离下一级还需 5 积分
一粒金砂(高级), 积分 495, 距离下一级还需 5 积分
由于单片机速度快& &仿真以后两个单片机都进入了while(RI==0);中 形成了死循环& & 在按键子也就不起作用了(出了复位的)& &数码管不显示可能是共阴共阳的选错了& &
数码管的数组直接写到数组里就行& && & 实际中就像楼上说的的共地&&仿真估计就默认了
下面的是只是主机发送数据到从机的#include& &主机
#define duan P1
void main()
{
& & & &
& & & & unsigned char key=0
& & & & dis=0x00;
& & & & duan=0
& & & & TMOD=0x20;
& & & & TH1=0
& & & & TL0=0
& & & & EA=1;
& & & & TR1=1;
& & & & SCON=0x50;
& & & & PCON=0x00;
& & & & ES=1;
& & & & while(1)
& & & & {
& & & & & & & & if(key!=duan)
& & & & & & & & {
& & & & & & & & & & & & key=
& & & & & & & & & & & & SBUF=
& & & & & & & & & & & & while(!TI);
& & & & & & & & & & & & TI=0;
& & & & & & & & }
& & & & & & & & & & & && &
& & & & }
}复制代码#include//从机
sbit leden=P1^2;
sbit wei=P1^1;
sbit line=P1^3;
sbit lcd_en=P1^7;
void main()
{
& & & &
& & & & lcd_en=0;
& & & & P0=0X00;
& & & & line=0;
& & & & P0=0
& & & & wei=0;
& & & & leden=1;
& & & & P2=0XF0;
& & & & TMOD=0x20;
& & & & TH1=0
& & & & TL1=0
& & & & EA=1;
& & & & ET1=1;
& & & & TR1=1;
& & & & SCON=0x50;
& & & & ES=1;
& & & & while(1)
& & & & {
& &&&
& & & && & for(i=6553;i>0;i--);& & & & & & & &
& & & & }
}
void chuankou() interrupt 4
{
& & & & P2=SBUF;
& & & & RI=0;
}复制代码
你给的演示代码我知道,但是只能从U1发送给U2,要求是U2也能给U1相互发送消息,不知道如何处理。&
在线时间2430 小时
芯币3826枚
E金币392枚
TA的帖子TA的资源
一粒金砂(高级), 积分 495, 距离下一级还需 5 积分
一粒金砂(高级), 积分 495, 距离下一级还需 5 积分
回复 板凳zhudabin 的帖子
定时器1 是产生波特率用的
在线时间4 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 30, 距离下一级还需 170 积分
一粒金砂(中级), 积分 30, 距离下一级还需 170 积分
回复 4楼ddlxiaoxu 的帖子
你给的演示代码我知道,但是只能从U1发送给U2,要求是U2也能给U1相互发送消息,不知道如何处理。
两个结合到一起就行了
主机从机都用
#define uchar unsigned char
#define uint unsigned int
#define duan P1
#define dis
void main()
uchar key_in=0
//I/O口作输入时,检测外设状&
在线时间4 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 30, 距离下一级还需 170 积分
一粒金砂(中级), 积分 30, 距离下一级还需 170 积分
回复 板凳zhudabin 的帖子
那个代码中显示不出来,说的是我在帖子中贴出的代码,include后面的头文件包含莫名其妙地没有显示出来,不是仿真的时候数码管没有显示。另外,我的数码管是共阴的,接线不会有问题。你所说的共地问题在实际连接线路的时候确实要连在一起,但是在protues中可以分开连接。
在线时间2430 小时
芯币3826枚
E金币392枚
TA的帖子TA的资源
一粒金砂(高级), 积分 495, 距离下一级还需 5 积分
一粒金砂(高级), 积分 495, 距离下一级还需 5 积分
回复 6楼cdinten 的帖子
两个结合到一起就行了
主机从机都用
#include&reg51.h&
#define uchar unsigned char
#define uint unsigned int
#define duan P1
#define dis&&P2
void main()
& & & & uchar key_in=0&&//I/O口作输入时,检测外设状态,允许输出高电平
& & & & TMOD=0x20;& && & & & //设置为定时器1方式2
& & & & TH1=0& & & &&&& & & & //装初值,波特率设为9600
& & & & TL1=0X
& & & & EA=1;& & & & & & & &&&& & & & //开总中断
& & & & ET1=1;& & & & & & & &&&& & & & //允许定时器1中断
& & & & TR1=1;& & & & & & & &&&& & & & //开启定时器1中断
& & & & SCON=0x50;& & & &&&& & & & //串口控制寄存器设置,方式1、开串口接收。SM0=0;SM1=1;REN=1;
& & & & ES=1;& & & & & & & &&&& & & & //开串口中断
& & & & while(1)
& & & & {& & & & & & & &
& & & && && & & & if(key_in != duan)
& & & & & & & & {
& & & & & & & & & & & & key_in=
& & & & & & & & & & & & SBUF=key_& & & && & //发送数据
& & & & & & & & & & & & while(!TI); & & & && & //等待数据发送,由TI判断发送是否结束
& & & & & & & & & & & & TI=0;
& & & & & & & & }& & & &
void chuankou() interrupt 4& & & & //串口中断函数
& & & & dis=SBUF;& & & & & & & && && && && &//接收数据
& & & & RI=0;& & & & & & & && && && && && &//RI由软件清零;
谢谢,确实需要这样操作,一开始我也是想的用中断,但是我在中断中还去用while(RI==0);这样的语句去等待,估计是这里死循环了。现在测试没问题了,接下来是按键消抖的问题了,太感谢你了。&
在线时间4 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 30, 距离下一级还需 170 积分
一粒金砂(中级), 积分 30, 距离下一级还需 170 积分
回复 8楼ddlxiaoxu 的帖子
谢谢,确实需要这样操作,一开始我也是想的用中断,但是我在中断中还去用while(RI==0);这样的语句去等待,估计是这里死循环了。现在测试没问题了,接下来是按键消抖的问题了,太感谢你了。
EEWORLD 官方微信
Powered by

我要回帖

更多关于 单片机定时器中断程序 的文章

 

随机推荐