基于51单片机抢答器的课程设计 下载本文

西安文理学院课程设计报告

sbit D7=P1^7;

unsigned char num=0;

unsigned char a=30,b=60,n=0,qd,hd,d; void display(); void delay1ms() {

unsigned char i,j; for(i=0;i<10;i++) for(j=0;j<33;j++) ; }

void delay(unsigned char n) {

unsigned char i; for(i=0;i

void nopp(unsigned char n) {

unsigned char i; for(i=0;i

bit lcd_bz() {

bit result;

RS=0; //根据规定,RS为低电平,RW为高电平时,可以读状态 RW=1;

E=1; //E=1,才允许读写 nopp(4); //空操作四个机器周期,给硬件反应时间 result=(bit)(P0&0x80); //将忙碌标志电平赋给result E=0;

return result; }

void WriteInstruction (unsigned char dictate) {

while(lcd_bz()==1); //如果忙就等待

RS=0; //根据规定,RS和R/W同时为低电平时,可以写入指令 RW=0;

E=1; //E置低电平

nopp(2); //空操作两个机器周期,给硬件反应时间

P0=dictate; //将数据送入P0口,即写入指令或地址 nopp(4); //空操作四个机器周期,给硬件反应时间 E=1; //E置高电平(正跳变)

第12页

西安文理学院课程设计报告

nopp(4);//空操作四个机器周期,给硬件反应时间

E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令 }

void WriteData(unsigned char y) {

while(lcd_bz()==1);

RS=1; //RS为高电平,RW为低电平时,可以写入数据 RW=0;

E=1; //E置低电平

P0=y; //将数据送入P0口,即将数据写入液晶模块 nopp(4);//空操作四个机器周期,给硬件反应时间 E=1; //E置高电平(正跳变)

nopp(4);//空操作四个机器周期,给硬件反应时间

E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令 }

void LcdInitiate(void) {

delay(15); //延时15ms,首次写指令时应给LCD一段较长的反应时间

WriteInstruction(0x30); //显示模式设置:8位数据,16×2显示,5×7点阵, delay(5); //延时5ms WriteInstruction(0x38); delay(5);

WriteInstruction(0x0c); //显示模式设置:显示开,有光标,光标闪烁 delay(5);

WriteInstruction(0x06); //显示模式设置:光标右移,字符不移 delay(5);

WriteInstruction(0x01); //清屏幕指令,将以前的显示内容清除 delay(5); }

void Display(unsigned char string[]) {

unsigned char i; i = 0;

while(string[i] != '\\0')

{ // 显示字符 WriteData(string[i]); i++; } }

/*void bark() { ring=1; delay(10); ring=0;

第13页

西安文理学院课程设计报告

} */

void answer() { ring=1; delay(500); ring=0; WriteInstruction(0x01); delay(1); Display(\ go! \ TR1=1 ; qd=1; d=a; while(1){ //TR0=1; if(!D0){n=1; break;} if(!D1){n=2; break;} if(!D2){n=3; break; } if(!D3){n=4; break; } if(!D4){n=5; break; } if(!D5){n=6; break; } if(!D6){n=7; break; } if(!D7){n=8; break;} } WriteInstruction(0x01); switch(n) { case 1:Display(\ case 2:Display(\ case 3:Display(\ case 4:Display(\ case 5:Display(\ case 6:Display(\ case 7:Display(\ case 8:Display(\ } n=0;

第14页

西安文理学院课程设计报告

//WriteInstruction(0x01); delay(5000); d=b; while(d+1) ; } void display() {

unsigned char tm[3]={0x20,0,0}; unsigned char a1,b1; a1=d/10; tm[1]=a1+0x30; b1=d; tm[2]=b1+0x30;

WriteInstruction(0x01); delay(1); Display(tm); }

void main(void) //主函数 { TMOD=0X11; //选择定时器方式1 TH0=0X00; //给定时器赋处置 TL0=0XFF; TH1=0X3C; TL1=0XB0; EA=1; ET1=1; //开总中断 EX0=1; ET0=1; EX1=1; TR1=1;

LcdInitiate(); //调用LCD初始化函数 Display(\ while(1){ if(start) { if(!(D0&D1&D2&D3&D4&D5&D6&D7)) { WriteInstruction(0x01); delay(1); Display(\ error \ ring=1; delay(500); ring=0; delay(500);

第15页

西安文理学院课程设计报告

WriteInstruction(0x01); } } else answer(); } }

void Int0() interrupt 0 //中断服务程序 { WriteInstruction(0x01); Display(\ setting qd_tm\ delay(1000); WriteInstruction(0x01); d=a; display(); while(1) {if(!add) { a++; d=a; display(); delay(500); } else if(!sub) { a--;d=a; display(); delay(500);} if(!ok) break;} }

void T0_timer() interrupt 1 //中断服务程序 { TH0=0X00; TL0=0XFF; ring=0; }

void Int1() interrupt 2 //中断服务程序 {

WriteInstruction(0x01); delay(1); Display(\ setting hd_tm\ delay(1000); WriteInstruction(0x01); d=b; display();

第16页

西安文理学院课程设计报告

while(1) {if(!add) { b++; d=b; display(); delay(500); } else if(!sub) { b--;d=b; display(); delay(500);} if(!ok) break; } }

void T1_timer() interrupt 3 //中断服务程序 { TH1=0X3C; //重装初值 TL1=0XB0; num++; if(num==20) { num=0;

display(); d--; } if(d==0) { TR1=0 ; ring=1; delay(500); ring=0; } }

第17页