#define uchar unsigned char #define uint unsigned int sbit LEDREDCON=P0^0; sbit LEDGREENCON=P0^1; sbit spe=P2^0; sbit Kint0=P3^2; sbit Kint1=P3^3; uchar FRQ=0x00;
进入中断0 绿灯灭,关闭显示 否 判断中断0键是否按下 是 数码管显示为0,红灯闪 蜂鸣器出现报警声 否 中断1是否出现 是 结束 中断0程序流程图
void delay(uint ms) {
uchar i;  while(ms--)  {
for(i=0;i<9;i++);  } }
void init()       //初始化子函数 {
P1 = 0x00;  TMOD = 0x11;  TH0  = 0x00;  TL0  = 0xff;  IT0  = 1;  IT1  = 1;
IE   = 0x8f;//EA=1;ET1=1;EX1=0;ET0=1;EX0=1;  IP   = 0x05;  TR0  = 0;  TR1  = 0; }
void main() {
init();  while(1)  {
FRQ++;   delay(1);  }               }
void external_int0() interrupt 0   //中断0  {
LEDGREENCON==1;  //绿灯灭  P1=0x00;  //关闭显示屏         if(LEDREDCON==1)     {     LEDREDCON=0;      }   else      {
LEDREDCON=1;      }
while(!Kint0);    //中断0键按下的时候    delay(15);       P1=0x3f;    //输出显示为0    while(Kint1!=0)   //中断1不出现的时候    {      delay(15);       spe=~spe;  //扬声器发声      LEDREDCON=0;  //红灯亮      delay(10);         LEDREDCON=1;  //红灯灭      delay(10);     }       }
void external_int1() interrupt 2 {
LEDREDCON=1;  P1=0x00;
if(LEDGREENCON==1)     {    LEDGREENCON=0;   }   else    {    LEDGREENCON=1;   }   if(Kint1==0)   {    while(!Kint1);  //中断1键按下时    delay(10);    P1=0x06;   // 数码管显示为1    while(Kint0!=0) //当中断0键不按下的时候      {      LEDGREENCON=0;  //绿灯亮      delay(15);      LEDGREENCON=1;   //绿灯灭      delay(15);         spe=~spe; //电平取反 扬声器出现报警声      delay(10);    }
} }
五 仿真实验图
六  实验中所遇到到得问题以及解决方法
问题一 程序出现问题,导致当按下中断0键时,间隔出现显示数据和亮灯,并且红灯一直不闪
问题中断程序如下
void external_int0() interrupt 0 {
write_command(0x01);  LEDGREENCON=1;     count1++;  if(count1==1)  {   if(LEDREDCON==1)   {    LEDREDCON=0;
}   else
{LEDREDCON=1;  }   if(Kint0==0)   {    while(!Kint0);    delay(5);    LEDREDCON=0;    write_data('0');    spe=1;   }  }
if(count1==2)  {   count1=0;
LEDREDCON=1;   write_command(0x01);  }
}
void timer0() interrupt 1
{
TH0=0xfe;  TL0=FRQ;  spe=~spe; }
计数出现错误。将采用定时器直接废除,直接启用延时程序改出的程序如下
void external_int0() interrupt 0   //中断0
{
LEDGREENCON==1;  //绿灯灭  P1=0x00;  //关闭显示屏         if(LEDREDCON==1)     {     LEDREDCON=0;      }   else      {    LEDREDCON=1;      }
while(!Kint0);    //中断0键按下的时候
delay(15);
P1=0x3f;    //输出显示为0  while(Kint1!=0)   //中断1不出现的时候  {    delay(15);     spe=~spe;  //扬声器发声    LEDREDCON=0;  //红灯亮    delay(10);
LEDREDCON=1;  //红灯灭    delay(10);   }
}
问题二  扬声器一直没有声音,出现声音之后也一直为噪声        扬声器没有声音,一个原因是因为输出口设错了,另外一个就是没有持续的变化高低电平,将spe=1改为spe=~spe,另外声音不好听,改变延时来改变声音的音质。
问题三  在焊完电路后,复位键无效,数码管无任何显示
检查复位电路之后,发现按键没有焊好,数码管没有接电源,所以无任何显示。
问题四   在软件仿真中,发光二极管有明显的闪烁现象,但是在实体中无任何现象
修改程序,将延时延长,因为软件中的延时比硬件中的要快,硬件反应要慢一些,所以延时需要加长
问题五    当中断0和1出现的时候显示出现错误
按照数码管显示推出显示0和1的设置确实为0x3f和0x06, 检
查各个引脚之后,复位之后,发现其中一段数码管坏掉。改选另一位好的数码管         五,实验心得
在此次单片机课程设计中,从编程到用protus画电路图,到焊板子,遇到很多问题,同时体会遇到问题的无助和解决问题的快乐。
由于以前学单片机用的是汇编,对于单片机用c语言写代码,用的不是很多,通过这一次的课程设计对将c语言应用于单片机编程有一个理性的认识,对整体的结构有一个很好的了解,也加强了对c语言的应用能力。
在实验过程中,很多知识我们并不是很清楚,在碰到这种问题的情况下,最好一般先去百度,查资料,不要不经过大脑思考就去问同学,这样是很不明智的,先去百度,这样既可节省对方的时间,也可以提高自己的学习力。
另外一个很大的收获就是在学习使用软件方面,对keil和protus的使用,在刚开始使用protus的时候,选器件都要花很长的时间,经过向同学的请教,慢慢的解决了这些问题。
在此次单片机课程设计中,我深深的体会了学习态度对一个人的影响,对于我自己来说,以前很多实验都不认真,学习中遇到问题也不积极解决问题,所以收获进步很小,在本次课程设计当中,受到老师的鼓励和同学的影响,遇到很多问题的我并没有气馁,而是不断的思考和请教,学习效果颇好。