根据原理图编写定时器,要求,数码管定时器制作动态显示时间,到时间蜂鸣器响3秒 求程序

已解决问题
c51单片机实现一个30秒倒计时程序,要求有两个定时器,要有声音(蜂鸣器就行),显示(数码管),串口
提问时间: 14:01:26
浏览次数:2507
//晶振:11.0592M T1-250微秒按键P30 P31 P32 P33 /*变量的定义&br/&&br/&
show_val: 显示的值0-5&br/&&br/&
init_val: 初始&br/&&br/&
state_val: 状态值 0-计数状态;1-设置状态;2-闪烁状&br/&&br/&
shan_val: key_val1: 四个按键的值 0-无键;1-设置键 2-增一键 3-减一键 4-确定&br/&&br/&
T1_cnt: 定时器计数溢出&br/&&br/&
cnt_val: 倒计时的数&br/&&br/&
led_seg_code:数码管7段码 */ #include &reg51.h& //包含文件 sbit P3_0=P3^0; //设置键 sbit P3_1=P3^1; //增一键 sbit P3_2=P3^2; //减一键 sbit P3_3=P3^3; //确定键 unsigned char shan_ //闪烁时LED的开/关状态 unsigned char cnt_ //保存倒计数的当前值 unsigned int T1_ //保存定时器溢出次数 unsigned char key_val_new,key_val_//存放当前扫描的键和前一次按下的键值 unsigned char state_ //状态值 unsigned char show_ //存放需要在数码管显示的数字 unsigned char init_ //暂存倒计数的初始值 char codeled_seg_code[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //----------延时-------------- void delay(unsigned int i) //大约延时i*2个微秒 { while(--i);} //-----------按键扫描------------- unsigned char scan_key() { unsigned char i&br/&&br/&
i=P3&0x0f&br/&&br/&
delay(100); //延时,去抖&br/&&br/&
if(i==(P3&0x0f)&br/&&br/&
{ if (P3_0==0&br/&&br/&
{ while(P3_0==0); i=1; &br/&&br/&
els&br/&&br/&
{ if (P3_1==0&br/&&br/&
{while(P3_1==0); i=2;&br/&&br/&
els&br/&&br/&
{ if (P3_2==0&br/&&br/&
{while(P3_2==0); i=3;&br/&&br/&
els&br/&&br/&
{ if (P3_3==0&br/&&br/&
{while(P3_3==0); i=4;} &br/&&br/&
} } &br/&&br/&
els&br/&&br/&
{ i=0; &br/&&br/&
return i&br/&&br/&
EA=1; } //---------数码管显示-------------- void led_show(unsigned char v) &br/&&br/&
unsigned char i&br/&&br/&
if(1) //动态扫&br/&&br/&
{i=v/100; //取要显示的数的个&br/&&br/&
P0=led_seg_code[i]; //转换为7段&br/&&br/&
P2=0 //显示个&br/&&br/&
delay(15); //延&br/&&br/&
i=(v%100)/10; //取十&br/&&br/&
P0=led_seg_code[i]; //转换为7段&br/&&br/&
P2=0 //显示十&br/&&br/&
delay(5); //延&br/&&br/&
i=(v%100)%10&br/&&br/&
P0=led_seg_code[i]&br/&&br/&
P2=0xfe&br/&&br/&
delay(5)&br/&&br/&
&br/&&br/&
els&br/&&br/&
{P0=led_seg_code[0]; //处于闪烁状&br/&&br/&
if(shan_val&br/&&br/&
{P2=0 } //将数码管的关&br/&&br/&
els&br/&&br/&
{P2=0 } //将数码管的打&br/&&br/&
} } //----------定时器T1中断服务程序--------------- void timer1() interrupt 3 //T1中断,250us中断一次 { T1_cnt++&br/&&br/&
switch (state_val&br/&&br/&
{case 0&br/&&br/&
if(T1_cnt&3999) //如果计数&3999, 计时1&br/&&br/&
{ T1_cnt=0&br/&&br/&
if(cnt_val!=0&br/&&br/&
{ cnt_val--;&br/&&br/&
els&br/&&br/&
{state_val=2;} //定时计数到0时,切换状&br/&&br/&
show_val=cnt_val&br/&&br/&
&br/&&br/&
break&br/&&br/&
case 2&br/&&br/&
if(T1_cnt&1999) //如果计数&1999, 计时0.5&br/&&br/&
{ T1_cnt=0; shan_val=!shan_ } //闪烁状&br/&&br/&
break&br/&&br/&
} } //---------主程序---------------- main() {init_val=200; //初始化各变&br/&&br/&
cnt_val=init_val&br/&&br/&
show_val=cnt_val&br/&&br/&
state_val=0&br/&&br/&
key_val_old=0&br/&&br/&
T1_cnt=0&br/&&br/&
shan_val=0; //初始化51的寄存器 TMOD=0x20; //用T1计时 8位自动装载定时模&br/&&br/&
TH1=0x19; //250微秒溢出一次; 250=(256-x)*12/11.0592 -& x= 230.&br/&&br/&
TL1=0x19&br/&&br/&
EA=1; //打开总中断允&br/&&br/&
ET1=1; //开中断允&br/&&br/&
TR1=1; //开定时器T1 while(1) { key_val_new=scan_key(); // 255表示无键按&br/&&br/&
if(key_val_new!=0) { // 只有当前扫描的键值与上次扫描的不同,才判断是有键按&br/&&br/&
//key_val_old=key_val_new&br/&&br/&
switch (key_val_new&br/&&br/&
{ case 1: //设置&br/&&br/&
state_val=1; //处于设置状&br/&&br/&
TR1=0; //停止计&br/&&br/&
show_val=init_ //显示原来的倒计数初始&br/&&br/&
break&br/&&br/&
case 2: if(state_val==1) //只有在设置状态,增1键才有&br/&&br/&
{ if (init_val&0) //更改原来的倒计数初始&br/&&br/&
{init_val--; &br/&&br/&
els&br/&&br/&
{init_val=200;&br/&&br/&
show_val=init_//显示更改后的倒计数初始&br/&&br/&
&br/&&br/&
break&br/&&br/&
case 3: if(state_val==1) //只有在设置状态,减1键才有&br/&&br/&
{ if (init_val&200) //更改原来的倒计数初始&br/&&br/&
{init_val++; &br/&&br/&
els&br/&&br/&
{init_val=0;&br/&&br/&
show_val=init_ //显示更改后的计数初始&br/&&br/&
&br/&&br/&
break&br/&&br/&
case 4: if(state_val!=0) //如果已处于计数模式,确认键不起作&br/&&br/&
{ cnt_val=init_ //将初始值赋给计数变&br/&&br/&
show_val=cnt_ //将计数变量的数字显&br/&&br/&
TR1=1; //启动定时器T&br/&&br/&
state_val=0; //将状态切换为计数模&br/&&br/&
&br/&&br/&
break&br/&&br/&
&br/&&br/&
} led_show(show_val); //动态扫描 } }。
答案创立者
以企业身份回答&
快速解决你的电商难题
店铺优化排查提升2倍流量
擅长&nbsp 店铺优化
您可能有同感的问题数码管动态显示_百度知道
数码管动态显示
void display(uchar num)
//这是一个计60秒的子函数
uchar shi,
shi=num/10;
ge=num%10;
//dula是段选
P0=table[shi];
我有更好的答案
我先来帮你分析一下这个程序:(1)到(4)的功能是由P0口给出数码管的段码。我猜想在P0口和数码管的段码线之间是一个锁存器,这样能够保证当P0口的数据变化之后,数码管的数字不变化。这时,数码管不能显示相应数字,因为位码线还没有被选中。(5)到(8)的功能是由P0口给出数码管的位码。这时位码线被选中,在段码和位码的同时作用下,数码管被激活,显示shi对应的数字。然后延时delay(5);执行到时(10),由于P0给出了ge的段码,而位码还没改变,这时候当然要在第一个数码管上显示第二个数码管的内容。执行到(14),位码改变,第二个数码管被选中,这时段码和位码共同作用,第二个数码管显示ge所对应的数字。然后延时。由于第一个数码管显示ge的时间很短,只有不到十个机器周期,而正常显示的时间很长,这个时间是delay(5),所以看不出ge曾经在第一个数码管上经过,所以看上去显示效果是对的。这也就是为什么要加延时程序(8)和(16)。如果不加的话,第一个数码管会快速的在ge和shi之间进行“切换”,最后的结果是数码管一显示8,而数码管二正常显示,你可以试一下。因此回答如下:问题一:延时程序的目的是为了掩盖数码管一上的“切换”,给你的眼睛“错觉”。问题二:没有讲究,是锁存器的锁存特性造成的,延时程序很好解决了这一问题。楼上的回答很不准确,我不赞同。即使把13.14.15和9.10.11换一下,如果不加延时程序,问题同样存在,只不过成了数字shi经过数码管二而已。郭天祥讲的时候,程序不是现成的,是当时现场写的,出现错误也是正常的。
采纳率:17%
位选之后再段选,肯定会在该显示1的地方突然显示2了,然后有瞬间正常显示,没法避免,郭天祥的程序里加了一个对P0清零,只加在了段选后,是因为段选只针对一个数码管,而位选是对好几个数码管,影响比较大,其实位选后P0口的数据对之后的段选也是有影响的,和你提的问题影响一样,只是这两个问题都能用延时的方法解决,或者看不出来,所以就忽略了,单步运行肯定会不合理,但高速下就没问题了,就像现在的电灯泡,其实都是一闪一闪的,50HZ,只是频率比较高,看不出来,其实没有完美,只有看起来很好
郭天祥的书吧?问题1:我觉得延时其实可以不加,你可以尝试一下不加延时,效果应该一样的,他加了延时主要是让你能明白动态显示的原理,之前延时是比较长的,所以感觉有闪烁,现在延时短了,就不闪烁了问题2:执行到10的时候,1显示的是2的数据,是因为这个时候,位选选中的还是数码管1,而位选发出的已经是2的数据了,所以1显示的还是2的数据,后面位选选中了2,数据就到2上了,这个应该没什么讲究,你可以把13.14.15和9.10.11换一下,效果应该是一样的,这样单步运行的时候,数据也没有问题了。以上,希望对你有帮助。
1.数码管的编码有没有错误!数码管分为共阴极和共阳极。2.你这个程序count1是秒钟,count2是分钟。
display(count1/10,count1%10,count2/10,count2%10);对于display(秒的十位,秒的个位,分的十位,分的个位)好像不是对应(分十位,分个位,秒十位,秒个位)。3.unsigned char code bit_tab[]=;//片选中的0XFD是选中P3.1不是P3.5,所以有一位数码管不亮是正常的。4.你所说的乱码是什么意思?数字不对还是不显示数字?
其他1条回答
为您推荐:
其他类似问题
您可能关注的内容
动态显示的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。单片机定时器控制数码管动态显示程序_百度知道
单片机定时器控制数码管动态显示程序
#include&reg51.h&
#include&intrins.h&
#define uchar unsigned char
#define uint unsigned int
//段码,最后一位是“-”的段码
uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};
//待显示的数据:09-12-25与23-59-5...
我有更好的答案
基本上不算消耗太多时间。每个指令的消耗时间可以KEIL模拟仿真的时候可以大概算出时间。if(++t!=350)return,这句是没有达到350,就退出中断函数,到了中断时间载再进入就是另外一次了。
if(++t!=350)return是不是产生350T0中断 程序才会继续往下处理t=0; i=(i+1)%2; 另外要使整个程序能正常显示if(++t!=350)return最少取值为8即if(++t!=8)return;
是的,t取多少这个,要根据单片机的运行速率,显示刷新率来决定的!!
采纳率:65%
为您推荐:
其他类似问题
您可能关注的内容
定时器的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。单片机程序中如何做到延时不影响数码管扫描显示_百度知道
单片机程序中如何做到延时不影响数码管扫描显示
我写了个程序,让蜂鸣器响100ms,所以写了个100ms的延时程序,但是这么写影响了数码管的延时,可以看到数码管明显的闪烁,延时时间更长的话,数码管问题就更大了,所以我想了解一下这种问题怎么解决,如果以后程序中驱动的东西越来越多的话,肯定会相互影响,...
我有更好的答案
单片机程序,数码管扫描显示,及计时 可以用一个定时器中断来完成,比如 8 个数码管 定时器用 2 ~ 2.5 mS,每次中断 刷新 一个数码管,同时可以 设置一个标志位在主程序 中记录中断 次数作为 定时 或者 延时,如 2.5mS
40次 就是 100mS,如果计时精度 要求高的 可以另外 用一个定时器,学会使用定时器,很多问题很好解决的。
采纳率:60%
蜂鸣器的控制有个开关吧,用定时器每10ms判断一次时间到100ms时关闭蜂鸣器就行了。如果没有开关,得自己分线程解决,就是在你的循环中加入分项任务,每个任务就是一个线程,每个线程在一次循环中所占用的时间控制在1ms到5ms以内,各任务就可以轮流执行。这个循环体就相当于一个多任务管理器。
我的是51单片机,可以这样做吗?能不能给我一个具体的程序看看,或者是这方面的文件,我想找的就是你说的这种方法,谢谢,我的126邮箱是buzaiyouyv
我没有具体程序,原理如下:while(1){s=当前时间-开始时间if(满足数码管条件){执行数码管程序段}if(s&100){执行蜂鸣器程序段}if(满足结束条件)}
编程问题,不要在程序里采用死循环延时。
最简单的办法就是在定时中断程序中持行扫描输出
在你的延时程序中加入数码管显示程序,这样就行了,望采纳,谢谢
随便写的 蜂鸣器响的时间等于 beep_time*10ms#include &reg51.h&unsigned char beep_time = 0;//unsigned char beep_en = 0;void Timer0Interrupt(void) interrupt 1{ // 10MS
TH0 = 0x0D8;
TL0 = 0x0F0; if( beep_time != 0 ) {
beep_time--;
BEEP_ON();//打开你的蜂鸣器
BEEP_OFF();//关闭你的蜂鸣器 }}void main (void){
TMOD = 0x01;
TH0 = 0x0D8;
TL0 = 0x0F0;
TR0 = 1; beep_time = 50; while(1) {
LED_WORK(); //扫描你的数码管
DELAY(); //延时 }}
其他3条回答
为您推荐:
其他类似问题
延时的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。当前位置: &
求翻译:显示模块用74HC245功率放大芯片驱动数码管,采用8位数码管动态显示时间,显示格式为“小时—分钟—秒”,打铃由蜂鸣器报警模块来实现。是什么意思?
显示模块用74HC245功率放大芯片驱动数码管,采用8位数码管动态显示时间,显示格式为“小时—分钟—秒”,打铃由蜂鸣器报警模块来实现。
问题补充:
Display module use 74hc245 power amplification chip-driven digital control, 8 digital tube dynamic display time display format is hours - minutes - seconds ", rang the bell, buzzer alarm module.
Display Module 245 with 74 power magnification HC chip digital tube drive, with 8-bit digital dynamic displays the time, appears in the format "hours-minutes-seconds, to ring the buzzer alarm modules.
Demonstrated the module with the 74HC245 power enlargement chip actuation nixietube, uses 8 nixietube dynamic demonstration time, demonstrated the form is “an hour - minute - second”, hits the bell to report to the police the module by the buzzer to realize.
Display modules with a power amplifier chip 74HC245 driven digital control, uses 8-bit digital dynamic display, the display format for "hours-minutes-seconds", Bell are buzzer alarm modules to implement.
正在翻译,请等待...
我来回答:
参考资料:
* 验证码:
登录后回答可以获得积分奖励,并可以查看和管理所有的回答。 |
我要翻译和提问
请输入您需要翻译的文本!}

我要回帖

更多关于 定时器使数码管闪烁 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信