专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
毕业设计紧急求助~~急急急~~
2019-03-26 16:15
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
DSP
15714
2
1739
串口中断可以和定时器中断一起用吗?我用的是STC12C5A60S2单片机~~为什么每次都进不了串口中断~把定时器
中断关掉就可以进入串口中断?串口中断我是用的独立波特率发生器,定时器T0和T1都用了~跪求解释呀!!!~程序其他都没问题~把串口中断设为最高优先级我也试过,还是不行~
T1是2MS定时~
[
本帖最后由 cyanysys 于 2013-5-14 16:56 编辑
] 此帖出自
小平头技术问答
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
2条回答
cyanysys
2019-03-26 23:50
<
功能就是把超声波测距的值(程序中的S)通过串口发送给组态王显示~~~求大神帮助~~
#include<STC12C5A60S2.H>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
//#define N 800
sbit SDATA_595 = P2^5; //串行移位输入
sbit SHcp_595 = P2^7; //移位寄存器时钟输入SHcp
sbit STcp_595 = P2^6; //存储寄存器时钟输入STcp
sbit fengmingqi=P2^0;
unsigned int time=0;
unsigned int timer=0;
unsigned int t=0;
unsigned char posit=0;
unsigned long S=0;
bit flag =0;
unsigned char const discode[] ={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xBF,0xff/*-*/};
unsigned char const positon[3]={0x10,0x08,0x04};
unsigned char disbuff[4]={0,0,0,0,};
sbit RX=P1^2;
sbit TX=P1^3;
sbit Q1=P1^4;
sbit Q2=P1^0;
sbit Q3=P1^1;
sbit K1=P1^7;
sbit K2=P1^6;
sbit K3=P1^5;
sbit K4=P2^1;
sbit S1=P2^2;
sbit S2=P2^3;
unsigned char rec[50];
unsigned char code error[]={0x40,0x30,0x46,0x2a,0x2a,0x37,0x36,0x0d};
unsigned char send[]={0x40,0x30,0x46,0x30,0x31,0x00,0x00,0x00,0x00,0x0d};
unsigned char i;
unsigned char ath(unsigned char,unsigned char);
unsigned int hta(unsigned char);
void uart(void);
//void delay(uint);
/*-----------延时子程序---------
void delay(uint z)
{
uint a;
for(;z>0;z--)
for(a=100;a>0;a--);
}
*/
void OUT_595(void)
{
STcp_595 = 0;
_nop_();
_nop_();
STcp_595=1; //上升沿将数据送到输出锁存器
_nop_();
_nop_();
STcp_595 = 0 ;
}
void WR_595(uchar x)
{
uchar temp;
uchar j;
temp = x;
SHcp_595 = 0;
for (j=0; j<8; j++)
{
temp = temp<<1;
SDATA_595 = CY;
SHcp_595 = 1; //上升沿发生移位
_nop_();
_nop_();
SHcp_595 = 0;
_nop_();
_nop_();
}
OUT_595();
}
/*void baojing()
{
uchar x,i;
x=0xfe;
fengmingqi=1;
for(i=0;i<8;i++)
{
WR_595(x);
delay(N);
x=(x<<1)|0x01;
delay(N);
}
}
*/
void Display(void) //扫描数码管
{
if(++posit>=3)
posit=0;
P3=positon[posit] ;
if(posit==1)
{
P0=(discode[disbuff[posit]])&0x7f;
}
else
{
P0=discode[disbuff[posit]];
}
}
void Conut(void)
{
unsigned int a,b;
time=TH0*256+TL0;
TH0=0;
TL0=0;
S=130-(time*17)/100; //算出来是CM x10
if((S>=700)||flag==1) //超出测量范围显示“-”
{
flag=0;
disbuff[0]=10; //“-”
disbuff[1]=10; //“-”
disbuff[2]=10; //“-”
}
else
{
disbuff[0]=S%1000/100;
disbuff[1]=S%1000%100/10;
disbuff[2]=S%1000%100%10;
}
if(S<=55||S>=95)
{
WR_595(0x00);
fengmingqi=1;
}
else
{
WR_595(0xff);
fengmingqi=0;
}
if(K1==1&&K2==1&&S<=50){Q1=0;Q2=1;}
if(K1==1&&K2==0&&S<=50){Q2=0;Q1=1;}
if(K1==1&&S>=100){Q1=1;Q2=1;}
if(K1==1&&S1==0&&S2==1){Q3=0;t=1;}
if(K1==1&&S1==0&&S2==0&&t==1)Q3=0;
if(K1==1&&S1==0&&S2==0&&t==0)Q3=1;
if(K1==1&&S1==1&&S2==0){Q3=1;t=0;}
if(K1==0&&K3==1){Q1=1;Q2=1;}
if(K1==0&&K2==1&&K3==0){Q1=0;Q2=1;}
if(K1==0&&K2==0&&K3==0){Q1=1;Q2=0;}
if(K1==0&&K4==0)Q3=0;
if(K1==0&&K4==1)Q3=1;
a=hta(S);
send[5]=a>>8;
send[6]=(unsigned char)a;
b=0;
for(a=1;a<7;a++)b^=send[a];
b=hta(b);
send[7]=b>>8;
send[8]=(unsigned char)b;
}
/********************************************************/
void zd0() interrupt 1 //T0中断用来计数器溢出,超过测距范围
{
flag=1; //中断溢出标志
}
/********************************************************/
void zd3() interrupt 3 //T1中断用来扫描数码管和计400MS启动模块
{
TH1=(65536-2000)/256;
TL1=(65536-2000)%256;
Display();
timer++;
if(timer>=200)
{
timer=0;
TX=1; //400MS 启动一次模块
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TX=0;
}
}
void uart(void) interrupt 4
{
unsigned char a,b;
if(RI)
{
a=SBUF;
RI=0;
if(a==0x40)i=0;
rec
=a;
i++;
if(a==0x0d)
{
if(ath(rec[1],rec[2])==15)
{
b=0;
for(a=1;a<i-3;a++)b^=rec[a];
if(b==ath(rec[i-3],rec[i-2]))
{
if((ath(rec[3],rec[4])&0x01)==0)
{
for(a=0;a<10;a++)
{
SBUF=send[a];
while(TI!=1);
TI=0;
}
}
}
else
{
for(a=0;a<8;a++)
{
SBUF=error[a];
while(TI!=1);
TI=0;
}
}
}
}
}
else
{
TI=0;
}
}
/*********************************************************/
unsigned char ath(unsigned char a,unsigned char b)
{
if(a<0x40)a-=0x30;
else if(a<0x47)a-=0x37;
else if(a<67)a-=0x57;
if(b<0x40)b-=0x30;
else if(b<0x47)b-=0x37;
else if(b<67)b-=0x57;
return((a<<4)+b);
}
unsigned int hta(unsigned char a)
{
unsigned int b;
b=a>>4;
a&=0x0f;
if(a<0x0a)a+=0x30;
else a+=0x37;
if(b<0x0a)b+=0x30;
else b+=0x37;
b=((b<<8)+a);
return b;
}
void main(void)
{
unsigned char i=0;
TMOD=0x11; //设T0为方式1,GATE=1;
TH0=0;
TL0=0;
TH1=(65536-2000)/256; //2MS定时
TL1=(65536-2000)%256;
ET0=1; //允许T0中断
ET1=1; //允许T1中断
TR1=1; //开启定时器
SCON=0x50;
BRT=0xfd;
AUXR=0x11;
EA=1;ES=1; //开启总中断
while(1)
{
while(!RX); //当RX为零时等待
TR0=1; //开启计数
while(RX); //当RX为1计数并等待
TR0=0; //关闭计数
Conut(); //计算
}
}
加载中...
查看其它2个回答
一周热门
更多
>
相关问题
相关文章
事件管理器――PWM
0个评论
FPGA时序分析基础(二):vivado中常用的时序约束命令
0个评论
LDO和BUCK降压稳压器对比
0个评论
伺服控制系统教学实验平台
0个评论
asoc之动态PCM
0个评论
ADS7928
0个评论
基于AD9957实现射频数字化变频模块和AD转换模块的方案详细教程
0个评论
多功能车载DVD智能导航平台
0个评论
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
#include<STC12C5A60S2.H>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
//#define N 800
sbit SDATA_595 = P2^5; //串行移位输入
sbit SHcp_595 = P2^7; //移位寄存器时钟输入SHcp
sbit STcp_595 = P2^6; //存储寄存器时钟输入STcp
sbit fengmingqi=P2^0;
unsigned int time=0;
unsigned int timer=0;
unsigned int t=0;
unsigned char posit=0;
unsigned long S=0;
bit flag =0;
unsigned char const discode[] ={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xBF,0xff/*-*/};
unsigned char const positon[3]={0x10,0x08,0x04};
unsigned char disbuff[4]={0,0,0,0,};
sbit RX=P1^2;
sbit TX=P1^3;
sbit Q1=P1^4;
sbit Q2=P1^0;
sbit Q3=P1^1;
sbit K1=P1^7;
sbit K2=P1^6;
sbit K3=P1^5;
sbit K4=P2^1;
sbit S1=P2^2;
sbit S2=P2^3;
unsigned char rec[50];
unsigned char code error[]={0x40,0x30,0x46,0x2a,0x2a,0x37,0x36,0x0d};
unsigned char send[]={0x40,0x30,0x46,0x30,0x31,0x00,0x00,0x00,0x00,0x0d};
unsigned char i;
unsigned char ath(unsigned char,unsigned char);
unsigned int hta(unsigned char);
void uart(void);
//void delay(uint);
/*-----------延时子程序---------
void delay(uint z)
{
uint a;
for(;z>0;z--)
for(a=100;a>0;a--);
}
*/
void OUT_595(void)
{
STcp_595 = 0;
_nop_();
_nop_();
STcp_595=1; //上升沿将数据送到输出锁存器
_nop_();
_nop_();
STcp_595 = 0 ;
}
void WR_595(uchar x)
{
uchar temp;
uchar j;
temp = x;
SHcp_595 = 0;
for (j=0; j<8; j++)
{
temp = temp<<1;
SDATA_595 = CY;
SHcp_595 = 1; //上升沿发生移位
_nop_();
_nop_();
SHcp_595 = 0;
_nop_();
_nop_();
}
OUT_595();
}
/*void baojing()
{
uchar x,i;
x=0xfe;
fengmingqi=1;
for(i=0;i<8;i++)
{
WR_595(x);
delay(N);
x=(x<<1)|0x01;
delay(N);
}
}
*/
void Display(void) //扫描数码管
{
if(++posit>=3)
posit=0;
P3=positon[posit] ;
if(posit==1)
{
P0=(discode[disbuff[posit]])&0x7f;
}
else
{
P0=discode[disbuff[posit]];
}
}
void Conut(void)
{
unsigned int a,b;
time=TH0*256+TL0;
TH0=0;
TL0=0;
S=130-(time*17)/100; //算出来是CM x10
if((S>=700)||flag==1) //超出测量范围显示“-”
{
flag=0;
disbuff[0]=10; //“-”
disbuff[1]=10; //“-”
disbuff[2]=10; //“-”
}
else
{
disbuff[0]=S%1000/100;
disbuff[1]=S%1000%100/10;
disbuff[2]=S%1000%100%10;
}
if(S<=55||S>=95)
{
WR_595(0x00);
fengmingqi=1;
}
else
{
WR_595(0xff);
fengmingqi=0;
}
if(K1==1&&K2==1&&S<=50){Q1=0;Q2=1;}
if(K1==1&&K2==0&&S<=50){Q2=0;Q1=1;}
if(K1==1&&S>=100){Q1=1;Q2=1;}
if(K1==1&&S1==0&&S2==1){Q3=0;t=1;}
if(K1==1&&S1==0&&S2==0&&t==1)Q3=0;
if(K1==1&&S1==0&&S2==0&&t==0)Q3=1;
if(K1==1&&S1==1&&S2==0){Q3=1;t=0;}
if(K1==0&&K3==1){Q1=1;Q2=1;}
if(K1==0&&K2==1&&K3==0){Q1=0;Q2=1;}
if(K1==0&&K2==0&&K3==0){Q1=1;Q2=0;}
if(K1==0&&K4==0)Q3=0;
if(K1==0&&K4==1)Q3=1;
a=hta(S);
send[5]=a>>8;
send[6]=(unsigned char)a;
b=0;
for(a=1;a<7;a++)b^=send[a];
b=hta(b);
send[7]=b>>8;
send[8]=(unsigned char)b;
}
/********************************************************/
void zd0() interrupt 1 //T0中断用来计数器溢出,超过测距范围
{
flag=1; //中断溢出标志
}
/********************************************************/
void zd3() interrupt 3 //T1中断用来扫描数码管和计400MS启动模块
{
TH1=(65536-2000)/256;
TL1=(65536-2000)%256;
Display();
timer++;
if(timer>=200)
{
timer=0;
TX=1; //400MS 启动一次模块
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TX=0;
}
}
void uart(void) interrupt 4
{
unsigned char a,b;
if(RI)
{
a=SBUF;
RI=0;
if(a==0x40)i=0;
rec=a;
i++;
if(a==0x0d)
{
if(ath(rec[1],rec[2])==15)
{
b=0;
for(a=1;a<i-3;a++)b^=rec[a];
if(b==ath(rec[i-3],rec[i-2]))
{
if((ath(rec[3],rec[4])&0x01)==0)
{
for(a=0;a<10;a++)
{
SBUF=send[a];
while(TI!=1);
TI=0;
}
}
}
else
{
for(a=0;a<8;a++)
{
SBUF=error[a];
while(TI!=1);
TI=0;
}
}
}
}
}
else
{
TI=0;
}
}
/*********************************************************/
unsigned char ath(unsigned char a,unsigned char b)
{
if(a<0x40)a-=0x30;
else if(a<0x47)a-=0x37;
else if(a<67)a-=0x57;
if(b<0x40)b-=0x30;
else if(b<0x47)b-=0x37;
else if(b<67)b-=0x57;
return((a<<4)+b);
}
unsigned int hta(unsigned char a)
{
unsigned int b;
b=a>>4;
a&=0x0f;
if(a<0x0a)a+=0x30;
else a+=0x37;
if(b<0x0a)b+=0x30;
else b+=0x37;
b=((b<<8)+a);
return b;
}
void main(void)
{
unsigned char i=0;
TMOD=0x11; //设T0为方式1,GATE=1;
TH0=0;
TL0=0;
TH1=(65536-2000)/256; //2MS定时
TL1=(65536-2000)%256;
ET0=1; //允许T0中断
ET1=1; //允许T1中断
TR1=1; //开启定时器
SCON=0x50;
BRT=0xfd;
AUXR=0x11;
EA=1;ES=1; //开启总中断
while(1)
{
while(!RX); //当RX为零时等待
TR0=1; //开启计数
while(RX); //当RX为1计数并等待
TR0=0; //关闭计数
Conut(); //计算
}
}
一周热门 更多>