#include #define uchar unsigned char #define uint unsigned int sbit P27=P2^7; sbit K5=P1^4; sbit fmq=P3^6; uchar num; unsigned char code s8[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; void delay1ms(uint i) {uchar j; while(i--) {for(j=0;j<115;j++) //1ms基准延时程序 {;} } } void beep() //产生1KHZ频率声音的函数 { fmq=0; delay500us(); 1 fmq=1; delay500us(); } void delay500us() { unsigned char j; for(j=0;j<57;j++) //500us基准延时程序 {; } } void main() { uchar t; P27=0; while(1){ if(K5==0){ delay1ms(15); if(K5==0){ for(t=0;t<100;t++) { beep();} num=num+1; if(num==16){ num=0; } 2 while(!K5);//等待按键释放 } } P0=s8[num]; } } #include #define uchar unsigned char //数据类型的宏定义 #define uint unsigned int //数据类型的宏定义 sbit P27=P2^7; unsigned char code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xBF}; //共阳数码管显示字型码数组 1011 1111 \"-\" void delay1ms(uint i) { uchar j; while(i--) { for(j=0;j<115;j++); //1ms基准延时程序 3 } } void display(unsigned char i) { P27=0; //选通最有端的数码管显示 P0=table[i]; //显示i参数传来的字型码 } void main(void) { unsigned char temp; display(16); //初始显示 \"-\" while(1) { P1=0xff; //先向P1口写1;端口读状态 P1=0xf0; temp=P1; if(temp!=0xf0) { delay1ms(15); if(temp!=0xf0) { P1=0xfe; 4 temp=P1; switch(temp) { case(0xee):display(0);break; case(0xde):display(1);break; case(0xbe):display(2);break; case(0x7e):display(3);break; } P1=0xfd; temp=P1; switch(temp) { case(0xed):display(4);break; case(0xdd):display(5);break; case(0xbd):display(6);break; case(0x7d):display(7);break; } P1=0xfb; temp=P1; switch(temp) { 5 case(0xeb):display(8);break; case(0xdb):display(9);break; case(0xbb):display(10);break; case(0x7b):display(11);break; } P1=0xf7; temp=P1; switch(temp) { case(0xe7):display(12);break; case(0xd7):display(13);break; case(0xb7):display(14);break; case(0x77):display(15);break; } } } } } /*行线接P1.0-P1.3,列线接P1.4-P1.7。 根据线反转法扫描键盘返回的键值编码查键值编码表,从而得到键值并送数码管显示。 开机时,数码管显示“-”。*/ 6 #include unsigned char code disp_code[]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf}; unsigned char code key_code[]={ 0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d, 0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77}; void delay1ms(uint i) { uchar j; while(i--) { for(j=0;j<115;j++) //1ms基准延时程序 {;} } } 7 void delay500us() { unsigned char j; for(j=0;j<57;j++) //500us基准延时程序 { ;} } void beep() //产生1KHZ频率声音的函数 { fmq=0; delay500us(); fmq=1; delay500us(); } /********************************************************** 键盘扫描子函数 **********************************************************/ uchar keyscan() { uchar scan1,scan2,keycode,j; P1=0xf0; 8 scan1=P1; if((scan1&0xf0)!=0xf0) //判键是否按下 { delay1ms(20); //延时20ms scan1=P1; if((scan1&0xf0)!=0xf0) //二次判键是否按下 { P1=0x0f; //线反转法的核心 scan2=P1; keycode=scan1|scan2; //组合成键编码 for(j=0;j<=15;j++) { if(keycode== key_code[j]) //查表得键值 { key=j; return(key); } } } } else P1=0xff; //P1口写1 输入状态 9 return (16);//\"-\" } main() { uchar tt; P0 = 0xbf; P27 =0; //数码管显示\"-\" P1 = 0xff; while(1) { P1=0xf0; if((P1&0xf0)!=0xf0){ keyscan(); P0=disp_code[key]; for(tt=0;tt<200;tt++) { beep();} fmq=1; delay1ms(200); } } } 10 中断 #include #define uint unsigned int #define uchar unsigned char sbit dula=P2^6; sbit wela=P2^7; sbit d1=P1^0; uchar num; uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; void delay(uint z); void main() { EA=1;//开总中断 EX0=1;//开外部中断0 //IT0=1; //TCON=0x01; wela=1;//11101010 P0=0xea; 11 wela=0; while(1) { for(num=0;num<16;num++) { d1=1; dula=1; P0=table[num]; dula=0; delay(1000); } } } void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void exter0() interrupt 0 { d1=0; 12 } 定时器 #include //TMOD=0X00;//设定定时器0为工作方式0 TMOD=0X01;//设定定时器0为工作方式1 //TH0=(8192-5000)/32; //TL0=(8192-5000)%32; 13 TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1;//开总中断 ET0=1;//开定时器0中断 TR0=1;//启动定时器0 wela=1; P0=0x24; wela=0; dula=1; P0=0x3f; dula=0; while(1) { if(aa==20) { aa=0; num++; if(num==10) num=0; dula=1; P0=table[num]; dula=0; 14 } } } void timer0() interrupt 1 { //TH0=(8192-5000)/32; //TL0=(8192-5000)%32; TH0=(65536-50000)/256; TL0=(65536-50000)%256; aa++; } 中断控制LED //用定时器T0的中断控制1位LED闪烁 #include /************************************************************** 函数功能:主函数 **************************************************************/ void main(void) 15 { i=0; EA=1; //开总中断 ET0=1; //定时器T0中断允许 TMOD=0x01; //使用定时器T0的模式1 TH0=(65536-50000)/256; //定时器T0的高8位赋初值 TL0=(65536-50000)%256; //定时器T0的高8位赋初值 TR0=1; //启动定时器T0 while(1);//无限循环等待中断 } /************************************************************** 函数功能:定时器T0的中断服务程序 **************************************************************/ void Time0(void) interrupt 1 using 0 //“interrupt”声明函数为中断服务函数 //其后的1为定时器T0的中断编号;0表示使用第0组工作寄存器 { 16 i=i+1; if(i==40){ D0=~D0; //按位取反操作,将P0.0引脚输出电平取反 i=0; } TH0=(65536-50000)/256; //定时器T0的高8位重新赋初值 TL0=(65536-50000)%256; //定时器T0的高8位重新赋初值 } 中断控制LED2 #include ******************************************/ void main(void) { EA=1; //开放总中断 EX0=1; //允许使用外中断 IT0=1; //选择负跳变来触发外中断 P0=0xff; //关闭所有P0口的LED灯 while(1); //无限循环, } 17 /************************************************************** 函数功能:外中断T0的中断服务程序 **************************************************************/ void it0(void) interrupt 0 using 0 //外中断0的中断编号为0 { P0=~P0; //每产生一次中断请求,P0取反一次。} 串口查询 #include void send_char(unsigned char txd); main() { TMOD = 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率 TH1=TL1=0xFD; // 波特率9600 SCON = 0x50; // 设定串行口工作方式1 允许接收,相当于下面三句 //SM0=0; //SM1=1; 18 //REN=1; PCON =0x00; // 波特率不倍增 TR1 = 1; // 启动定时器1 while(1) { if(RI==1) // 是否有数据到来 { RI = 0; tmp = SBUF; // 暂存接收到的数据 P0 = tmp; // 数据传送到P0口 send_char(tmp); // 回传接收到的数据 } } } void send_char(unsigned char txd) // 传送一个字符 { SBUF = txd; while(!TI); // 等特数据传送 TI = 0; // 清除数据传送标志 } 19 串口通讯 #include #define uchar unsigned char #define uint unsigned int uchar idata trdata[]={'R','I','C','H','M','C','U','R','Z','-','5','1','V','2','.','0',0x0d,0x0a,0x00}; sbit K1=P3^2; //对应开发板K1按键 /*-------------------------------------------------------------*/ //串口初始化 void UART_Init(void) { SCON = 0x50; //串口工作方式为1 , 串行允许接收 //SM0=0; //SM1=1; //REN=1; TMOD = 0x20; //定时器1 工作在方式2 //PCON = 0x80; //SMOD = 1; 波特率加倍 TH1 = 0xfd; //波特率 9600bps fosc=\"11\".0592MHz TL1 = 0xfd; ES = 1; //开串口中断 20 TR1 = 1; //允许定时器1工作 EA = 1; //开总中断 } void delay1ms(uint i) { uchar j; while(i--) { for(j=0;j<115;j++) //1ms基准延时程序 { ; } } } /*-------------------------------------------------------------*/ //串口发送一个字节 void Uart_SendChar(unsigned char dat) { SBUF = dat; //待发送的数据写入缓冲区 while(!TI); //等待发送完成 TI = 0; //清零发送标志位 21 } /*-------------------------------------------------------------*/ //串口发送一个字符串 void Uart_SendString() { uchar i=0; while(trdata[i]!=0x00) { SBUF=trdata[i]; while(!TI); TI=0; i++; } } /*-------------------------------------------------------------*/ //主函数 void main(void) { UART_Init(); //初始化串口 while(1) 22 { if(K1==0) { delay1ms(20); if(K1==0) { Uart_SendString(); //发送数据 while(!K1); //等待按键释放 } } } } /*-------------------------------------------------------------*/ //串口接收中断函数 void INT_UartRcv(void) interrupt 4 { unsigned char Rcv = 0; if(RI) //查询接收标志位(有数据发送过来时置为1) { RI = 0; //接收标志位清零 Rcv = SBUF; //存储缓冲区的数据 23 P0=SBUF; Uart_SendChar(Rcv); //让从计算机上传到单片机的数据 , 传回的计算机显示 } } //用LED数码管显示计数器对T0的计数值 #include char Tab[ ]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //段码表 unsigned char x; sbit P34=P3^4; void delay1ms(unsigned int i) { unsigned char j; while(i--) { for(j=0;j<115;j++) //1ms基准延时程序 {;} } } void Display(unsigned char x) 24 { P2=0xdf; //P2.6引脚输出低电平,DS6点亮 P0=Tab[x/100]; //显示十位 delay1ms(5); P2=0xbf; //P2.6引脚输出低电平,DS6点亮 P0=Tab[x%100/10]; //显示十位 delay1ms(5); P2=0x7f; //P2.7引脚输出低电平,DS7点亮 P0=Tab[x%10]; //显示个位 delay1ms(5); P2=0xff; } /******************************************* 函数功能:主函数 ******************************************/ void main(void) { TMOD=0x06; // TMOD=0000 0110B,使用计数器T0的模式2 EA=1; //开总中断 ET0=1; //允许定时器T0的中断 EX0=1; //允许外中断INT0 25 IT0=1; //INT0为下负脉冲触发方式 TR0=1; //启动T0 TH0=TL0=256-1; //计数器T0高8位赋初值 255 while(1) //无限循环,不停地将TL0计数结果送P1口 { //x=TL0; Display(x); } } //INT0终端函数 void clear0() interrupt 0 { x=0;} //T0 计数器中断 void Key_counter() interrupt 1 { if(P34==0){ delay1ms(20); if(P34==0){ x=(x+1)%1000; //因为是3位数码管显示 所以要把计的数控制在1000以内(000~999) } 26 } } 外中断字符查询 #include code trdata[]={'R','I','C','H','M','C','U',0x0d,0x0a,0x00}; void delay1ms(uint i) { uchar j; while(i--) { for(j=0;j<115;j++) //1ms基准延时程序 {;} } } main() { uchar i; 27 SCON= 0x40; //串口方式1不允许接收 //SM0=0; //SM1=1; //REN=0; PCON=0x80; //SMOD=0 TMOD= 0x20; //定时器1定时方式2 TH1= 0xff; //11.0592M 57600波特率 TL1= 0xff; TR1= 1; //启动定时器 while(1) { i=0; while(trdata[i]!=0x00) { SBUF=trdata[i]; while(!TI); TI=0; i++; } delay1ms(1000); } 28 } 29 因篇幅问题不能全部显示,请点此查看更多更全内容