定时器

刚睡醒的兔子 2014-11-20 02:35:39
51单片机频率测试 前六位显示脉冲个数 后两位显示频率
定时器的初值可以设成可变的吗
...全文
314 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
fly 100% 2014-12-08
  • 打赏
  • 举报
回复
定时器中断里面gpio 翻转
刚睡醒的兔子 2014-12-05
  • 打赏
  • 举报
回复
十一楼怎么实现 没看过相似的案例程序 能求大神写下程序不 谢谢啦 我的问题还没解决
AI_250 2014-12-03
  • 打赏
  • 举报
回复
定时器产生脉冲,如果脉冲频率没有要求那么快,可以不改变定时器初值,定时器初值一定,再加一个计数变量即可,通过改变计数变量的计数值就可以改变脉冲频率了
刚睡醒的兔子 2014-12-03
  • 打赏
  • 举报
回复
显示频率不对啊 不变只显示20
图灵转世 2014-12-03
  • 打赏
  • 举报
回复
用stm32,怎么还用51.
qq_24043791 2014-11-30
  • 打赏
  • 举报
回复
楼上源代码都给你 好人啊
lemonsland 2014-11-26
  • 打赏
  • 举报
回复
这个应该是可以的,
刚睡醒的兔子 2014-11-24
  • 打赏
  • 举报
回复
你们看看这样可以不
刚睡醒的兔子 2014-11-24
  • 打赏
  • 举报
回复
内容:通过定时产生不同频率的方波 ------------------------------------------------*/ #include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义 #define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换 sbit LATCH1=P2^2;//定义锁存使能端口 段锁存 sbit LATCH2=P2^3;// 位锁存 unsigned char code dofly_DuanMa[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9 unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码 //unsigned char code dingshi=//{10000,20000,3000,40000,50000,60000,70000,80000,90000,100000};// 显示段码值0~9 unsigned char TempData[8]; //存储显示值的全局变量 void Delay(unsigned int t); //函数声明 void Display(unsigned char FirstBit,unsigned char Num); unsigned long num,num1,numpre,num2; unsigned char i,j,m,n; unsigned long h=20000; unsigned long HIGH; unsigned long LOW; bit TIMERFLAG; sbit OUT=P1^2; //定义OUT输出端口 /*------------------------------------------------ 定时器初始化子程序 ------------------------------------------------*/ //} /*------------------------------------------------ 主程序 ------------------------------------------------*/ void main() { //Init_Timer0(); ///void Init_Timer0(void) //{ HIGH=(65535-h)/256; LOW=(65535-h)%256; TMOD |= 0x11; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响 //TH0=0x00; //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出 //TL0=0x00; TH0=HIGH; //重新赋值 12M晶振计算,指令周期1uS, //200mS方波半个周期100mS,由于定时器 //最大值65536 即65.536ms 所以 TL0=LOW; //重新赋值 12M晶振计算,指令周期1uS, //200mS方波半个周期100mS,由于定时器 EA=1; //总中断打开 ET0=1; //定时器中断打开 TR0=1; //定时器开关打开 while(1) { if(num==999999)//用于显示0~9999 num=0; //TempData[0]=dofly_DuanMa[num/1000];//分解显示信息,如要显示68,则68/10=6 68%10=8 //TempData[1]=dofly_DuanMa[(num%1000)/100]; //TempData[2]=dofly_DuanMa[((num%1000)%100)/10]; //TempData[3]=dofly_DuanMa[((num%1000)%100)%10]; if(num<100000) TempData[0]=0; else TempData[0]=dofly_DuanMa[num/100000];//分解显示信息,如要显示68,则68/10=6 68%10=8//十万位 if(num<10000) TempData[1]=0; else TempData[1]=dofly_DuanMa[((num%100000)/10000)];//万位 if(num<1000) TempData[2]=0; else TempData[2]=dofly_DuanMa[((num%100000)%10000)/1000];//千位 if(num<100) TempData[3]=0; else TempData[3]=dofly_DuanMa[(((num%100000)%10000)%1000)/100];//百位 if(num<10) TempData[4]=0; else TempData[4]=dofly_DuanMa[((((num%100000)%10000)%1000)%100)/10];//十位 if(num<1) TempData[5]=0; else TempData[5]=dofly_DuanMa[((((num%100000)%10000)%1000)%100)%10];//个位 //if(num1<100) //TempData[5]=0; //else //TempData[5]=dofly_DuanMa[num1/100]; if(num1<10) TempData[6]=0; else TempData[6]=dofly_DuanMa[num1/10]; if(num1<1) TempData[7]=0; else TempData[7]=dofly_DuanMa[num1%10]; Display(0,8); //TR0=1; //2个定时器打开 // TR1=1; //TH0=0; //保证计数器初值为0 //TL0=0; } } /*------------------------------------------------ 定时器中断子程序 ------------------------------------------------*/ void Timer0_isr(void) interrupt 3 { TH0=HIGH; //重新赋值 12M晶振计算,指令周期1uS, //200mS方波半个周期100mS,由于定时器 //最大值65536 即65.536ms 所以 TL0=HIGH; //直接定时器不够用,需要用循环处理, //定时10ms,然后循环10次后输出 10x10=100ms num++; num1++; OUT=~OUT; if(num1==99) { TR0=0; num1=0; h=20000+h; } if(h==50000) { h=20000; } TH0=HIGH; TL0=LOW; TR0=1; //用示波器可看到方波输出 //} } // } /*------------------------------------------------ 延时函数,含有输入参数 unsigned int t,无返回值 unsigned int 是定义无符号整形变量,其值的范围是 0~65535 ------------------------------------------------*/ void Delay(unsigned int t) { while(--t); } /*------------------------------------------------ 显示函数,用于动态扫描数码管 输入参数 FirstBit 表示需要显示的第一位,如赋值2表示从第三个数码管开始显示 如输入0表示从第一个显示。 Num表示需要显示的位数,如需要显示99两位数值则该值输入2 ------------------------------------------------*/ void Display(unsigned char FirstBit,unsigned char Num) { unsigned char i; for(i=0;i<Num;i++) { DataPort=0; //清空数据,防止有交替重影 LATCH1=1; //段锁存 LATCH1=0; DataPort=dofly_WeiMa[i+FirstBit]; //取位码 LATCH2=1; //位锁存 LATCH2=0; DataPort=TempData[i]; //取显示数据,段码 LATCH1=1; //段锁存 LATCH1=0; Delay(300); // 扫描间隙延时,时间太长会闪烁,太短会造成重影 } }
刚睡醒的兔子 2014-11-24
  • 打赏
  • 举报
回复
/*----------------------------------------------- 名称:定时器0 论坛:www.doflye.net 编写:shifang 日期:2009.5 修改:无 内容:通过定时产生200mS方波 ------------------------------------------------*/ #include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义 #define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换 sbit LATCH1=P2^2;//定义锁存使能端口 段锁存 sbit LATCH2=P2^3;// 位锁存 unsigned char code dofly_DuanMa[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9 unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码 //unsigned char code dingshi=//{10000,20000,3000,40000,50000,60000,70000,80000,90000,100000};// 显示段码值0~9 unsigned char TempData[8]; //存储显示值的全局变量 void Delay(unsigned int t); //函数声明 void Display(unsigned char FirstBit,unsigned char Num); unsigned long num,num1,numpre,num2; unsigned char i,j,m,n; unsigned long h=20000; unsigned long HIGH; unsigned long LOW; bit TIMERFLAG; sbit OUT=P1^2; //定义OUT输出端口 /*------------------------------------------------ 定时器初始化子程序 ------------------------------------------------*/ //} /*------------------------------------------------ 主程序 ------------------------------------------------*/ void main() { //Init_Timer0(); ///void Init_Timer0(void) //{ HIGH=(65535-20000)/256; LOW=(65535-20000)%256; TMOD |= 0x11; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响 //TH0=0x00; //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出 //TL0=0x00; TH0=HIGH; //重新赋值 12M晶振计算,指令周期1uS, //200mS方波半个周期100mS,由于定时器 //最大值65536 即65.536ms 所以 TL0=LOW; //重新赋值 12M晶振计算,指令周期1uS, //200mS方波半个周期100mS,由于定时器 EA=1; //总中断打开 ET0=1; //定时器中断打开 TR0=1; //定时器开关打开 while(1) { if(num==999999)//用于显示0~9999 num=0; //TempData[0]=dofly_DuanMa[num/1000];//分解显示信息,如要显示68,则68/10=6 68%10=8 //TempData[1]=dofly_DuanMa[(num%1000)/100]; //TempData[2]=dofly_DuanMa[((num%1000)%100)/10]; //TempData[3]=dofly_DuanMa[((num%1000)%100)%10]; if(num<100000) TempData[0]=0; else TempData[0]=dofly_DuanMa[num/100000];//分解显示信息,如要显示68,则68/10=6 68%10=8//十万位 if(num<10000) TempData[1]=0; else TempData[1]=dofly_DuanMa[((num%100000)/10000)];//万位 if(num<1000) TempData[2]=0; else TempData[2]=dofly_DuanMa[((num%100000)%10000)/1000];//千位 if(num<100) TempData[3]=0; else TempData[3]=dofly_DuanMa[(((num%100000)%10000)%1000)/100];//百位 if(num<10) TempData[4]=0; else TempData[4]=dofly_DuanMa[((((num%100000)%10000)%1000)%100)/10];//十位 if(num<1) TempData[5]=0; else TempData[5]=dofly_DuanMa[((((num%100000)%10000)%1000)%100)%10];//个位 //if(num1<100) //TempData[5]=0; //else //TempData[5]=dofly_DuanMa[num1/100]; if(num1<10) TempData[6]=0; else TempData[6]=dofly_DuanMa[num1/10]; if(num1<1) TempData[7]=0; else TempData[7]=dofly_DuanMa[num1%10]; Display(0,8); //TR0=1; //2个定时器打开 // TR1=1; //TH0=0; //保证计数器初值为0 //TL0=0; } } /*------------------------------------------------ 定时器中断子程序 ------------------------------------------------*/ void Timer0_isr(void) interrupt 3 { TH0=HIGH; //重新赋值 12M晶振计算,指令周期1uS, //200mS方波半个周期100mS,由于定时器 //最大值65536 即65.536ms 所以 TL0=HIGH; //直接定时器不够用,需要用循环处理, //定时10ms,然后循环10次后输出 10x10=100ms num++; num1++; OUT=~OUT; if(num1==99) { TR0=0; num1=0; h=20000+h; } if(h==50000) { h=20000; } TH0=HIGH; TL0=LOW; TR0=1; //用示波器可看到方波输出 //} } // } /*------------------------------------------------ 延时函数,含有输入参数 unsigned int t,无返回值 unsigned int 是定义无符号整形变量,其值的范围是 0~65535 ------------------------------------------------*/ void Delay(unsigned int t) { while(--t); } /*------------------------------------------------ 显示函数,用于动态扫描数码管 输入参数 FirstBit 表示需要显示的第一位,如赋值2表示从第三个数码管开始显示 如输入0表示从第一个显示。 Num表示需要显示的位数,如需要显示99两位数值则该值输入2 ------------------------------------------------*/ void Display(unsigned char FirstBit,unsigned char Num) { unsigned char i; for(i=0;i<Num;i++) { DataPort=0; //清空数据,防止有交替重影 LATCH1=1; //段锁存 LATCH1=0; DataPort=dofly_WeiMa[i+FirstBit]; //取位码 LATCH2=1; //位锁存 LATCH2=0; DataPort=TempData[i]; //取显示数据,段码 LATCH1=1; //段锁存 LATCH1=0; Delay(300); // 扫描间隙延时,时间太长会闪烁,太短会造成重影 } }
dceacho 2014-11-24
  • 打赏
  • 举报
回复
引用 3 楼 xhing12345 的回复:
就是要做个小东西 开发板上有八位共阴数码管 前六位显示脉冲个数的计数 后两位显示频率 我现在用了两个定时器, 一个定时器 用来一秒定时,一个定时器想把他用来产生不同频率的脉冲,实现通过改变初值实现,现在不知道怎么实现一个定时器产生不同频率的脉冲,想通过改变定时器初值实现,但是不知道怎么实现。
就是修改TH1,TL1, 需要时你改这2个值不就可以了么
刚睡醒的兔子 2014-11-24
  • 打赏
  • 举报
回复
就是要做个小东西 开发板上有八位共阴数码管 前六位显示脉冲个数的计数 后两位显示频率 我现在用了两个定时器, 一个定时器 用来一秒定时,一个定时器想把他用来产生不同频率的脉冲,实现通过改变初值实现,现在不知道怎么实现一个定时器产生不同频率的脉冲,想通过改变定时器初值实现,但是不知道怎么实现。
色郎中 2014-11-23
  • 打赏
  • 举报
回复
虽然没明白你的意思 但是,既然是定时器,定时间隔应该是可以变的
dceacho 2014-11-21
  • 打赏
  • 举报
回复
没说明白

27,382

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧