OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4639|回复: 10

为什么我的计时器设置不能进入中断

[复制链接]

4

主题

6

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2019-5-15
在线时间
4 小时
发表于 2019-5-15 09:41:37 | 显示全部楼层 |阅读模式
#include <reg51.h>//抢答器(还未设置未抢答响铃)
#define key P1
typedef unsigned int u16;
typedef unsigned char u8;
sbit k1=P3^1;
sbit k2=P3^0;
sbit k3=P3^2;
sbit k4=P3^3;
sbit LSA=P2^4;
sbit LSB=P2^3;
sbit LSC=P2^2;
u8 tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
u8 m[8]={10,10,10,10,10,10,10,10};
u8 z,q=10,i;
u8 flag1,flag2,flag3,flag4;
void delay(u16 i){
while(i--);
}
void Time1Config(){
TMOD|=0x01;
TH1=0xd8;
TL1=0xf0;//10ms
TR1=1;//开启定时器
ET1=1;
EA=1;          
}
u8 kskan(void)
{
        u8 a=0,KeyValue;
        key=0x0f;
        if(key!=0x0f)//读取按键是否按下
        {
                delay(1000);//延时10ms进行消抖
                if(key!=0x0f)//再次检测键盘是否按下
                {       
                        //测试列
                        key=0X0F;
                        switch(key)
                        {
                                case(0X07):        KeyValue=0;break;
                                case(0X0b):        KeyValue=1;break;
                                case(0X0d): KeyValue=2;break;
                                case(0X0e):        KeyValue=3;break;
                        }
                        //测试行
                        key=0XF0;
                        switch(key)
                        {
                                case(0X70):        KeyValue=KeyValue;break;
                                case(0Xb0):        KeyValue=KeyValue+4;break;
                                case(0Xd0): KeyValue=KeyValue+8;break;
                                case(0Xe0):        KeyValue=KeyValue+12;break;
                        }
                        while((a<50)&&(key!=0xf0))         //检测按键松手检测
                        {
                                delay(1000);
                                a++;
                        }
                }
        }
        return KeyValue;
}
void daojishi(){
if(flag1==1){
m[0]=q;
m[1]=10;
m[2]=10;
m[3]=10;
m[4]=10;
m[5]=10;
m[6]=10;
m[7]=z;
}
if(flag2==1||flag3==1){
m[0]=q;
m[1]=10;
m[2]=10;
m[3]=10;
m[4]=10;
m[5]=10;
m[6]=z%10;
m[7]=z/10;
}
}
void shumaguan(){
u8 i;
for(i=0;i<8;i++){
switch(i){
case 0SA=0;LSB=0;LSC=0;break;
case 1SA=0;LSB=0;LSC=1;break;
case 2SA=0;LSB=1;LSC=0;break;
case 3SA=0;LSB=1;LSC=1;break;
case 4SA=1;LSB=0;LSC=0;break;
case 5SA=1;LSB=0;LSC=1;break;
case 6SA=1;LSB=1;LSC=0;break;
case 7SA=1;LSB=1;LSC=1;break;
}
P0=tab[m[i]];
delay(100);
P0=0x00;
}
}
void duli(){
if(k1==0){
delay(1000);
if(k1==0){
flag1=1;
flag2=0;
flag3=0;
}
}
if(k2==0){
delay(1000);
if(k2==0){
flag1=0;
flag2=1;
flag3=0;
}
}
if(k3==0){
delay(1000);
if(k3==0){
flag1=0;
flag2=0;
flag3=1;
}
}
if(k4==0){
delay(1000);
if(k4==0){
flag4=1;
}
}
if(flag1==1)
z=5;
if(flag2==1)
z=10;
if(flag3==1)
z=20;
}
void main(){
u8 d;
while(1){
duli();
daojishi();
shumaguan();
if(flag4==1){
Time1Config();
d=kskan();
if((d>=0&&d<=3)&&z>0){
q=d;
z=z;                                  
}       
}
}
}
void Time1() interrupt 3{
TH1=0xd0;
TL1=0x8f;
i++;
if(i==100){
i=0;
z--;
}
}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

109

主题

5562

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10541
金钱
10541
注册时间
2017-2-18
在线时间
1908 小时
发表于 2019-5-15 17:42:40 | 显示全部楼层
回复 支持 反对

使用道具 举报

12

主题

42

帖子

0

精华

高级会员

Rank: 4

积分
642
金钱
642
注册时间
2018-12-2
在线时间
88 小时
发表于 2019-5-15 22:46:34 | 显示全部楼层
帮顶+1
回复 支持 反对

使用道具 举报

0

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2019-5-4
在线时间
42 小时
发表于 2019-5-17 09:37:12 | 显示全部楼层
因为你的TMOD设置有问题,这里就不细述了,你用TIME 1,那是高4位设置,TMOD = 0X10;
要么是先 TMOD &= 0X0F ;//先清高四位,然后TMOD | = 0X10 ;所以说同学们写程序一定要规范
回复 支持 反对

使用道具 举报

0

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2019-5-4
在线时间
42 小时
发表于 2019-5-17 09:39:23 | 显示全部楼层
其它就是你的程序要让人家看的懂,你的做好相关的注释,变量,参数是做什么用的,函数也一样,写的标准化,函数功能是什么,输入参数,输出参数等,让人家一看知道,我们来帮你解决问题的,你的先做好基本工作,否则让人家怎么给你解决。现在不规范的人真的太多了
回复 支持 反对

使用道具 举报

0

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2019-5-4
在线时间
42 小时
发表于 2019-5-17 09:43:59 | 显示全部楼层
还有就是变量的命名,什么flag1,falg2,我们真心不知道你是做什么用的,你的按知名思意去命名,必要的时候标上注释分别是做什么的,另外变量的名义后,一定要初始化,这都是规范化的要求,为什么乱写,那就该出错,你不尊重技术,技术怎么可能尊重你,小中见大,细节决定成败。
回复 支持 反对

使用道具 举报

0

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2019-6-14
在线时间
15 小时
发表于 2019-6-14 10:27:22 | 显示全部楼层
不写注释自己过段时间都会忘记。
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2019-4-10
在线时间
4 小时
发表于 2019-7-22 11:48:57 | 显示全部楼层
中断3是定时器2的中断,但你初始化的是定时器 1(TMOD|0x01);改用中断1就好,(interrupt 1)
回复 支持 反对

使用道具 举报

5

主题

47

帖子

0

精华

高级会员

Rank: 4

积分
680
金钱
680
注册时间
2019-5-18
在线时间
101 小时
发表于 2019-7-26 13:51:41 | 显示全部楼层
你用的普中51板吧
回复 支持 反对

使用道具 举报

5

主题

47

帖子

0

精华

高级会员

Rank: 4

积分
680
金钱
680
注册时间
2019-5-18
在线时间
101 小时
发表于 2019-7-26 13:53:13 | 显示全部楼层
按键消抖时间是5~10ms,你消抖时间不短啊!
回复 支持 反对

使用道具 举报

5

主题

47

帖子

0

精华

高级会员

Rank: 4

积分
680
金钱
680
注册时间
2019-5-18
在线时间
101 小时
发表于 2019-7-26 13:58:11 | 显示全部楼层
看错了,你的延时没错  你既然有矩阵按键扫描,还用什么独立按键呢,增加代码量
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 13:20

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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