BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / embedded-system / #10916同步于 2011/7/21
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Embedded_System机器人发帖

单片机中断的一些小问题。

jmxdj
2011/7/21镜像同步1 回复
“#include <REG51.H> #define uchar unsigned char #define uint unsigned int uchar code SEG7[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; uchar code ACT[4]={0xfe,0xfd,0xfb,0xf7}; /***********************************************************/ sbit D0=P1^0; sbit D1=P1^1; sbit D2=P1^2; sbit D3=P1^3; sbit D4=P1^4; sbit D5=P1^5; sbit D6=P1^6; sbit D7=P1^7; #define ON 0 #define OFF 1 uchar a[2]; uchar cnt; bit outflag; /****************************************/ void delay(uint k) { uint data i,j; for(i=0;i<k;i++) { for(j=0;j<121;j++){;} } } /**************************************/ void init(void) { TMOD=0x20; TH1=0xfd; TL1=0xfd; SCON=0x50; TR1=1; ES=1; EA=1; } /****************************************/ void main(void) { init(); while(1) { P0=SEG7[a[0]];P2=ACT[2];delay(1); P0=SEG7[a[1]];P2=ACT[0];delay(1); if(outflag==1) { switch(a[0]) { case 1:if(a[1]==1)D0=ON;else D0=OFF;break; case 2:if(a[1]==1)D1=ON;else D1=OFF;break; case 3:if(a[1]==1)D2=ON;else D2=OFF;break; case 4:if(a[1]==1)D3=ON;else D3=OFF;break; case 5:if(a[1]==1)D4=ON;else D4=OFF;break; case 6:if(a[1]==1)D5=ON;else D5=OFF;break; case 7:if(a[1]==1)D6=ON;else D6=OFF;break; case 8:if(a[1]==1)D7=ON;else D7=OFF;break; default:break; } outflag=0; } } } /******************************************/ void serial_serve(void) interrupt 4 { uchar temp; RI=0; EA=0; temp=SBUF; switch(cnt) { case 0:if(temp=='#')cnt=1;else outflag=0;break; case 1:if((temp>0x30)&&(temp<0x39)){a[0]=temp-0x30;cnt=2;}else outflag=0;break; case 2:if(temp=='(')cnt=3;else outflag=0;break; case 3:if((temp>=0x30)&&(temp<=0x38)){a[1]=temp-0x30;cnt=4;}else outflag=0;break; case 4:if(temp==')'){cnt=0;outflag=1;}else outflag=0;break; default:break; } EA=1; } ”发送失败。 重新发送 emulate the deserv(343557513) 13:25:56 #include <REG51.H> #define uchar unsigned char #define uint unsigned int uchar code SEG7[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; uchar code ACT[4]={0xfe,0xfd,0xfb,0xf7}; /***********************************************************/ sbit D0=P1^0; sbit D1=P1^1; sbit D2=P1^2; sbit D3=P1^3; sbit D4=P1^4; sbit D5=P1^5; sbit D6=P1^6; sbit D7=P1^7; #define ON 0 #define OFF 1 uchar a[2]; uchar cnt; bit outflag; /****************************************/ void delay(uint k) { uint data i,j; for(i=0;i<k;i++) { for(j=0;j<121;j++){;} } } /**************************************/ void init(void) { TMOD=0x20; TH1=0xfd; TL1=0xfd; SCON=0x50; TR1=1; ES=1; EA=1; } /****************************************/ void main(void) { init(); while(1) { P0=SEG7[a[0]];P2=ACT[2];delay(1); P0=SEG7[a[1]];P2=ACT[0];delay(1); if(outflag==1) { switch(a[0]) { case 1:if(a[1]==1)D0=ON;else D0=OFF;break; case 2:if(a[1]==1)D1=ON;else D1=OFF;break; case 3:if(a[1]==1)D2=ON;else D2=OFF;break; case 4:if(a[1]==1)D3=ON;else D3=OFF;break; case 5:if(a[1]==1)D4=ON;else D4=OFF;break; case 6:if(a[1]==1)D5=ON;else D5=OFF;break; case 7:if(a[1]==1)D6=ON;else D6=OFF;break; case 8:if(a[1]==1)D7=ON;else D7=OFF;break; default:break; } outflag=0; } } } /******************************************/ void serial_serve(void) interrupt 4 { uchar temp; RI=0; EA=0; temp=SBUF; switch(cnt) { case 0:if(temp=='#')cnt=1;else outflag=0;break; case 1:if((temp>0x30)&&(temp<0x39)){a[0]=temp-0x30;cnt=2;}else outflag=0;break; case 2:if(temp=='(')cnt=3;else outflag=0;break; case 3:if((temp>=0x30)&&(temp<=0x38)){a[1]=temp-0x30;cnt=4;}else outflag=0;break; case 4:if(temp==')'){cnt=0;outflag=1;}else outflag=0;break; default:break; } EA=1; } 这段程序中,cnt是做什么用的?a[]又是怎么用的?通过串口助手,输入进去字符,相当于输入给哪个变量的呢? 这段程序,书上是这样讲的: PC机发送控制指令给单片机,单片机收到后即控制D0~D7这8个发光管的亮、灭,同时收到的指令参数在个位、百位数码管上进行显示。说明:百位数码管显示发光管编号(1~8),个位数码管显示发光管的亮、灭。(1为亮,0为灭)
订阅后,新回复会通过你的通知中心匿名送达。
1 条回复
hobby机器人#1 · 2011/7/25
呃 好多源码。。。 楼主你觉得哪儿有问题说明一下,要不大家得要花时间从头读程序