关于单片机中断 与定时器的应用训练
时间:10-02
整理:3721RD
点击:
1位数码管上先显示零,按下SW0键(外中断1)蜂鸣器发出"答"的一声,数码管递增加数,
到9回零;按下SW1键(外中断0)蜂鸣器发出"笛"的一声,数码管递减减数,到0回9,用外中
断和定时器编程实现? 这是我写代码,但是结果。 图片上的代码跟这个是一样的
#include "stc15f2k60s2.h"
sbit k=P3^2;
sbit k2=P3^3;
int a,b;
//HC595?ó?ú?¨ò?
sbit DAT = P3^7; //HC595′?DDêy?Y??
sbit SCK = P4^2; //HC595ò???ê±?ó??
sbit RCK = P4^1; //HC595??′?ê±?ó??
sbit OE = P4^5; //HC595ê?3??êDí??
unsigned char code duanxuan[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
//è???±?á?
//unsigned char duanxuan=0x7d; //????
unsigned char weixuan=0x80; //????
void delay (unsigned char ms)
{
unsigned char a;
while ((ms--)!=0)
{
for (a=0;a<600;a++)
{}
}
}
void suocunqi(unsigned char dis,unsigned char dig) //???????? ????
{
unsigned char i; //?¨ò???êy?÷
unsigned int temp=0; //?¨ò?êy?Y±?á?
temp=dis; //??á???8??±?á?o?2¢3éò???16×??ú±?á?
temp=temp<<8 | dig;
OE=1; //HC595ê?3??êDí?? ??μ???//1?±???ê?
for(i=0;i<16;i++) //?í3?êy?Y
{
SCK=0; //HC595ò???ê±?ó?? μíμ???//??μíê±?ó??
if( (temp&0x8000)==0x8000 ) //?è·¢?í??×??ú
{
DAT=1; //HC595′?DDêy?Y?? ??μ??? //????D?o???
}
else
{
DAT=0; //HC595′?DDêy?Y?? μíμ???//??μíD?o???
}
SCK=1; //HC595ò???ê±?ó?? ??μ???//????ê±?ó??
temp<<=1; //êy?Y×óò?
}
//??′?D?o?é?éy????′?êy?Y
RCK=0; //HC595??′?ê±?ó?? μíμ???
RCK=1; //HC595??′?ê±?ó?? ??μ???
OE=0; //HC595ê?3??êDí?? μíμ???//′ò?a??ê?
}
void fasongshuju (unsigned char Dat,unsigned char dig ) //·¢?íμ?ááêy??1üμ??? ó? ?? μ?êy?Y
{
suocunqi(Dat,~dig);
}
void chushihua (void) //3?ê??ˉoˉêy
{
DAT=1; //HC595′?DDêy?Y?? ??
SCK=1; //HC595ò???ê±?ó?? ??
RCK=1; //HC595??′?ê±?ó?? ??
//ê?3??êDí£??aê???ê?
OE=0; //HC595ê?3??êDí?? μí
}
void main(void) //?÷oˉêy
{
EA=1;
ET0=1;
EX0=1;
IT0=1;
IT1=1;
EX1=1;
TMOD=0X01;
TH0=(65536-3000)/256;
TL0=(65536-3000)%256;
chushihua (); //μ÷ó? 3?ê??ˉoˉêy
fasongshuju(duanxuan[0],weixuan);
while(1)
{
if(k==0)
{
delay (20);
while(k2==1)
{
a++;
if(a>9)
{
a=0;
}
}
}
if(k2==0)
{
delay(20);
while(k==1)
{
a--;
if(a==0)
{
a=9;
}
}
}
}
}
void time0 (void ) interrupt 1 using 1
{
fasongshuju(duanxuan[a],weixuan);
TH0=(65536-3000)/256;
TL0=(65536-3000)%256;
}
void int0 (void ) interrupt 0 using 0
{
TR0=1;
}
void int1 (void ) interrupt 2 using 2
{
TR0=1;
}
到9回零;按下SW1键(外中断0)蜂鸣器发出"笛"的一声,数码管递减减数,到0回9,用外中
断和定时器编程实现? 这是我写代码,但是结果。 图片上的代码跟这个是一样的
#include "stc15f2k60s2.h"
sbit k=P3^2;
sbit k2=P3^3;
int a,b;
//HC595?ó?ú?¨ò?
sbit DAT = P3^7; //HC595′?DDêy?Y??
sbit SCK = P4^2; //HC595ò???ê±?ó??
sbit RCK = P4^1; //HC595??′?ê±?ó??
sbit OE = P4^5; //HC595ê?3??êDí??
unsigned char code duanxuan[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
//è???±?á?
//unsigned char duanxuan=0x7d; //????
unsigned char weixuan=0x80; //????
void delay (unsigned char ms)
{
unsigned char a;
while ((ms--)!=0)
{
for (a=0;a<600;a++)
{}
}
}
void suocunqi(unsigned char dis,unsigned char dig) //???????? ????
{
unsigned char i; //?¨ò???êy?÷
unsigned int temp=0; //?¨ò?êy?Y±?á?
temp=dis; //??á???8??±?á?o?2¢3éò???16×??ú±?á?
temp=temp<<8 | dig;
OE=1; //HC595ê?3??êDí?? ??μ???//1?±???ê?
for(i=0;i<16;i++) //?í3?êy?Y
{
SCK=0; //HC595ò???ê±?ó?? μíμ???//??μíê±?ó??
if( (temp&0x8000)==0x8000 ) //?è·¢?í??×??ú
{
DAT=1; //HC595′?DDêy?Y?? ??μ??? //????D?o???
}
else
{
DAT=0; //HC595′?DDêy?Y?? μíμ???//??μíD?o???
}
SCK=1; //HC595ò???ê±?ó?? ??μ???//????ê±?ó??
temp<<=1; //êy?Y×óò?
}
//??′?D?o?é?éy????′?êy?Y
RCK=0; //HC595??′?ê±?ó?? μíμ???
RCK=1; //HC595??′?ê±?ó?? ??μ???
OE=0; //HC595ê?3??êDí?? μíμ???//′ò?a??ê?
}
void fasongshuju (unsigned char Dat,unsigned char dig ) //·¢?íμ?ááêy??1üμ??? ó? ?? μ?êy?Y
{
suocunqi(Dat,~dig);
}
void chushihua (void) //3?ê??ˉoˉêy
{
DAT=1; //HC595′?DDêy?Y?? ??
SCK=1; //HC595ò???ê±?ó?? ??
RCK=1; //HC595??′?ê±?ó?? ??
//ê?3??êDí£??aê???ê?
OE=0; //HC595ê?3??êDí?? μí
}
void main(void) //?÷oˉêy
{
EA=1;
ET0=1;
EX0=1;
IT0=1;
IT1=1;
EX1=1;
TMOD=0X01;
TH0=(65536-3000)/256;
TL0=(65536-3000)%256;
chushihua (); //μ÷ó? 3?ê??ˉoˉêy
fasongshuju(duanxuan[0],weixuan);
while(1)
{
if(k==0)
{
delay (20);
while(k2==1)
{
a++;
if(a>9)
{
a=0;
}
}
}
if(k2==0)
{
delay(20);
while(k==1)
{
a--;
if(a==0)
{
a=9;
}
}
}
}
}
void time0 (void ) interrupt 1 using 1
{
fasongshuju(duanxuan[a],weixuan);
TH0=(65536-3000)/256;
TL0=(65536-3000)%256;
}
void int0 (void ) interrupt 0 using 0
{
TR0=1;
}
void int1 (void ) interrupt 2 using 2
{
TR0=1;
}
要把问题现象说清楚,现在不知道你要问什么问题,程序有几个问题,一,没有判断按键的释放,这样变量a会不停的变化。二,没看到对蜂鸣器的操作。三,主程序没有启动定时器0,估计开始没显示,直到有按键按下才会开始显示。
蜂鸣器的比较简单,就还没写上去,这个程序一开始是显示0,本来是想按下去以后就开始启动定时器,然后成0-9或9-0这样子的流动,但是实际的是他的显示是乱了,不是一个正常数字 这里该怎么改呢
分开调试吧,先把显示调对,要能正确显示想要显示的内容,不知道你是用动态显示还是静态显示,两种的程序不一样,动态的需要定时做显示扫描,显示调好了,再调其他的,可以利用显示做一些提示来判断程序运行状态
这是动态的吧,显示原来是可以的,就是加上中断后,再加了几个语句就会乱了
这是动态显示的电路,不过如果只显示一个数码管,也可以当静态的用,你先把a的值固定不变,把while(1)里面的内容屏蔽,也就是只剩while(1){},外部中断保持,如果没错的话,你的程序应该是上电后无显示或显示不定值,当任意按键按下后显示a的值
我那while(1)之前有个显示0,我按你的做了,按下后数码管就一直显示原来的0;
在while(1)之前把显示关闭,什么都不显示,你现在设定的a值是多少,如果没正确显示,那就是定时器没启动,或显示部分有问题
谢谢你 大哥,我还是慢慢研究吧,一句两句说不清啊