单片机课程设计——日历时钟与键盘显示程序设计姓名:管曌学号:3081109003班级:J通信0801指导老师:熊书明日历时钟与键盘显示程序设计一、设计目的(1)能在LED显示器上实现正常的时分秒计时(2)能通过键盘输入当前时间,并从该时间开始计时(3)有校时、校分功能(4)有报时功能,通过指示灯表示(5)有闹时功能,闹时时间可以设定,通过指示灯表示二、设计内容该课程设计是利用MCS-51单片机内部的定时/计数器、中断系统、以及行列键盘和LED显示器等部件,设计一个单片机电子时钟。
设计的电子时钟通过数码管显示,并能通过按键实现设置时间和暂停、启动控制等。
三、MCS-51单片机系统简介单片机应用系统由硬件系统和软件系统两部分组成。
硬件系统是指单片机以及扩展的存储器、I\O接口、外围扩展的功能芯片以及接口电路。
软件系统包括监控程序和各种应用程序。
在单片机应用系统中,单片机是整个系统的核心,对整个系统的信息输入、处理、信息输出进行控制。
与单片机配套的有相应的复位电路、时钟电路以及扩展的存储器和I\O接口,使单片机应用系统能够运行。
在一个单片机应用系统中,往往都会输入信息和显示信息,这就涉及键盘和显示器。
在单片机应用系统中,一般都根据系统的要求配置相应的键盘和显示器。
配置键盘和显示器一般都没有统一的规定,有的系统功能复杂,需输入的信息和显示的信息量大,配置的键盘和显示器功能相对强大,而有些系统输入/输出的信息少,这时可能用几个按键和几个LED指示灯就可以进行处理了。
在单片机应用系统在中配置的键盘可以是独立键盘,也可能是矩阵键盘。
显示器可以是LED指示灯,也可以是LED数码管,也可以是LCD显示器,还可以使用CRT显示器。
单片机应用系统中键盘一般用的比较多的是矩阵键盘,显示器用的比较多的是LED数码管还LCD显示器。
四、设计方案通过键盘输入,设置当前时间存入S-3530A,然后从S-3530A读取实时时间并显示在七段码LED显示上,键盘和LED显示通过键盘专用芯片HD7279A进行控制,7279A也是I2C总线接口的芯片,系统中采用并行口线模拟I2C实现C8051F020和HD7279A的通信,用硬件实现S-3530A和HD7279A的连接。
用定时/计数器T0,工作于定时,采用方式1,对系统时钟进行定时计数,初值设为23时59分50秒。
定时时间为50ms。
用片内RAM的7BH单元对50ms 计数,计20次产生秒计数器78H单元加1,秒计数器加到60则分计数器79H单元加1,分计数器加到60则时计数器7AH单元加1,时计数器加到24则时计数器清0。
然后把秒、分、时计数器分成十位和个位放到8个数码管的显示缓冲区,通过数码管显示出来。
显示格式为小时十位、小时个位---分十位、分个位---秒十位、秒个位。
在处理过程中加上了按键判断程序,能对按键处理,1是时加一,2是时减一,3是分加一,4是分减一,5是秒清零,D是闹钟时间的设定,E 是进行校时,F是暂停键。
五、系统软件设计流程:1.主程序流程如图所示:2.时间设定程序流程如图所示:3.闹铃设定流程图如图所示:六、程序#include "c8051f020.h"#include <intrins.h>#include "test7279.h"unsigned char Count1ms,set,set1,set2;// int count;static int time[3]={23,59,50};//current timestatic char disptime[6]={'2','3','5','9','5','0'};//显示时间int dertime[3]={00,00,01};int nowtime[3]={00,01,00};//闹钟时间void Delay1us(unsigned char us){while (us){_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); //占用一个指令周期--us;}}void SYSCLK_Init (void){int i;OSCXCN = 0x67;for (i=0; i < 256; i++) ;while (!(OSCXCN & 0x80)) ;OSCICN = 0x88;}#define PRT0CF P0MDOUT#define PRT1CF P1MDOUT#define PRT2CF P2MDOUTvoid PORT_Init (void){XBR0 = 0x07;XBR1 = 0x00;XBR2 = 0x44;EMI0TC = 0x21;P74OUT = 0xFF;P0MDOUT = 0x15;P1MDOUT |= 0x3C;P1 &= 0xc3;}void SPI0_Init (void){SPI0CFG = 0x07;SPI0CFG|=0xC0;SPI0CN = 0x03;SPI0CKR = SYSCLK/2/8000000-1;}void Timer0_Init (void){CKCON&=0xf7;//12TMOD=0x01; //t0 1TR0 = 0;Count1ms=40;TL0 = 0x58;TH0 = (-SYSCLK/1000) >> 8;TL0 = -SYSCLK/1000;TR0 = 1;IE|= 0x2;}char GetKeyValue(void){char KeyValue;if (CPT1CN&0x40) return -1; //无键按下Send7279Byte(0x15); //发读键盘指令 0001 0101KeyValue=Receive7279Byte();NOSELECT7279; //置CS高电平return KeyValue;}void WaitKeyOff(void){while (!(CPT1CN&0x40));}void inputnum(void) //i=5开始,输入数字显示 disptime[5-i]i=5--0{char j,KeyValue,i;i=5;while(1){KeyValue=GetKeyValue();WaitKeyOff();if(((KeyValue%16)>=0) && ((KeyValue%16)<=9)) // i=5 4 3 2 1{disptime[5-i]=KeyValue;if(((disptime[0]<=1) || ((disptime[0]==2) && (disptime[1]<4))) && (disptime[2]<6) && (disptime[4]<6) ){ Send7279Byte(0xC8+i);Send7279Byte(KeyValue);NOSELECT7279;i--;}}if(i<0) break;}for (j=0;j<3;j++) //int-char{dertime[j]=disptime[2*j]*10+disptime[2*j+1];}if(set1){set1=!set1;// 设置时间}if(set2){set2=!set2;// 设置时间}}void FlashLED(unsigned char No){char i;Send7279Byte(0x88); //发闪烁指令i=0x1;while (No){i=i<<1;No--;}Send7279Byte(~i); //1闪烁NOSELECT7279; //置CS高电平}void main(void){char j,KeyValue;WDTCN = 0xde;WDTCN = 0xad; //关看门狗SYSCLK_Init (); //初始化时钟Timer0_Init(); //初始化定时器PORT_Init (); //初始化IO口SPI0_Init (); //初始化SPI0CPT1CN|=0x80; //使能比较器1REF0CN = 0x03; //使能片内参考电压DAC0CN |= 0x80; //使能DAC0DAC0H=0; DAC0L=0;EA=1; //开中断Delay1us(25000); //等待25ms复位时间Send7279Byte(0xA4); //发复位指令NOSELECT7279;DispLED(disptime,0); //显示初始时间while(1){KeyValue=GetKeyValue();WaitKeyOff();if((KeyValue%16)==0x0f){set=!set;}if(set) //起停*****{if((KeyValue%16)==0x0e){set1=!set1;// 设置时间}if((KeyValue%16)==0x0d){set2=!set2;// 设置闹钟}if(set1)//设置时间**********{DispLED("------",0);inputnum();for (j=0;j<3;j++) //int-char{time[j]=dertime[j];}}if(set2)// 设置闹钟********{ DispLED("------",0);inputnum();for (j=0;j<3;j++) //int-char{nowtime[j]=dertime[j];//nowtime[j]闹钟时间}}}else{switch (KeyValue%16)//校时{case 1:time[0]=(time[0]+1+24)%24;break;case 2:time[0]=(time[0]-1+24)%24;break;case 3:time[1]=(time[1]+1+60)%60;break;case 4:time[1]=(time[1]-1+60)%60;break;case 0xd:FlashLED(8);break;//暂停闪烁default:break;}}}}void Timer0_ISR (void) interrupt 1{int i;TH0 = 0x9e;TL0 = 0x58;if (set==1)return;Count1ms--; // unsigned char Count1ms会小于0,因为无符号会溢出,计数次数变大所以延迟大if (Count1ms==0) //秒{Count1ms=40;time[2]=time[2]+1;if((time[1]==59) && (time[2]==55))//报时功能*********** Send7279Byte(0xbf); //闹钟功能***********if((time[0]==nowtime[0]) && (time[1]==nowtime[1]) && (time[2]==nowtime[2]))Send7279Byte(0xbf);if(((time[1]*60+time[2]-nowtime[1]*60-nowtime[2])>10) && (time[0]==nowtime[0]))FlashLED(8);if (time[2]>=60) //分{time[2]=0;time[1]=time[1]+1;if (time[1]>=60) // 时{time[1]=0;time[0]=time[0]+1;if((time[1]==00) && (time[2]==00))FlashLED(8);if (time[0]>=24){time[0]=0;}}}if (set!=1){for (i=0;i<3;i++) //int-char{disptime[2*i]=time[i]/10;disptime[2*i+1]=time[i]%10;}DispLED(disptime,0); //显示时间************}}}test7279.h#include "c8051f020.h"#include <intrins.h>sbit HD7279_DAT=P1^7;sbit HD7279_CLK=P1^6;#define NOSELECT7279 P5 |= 0x80 //SPICS4(P57)=1#define SELECT7279 P5 &= ~(0x80) //SPICS4(P57)=0; #define Set7279DAT HD7279_DAT=1#define Clr7279DAT HD7279_DAT=0#define Set7279CLK HD7279_CLK=1#define Clr7279CLK HD7279_CLK=0// HD7279测试/演示程序// I/O口初始化void Delay1ms(unsigned char T);void Delay1s(unsigned char T);void Delay1us(unsigned char T);void Send7279Byte(unsigned char ch){char i;SELECT7279; //置CS低电平Delay1us(50); //延时50μfor (i=0;i<8;i++){if (ch&0x80) //输出7位到HD7279A的DATA端 1000 0000{Set7279DAT;}else{Clr7279DAT;}Set7279CLK; //置CLK高电平ch=ch<<1; //待发数据左移Delay1us(8); //延时8μClr7279CLK; //置CLK低电平Delay1us(8); //延时50μ}Clr7279DAT; //发送完毕,DATA端置低,返回}unsigned char Receive7279Byte(void){unsigned char i,ch;ch=0;Set7279DAT; //DATA端置为高电平,输入状态Delay1us(50); //延时50μfor (i=0;i<8;i++){Set7279CLK; //置CLK高电平Delay1us(8); //延时8μch=ch<<1; //接收数据左移1位if (HD7279_DAT)ch+=1; //接收1位数据Clr7279CLK; //置CLK低电平Delay1us(8); //延时8μ}Clr7279DAT; //接收完毕,DATA端重新置成低电平(输出状态)return ch;}void BlankLED(unsigned char ch){Send7279Byte(0x98); //发消隐指令Send7279Byte(ch); //1-显示 0-消隐NOSELECT7279; //置CS高电平}unsigned char code BdSeg[]={0x7e,0x30,0x6d,0x79, // 0 1 2 30x33,0x5b,0x5f,0x70, // 4 5 6 70x7f,0x7b,0x77,0x1f, // 8 9 a b0x4e,0x3d,0x4f,0x47, // c d e f0x00,0x01};/*; b6; ----; b1| b0 |b5; ---- small; b2| b3 |b4; ---- .b7*/void DispLED(char *DispBuf,char ShowDot)//ShowDot 显示小数点位{char i,ch;ShowDot--;for (i=0;i<6;i++){ch=DispBuf[i];if ((ch>='a') && (ch<='f')){ch-='a';ch+=0xa;}if ((ch>='A') && (ch<='F')){ch-='A';ch+=0xa;}Send7279Byte(0x90+5-i); //不译码if (ch==' ')Send7279Byte(0x00);elseif (ch=='-')Send7279Byte(0x01);else{if (ShowDot==i)Send7279Byte(0x80|BdSeg[ch&0x0f]);elseSend7279Byte(BdSeg[ch&0x0f]);}}NOSELECT7279; //置CS高电平}C8051F020.h#ifndef _C8051F020_#define _C8051F020_#define SYSCLK 11059200 // 系统时钟取自外部晶体/*---------------------------------------------------------------------------; Copyright (C) 2001 CYGNAL INTEGRATED PRODUCTS, INC.; All rights reserved.;;; FILE NAME : C8051F020.H; TARGET MCUs : C8051F020, 'F021, 'F022, 'F023; DESCRIPTION : Register/bit definitions for the C8051F02xproduct family.;; REVISION 1.0;;---------------------------------------------------------------------------*//* BYTE Registers */sfr P0 = 0x80; /* PORT 0 */sfr SP = 0x81; /* STACK POINTER */sfr DPL = 0x82; /* DATA POINTER - LOW BYTE */sfr DPH = 0x83; /* DATA POINTER - HIGH BYTE */sfr P4 = 0x84; /* PORT 4*/sfr P5 = 0x85; /* PORT 5 */sfr P6 = 0x86; /* PORT 6*/sfr PCON = 0x87; /* POWER CONTROL */sfr TCON = 0x88; /* TIMER CONTROL */sfr TMOD = 0x89; /* TIMER MODE */sfr TL0 = 0x8A; /* TIMER 0 - LOW BYTE */sfr TL1 = 0x8B; /* TIMER 1 - LOW BYTE */sfr TH0 = 0x8C; /* TIMER 0 - HIGH BYTE */sfr TH1 = 0x8D; /* TIMER 1 - HIGH BYTE */sfr CKCON = 0x8E; /* CLOCK CONTROL */sfr PSCTL = 0x8F; /* PROGRAM STORE R/W CONTROL */sfr P1 = 0x90; /* PORT 1 */sfr TMR3CN = 0x91; /* TIMER 3 CONTROL */sfr TMR3RLL = 0x92; /* TIMER 3 RELOAD REGISTER - LOW BYTE */sfr TMR3RLH = 0x93; /* TIMER 3 RELOAD REGISTER - HIGH BYTE */sfr TMR3L = 0x94; /* TIMER 3 - LOW BYTE */sfr TMR3H = 0x95; /* TIMER 3 - HIGH BYTE */sfr P7 = 0x96; /* PORT 7 */sfr SCON0 = 0x98; /* SERIAL PORT 0 CONTROL */sfr SBUF0 = 0x99; /* SERIAL PORT 0 BUFFER */sfr SPI0CFG = 0x9A; /* SERIAL PERIPHERAL INTERFACE 0CONFIGURATION */sfr SPI0DAT = 0x9B; /* SERIAL PERIPHERAL INTERFACE 0 DATAsfr ADC1 = 0x9C; /* ADC 1 DATA */sfr SPI0CKR = 0x9D; /* SERIAL PERIPHERAL INTERFACE 0 CLOCK RATECONTROL */sfr CPT0CN = 0x9E; /* COMPARATOR 0 CONTROL */sfr CPT1CN = 0x9F; /* COMPARATOR 1 CONTROL */sfr P2 = 0xA0; /* PORT 2 */sfr EMI0TC = 0xA1; /* EMIF TIMING CONTROL */sfr EMI0CF = 0xA3; /* EXTERNAL MEMORY INTERFACE (EMIF)CONFIGURATION */sfr P0MDOUT = 0xA4; /* PORT 0 OUTPUT MODE CONFIGURATION */sfr P1MDOUT = 0xA5; /* PORT 1 OUTPUT MODE CONFIGURATION */sfr P2MDOUT = 0xA6; /* PORT 2 OUTPUT MODE CONFIGURATION */sfr P3MDOUT = 0xA7; /* PORT 3 OUTPUT MODE CONFIGURATION */sfr IE = 0xA8; /* INTERRUPT ENABLE */sfr SADDR0 = 0xA9; /* SERIAL PORT 0 SLAVE ADDRESS */sfr ADC1CN = 0xAA; /* ADC 1 CONTROL */sfr ADC1CF = 0xAB; /* ADC 1 ANALOG MUX CONFIGURATION */sfr AMX1SL = 0xAC; /* ADC 1 ANALOG MUX CHANNEL SELECT */sfr P3IF = 0xAD; /* PORT 3 EXTERNAL INTERRUPT FLAGS */sfr SADEN1 = 0xAE; /* SERIAL PORT 1 SLAVE ADDRESS MASK */sfr EMI0CN = 0xAF; /* EXTERNAL MEMORY INTERFACE CONTROL */sfr P3 = 0xB0; /* PORT 3 */sfr OSCXCN = 0xB1; /* EXTERNAL OSCILLATOR CONTROL */sfr OSCICN = 0xB2; /* INTERNAL OSCILLATOR CONTROLsfr P74OUT = 0xB5; /* PORTS 4 - 7 OUTPUT MODE */sfr FLSCL = 0xB6; /* FLASH MEMORY TIMING PRESCALER */sfr FLACL = 0xB7; /* FLASH ACESS LIMIT */sfr IP = 0xB8; /* INTERRUPT PRIORITY */sfr SADEN0 = 0xB9; /* SERIAL PORT 0 SLAVE ADDRESS MASK */sfr AMX0CF = 0xBA; /* ADC 0 MUX CONFIGURATION */sfr AMX0SL = 0xBB; /* ADC 0 MUX CHANNEL SELECTION */sfr ADC0CF = 0xBC; /* ADC 0 CONFIGURATION */sfr P1MDIN = 0xBD; /* PORT 1 INPUT MODE */sfr ADC0L = 0xBE; /* ADC 0 DATA - LOW BYTE */sfr ADC0H = 0xBF; /* ADC 0 DATA - HIGH BYTE */sfr SMB0CN = 0xC0; /* SMBUS 0 CONTROL */sfr SMB0STA = 0xC1; /* SMBUS 0 STATUS */sfr SMB0DAT = 0xC2; /* SMBUS 0 DATA */sfr SMB0ADR = 0xC3; /* SMBUS 0 SLAVE ADDRESS */sfr ADC0GTL = 0xC4; /* ADC 0 GREATER-THAN REGISTER - LOW BYTE */sfr ADC0GTH = 0xC5; /* ADC 0 GREATER-THAN REGISTER - HIGH BYTE */sfr ADC0LTL = 0xC6; /* ADC 0 LESS-THAN REGISTER - LOW BYTE */sfr ADC0LTH = 0xC7; /* ADC 0 LESS-THAN REGISTER - HIGH BYTE */sfr T2CON = 0xC8; /* TIMER 2 CONTROL */sfr T4CON = 0xC9; /* TIMER 4 CONTROL */sfr RCAP2L = 0xCA; /* TIMER 2 CAPTURE REGISTER - LOW BYTEsfr RCAP2H = 0xCB; /* TIMER 2 CAPTURE REGISTER - HIGH BYTE */sfr TL2 = 0xCC; /* TIMER 2 - LOW BYTE */sfr TH2 = 0xCD; /* TIMER 2 - HIGH BYTE */sfr SMB0CR = 0xCF; /* SMBUS 0 CLOCK RATE */sfr PSW = 0xD0; /* PROGRAM STATUS WORD */sfr REF0CN = 0xD1; /* VOLTAGE REFERENCE 0 CONTROL */sfr DAC0L = 0xD2; /* DAC 0 REGISTER - LOW BYTE */sfr DAC0H = 0xD3; /* DAC 0 REGISTER - HIGH BYTE */sfr DAC0CN = 0xD4; /* DAC 0 CONTROL */sfr DAC1L = 0xD5; /* DAC 1 REGISTER - LOW BYTE */sfr DAC1H = 0xD6; /* DAC 1 REGISTER - HIGH BYTE */sfr DAC1CN = 0xD7; /* DAC 1 CONTROL */sfr PCA0CN = 0xD8; /* PCA 0 COUNTER CONTROL */sfr PCA0MD = 0xD9; /* PCA 0 COUNTER MODE */sfr PCA0CPM0 = 0xDA; /* CONTROL REGISTER FOR PCA 0 MODULE 0 */sfr PCA0CPM1 = 0xDB; /* CONTROL REGISTER FOR PCA 0 MODULE 1 */sfr PCA0CPM2 = 0xDC; /* CONTROL REGISTER FOR PCA 0 MODULE 2 */sfr PCA0CPM3 = 0xDD; /* CONTROL REGISTER FOR PCA 0 MODULE 3 */sfr PCA0CPM4 = 0xDE; /* CONTROL REGISTER FOR PCA 0 MODULE 4 */sfr ACC = 0xE0; /* ACCUMULATOR */sfr XBR0 = 0xE1; /* DIGITAL CROSSBAR CONFIGURATION REGISTER0 */sfr XBR1 = 0xE2; /* DIGITAL CROSSBAR CONFIGURATION REGISTER1 */sfr XBR2 = 0xE3; /* DIGITAL CROSSBAR CONFIGURATION REGISTER2 */sfr RCAP4L = 0xE4; /* TIMER 4 CAPTURE REGISTER - LOW BYTE */sfr RCAP4H = 0xE5; /* TIMER 4 CAPTURE REGISTER - HIGH BYTE */sfr EIE1 = 0xE6; /* EXTERNAL INTERRUPT ENABLE 1 */sfr EIE2 = 0xE7; /* EXTERNAL INTERRUPT ENABLE 2 */sfr ADC0CN = 0xE8; /* ADC 0 CONTROL */sfr PCA0L = 0xE9; /* PCA 0 TIMER - LOW BYTE */sfr PCA0CPL0 = 0xEA; /* CAPTURE/COMPARE REGISTER FOR PCA 0MODULE 0 - LOW BYTE */sfr PCA0CPL1 = 0xEB; /* CAPTURE/COMPARE REGISTER FOR PCA 0MODULE 1 - LOW BYTE */sfr PCA0CPL2 = 0xEC; /* CAPTURE/COMPARE REGISTER FOR PCA 0MODULE 2 - LOW BYTE */sfr PCA0CPL3 = 0xED; /* CAPTURE/COMPARE REGISTER FOR PCA 0MODULE 3 - LOW BYTE */sfr PCA0CPL4 = 0xEE; /* CAPTURE/COMPARE REGISTER FOR PCA 0MODULE 4 - LOW BYTE */sfr RSTSRC = 0xEF; /* RESET SOURCE */sfr B = 0xF0; /* B REGISTER */sfr SCON1 = 0xF1; /* SERIAL PORT 1 CONTROL */sfr SBUF1 = 0xF2; /* SERAIL PORT 1 DATA */sfr SADDR1 = 0xF3; /* SERAIL PORT 1 */sfr TL4 = 0xF4; /* TIMER 4 DATA - LOW BYTE */sfr TH4 = 0xF5; /* TIMER 4 DATA - HIGH BYTE */sfr EIP1 = 0xF6; /* EXTERNAL INTERRUPT PRIORITY REGISTER 1 */sfr EIP2 = 0xF7; /* EXTERNAL INTERRUPT PRIORITY REGISTER 2 */sfr SPI0CN = 0xF8; /* SERIAL PERIPHERAL INTERFACE 0 CONTROL*/sfr PCA0H = 0xF9; /* PCA 0 TIMER - HIGH BYTE */sfr PCA0CPH0 = 0xFA; /* CAPTURE/COMPARE REGISTER FOR PCA 0MODULE 0 - HIGH BYTE */sfr PCA0CPH1 = 0xFB; /* CAPTURE/COMPARE REGISTER FOR PCA 0MODULE 1 - HIGH BYTE */sfr PCA0CPH2 = 0xFC; /* CAPTURE/COMPARE REGISTER FOR PCA 0MODULE 2 - HIGH BYTE */sfr PCA0CPH3 = 0xFD; /* CAPTURE/COMPARE REGISTER FOR PCA 0MODULE 3 - HIGH BYTE */sfr PCA0CPH4 = 0xFE; /* CAPTURE/COMPARE REGISTER FOR PCA 0MODULE 4 - HIGH BYTE */sfr WDTCN = 0xFF; /* WATCHDOG TIMER CONTROL *//* BIT Registers *//* TCON 0x88 */sbit TF1 = TCON ^ 7; /* TIMER 1 OVERFLOW FLAG */sbit TR1 = TCON ^ 6; /* TIMER 1 ON/OFF CONTROL */sbit TF0 = TCON ^ 5; /* TIMER 0 OVERFLOW FLAG */sbit TR0 = TCON ^ 4; /* TIMER 0 ON/OFF CONTROL */sbit IE1 = TCON ^ 3; /* EXT. INTERRUPT 1 EDGE FLAG */sbit IT1 = TCON ^ 2; /* EXT. INTERRUPT 1 TYPE */sbit IE0 = TCON ^ 1; /* EXT. INTERRUPT 0 EDGE FLAG */sbit IT0 = TCON ^ 0; /* EXT. INTERRUPT 0 TYPE *//* SCON0 0x98 */sbit SM00 = SCON0 ^ 7; /* SERIAL MODE CONTROL BIT 0*/sbit SM10 = SCON0 ^ 6; /* SERIAL MODE CONTROL BIT 1*/sbit SM20 = SCON0 ^ 5; /* MULTIPROCESSOR COMMUNICATIONENABLE */sbit REN0 = SCON0 ^ 4; /* RECEIVE ENABLE*/sbit TB80 = SCON0 ^ 3; /* TRANSMIT BIT 8*/sbit RB80 = SCON0 ^ 2; /* RECEIVE BIT 8*/sbit TI0 = SCON0 ^ 1; /* TRANSMIT INTERRUPT FLAG*/sbit RI0 = SCON0 ^ 0; /* RECEIVE INTERRUPT FLAG *//* IE 0xA8 */sbit EA = IE ^ 7; /* GLOBAL INTERRUPT ENABLE*/sbit ET2 = IE ^ 5; /* TIMER 2 INTERRUPT ENABLE*/sbit ES0 = IE ^ 4; /* SERIAL PORT INTERRUPT ENABLE*/sbit ET1 = IE ^ 3; /* TIMER 1 INTERRUPT ENABLE*/sbit EX1 = IE ^ 2; /* EXTERNAL INTERRUPT 1 ENABLE*/sbit ET0 = IE ^ 1; /* TIMER 0 INTERRUPT ENABLE*/sbit EX0 = IE ^ 0; /* EXTERNAL INTERRUPT 0 ENABLE*//* IP 0xB8 */sbit PT2 = IP ^ 5; /* TIMER 2 PRIORITY*/sbit PS = IP ^ 4; /* SERIAL PORT PRIORITY*/sbit PT1 = IP ^ 3; /* TIMER 1 PRIORITY*/sbit PX1 = IP ^ 2; /* EXTERNAL INTERRUPT 1 PRIORITY*/sbit PT0 = IP ^ 1; /* TIMER 0 PRIORITY*/sbit PX0 = IP ^ 0; /* EXTERNAL INTERRUPT 0 PRIORITY*//* SMB0CN 0xC0 */sbit BUSY = SMB0CN ^ 7; /* SMBUS 0 BUSY*/sbit ENSMB = SMB0CN ^ 6; /* SMBUS 0 ENABLE*/sbit STA = SMB0CN ^ 5; /* SMBUS 0 START FLAG*/sbit STO = SMB0CN ^ 4; /* SMBUS 0 STOP FLAG*/sbit SI = SMB0CN ^ 3; /* SMBUS 0 INTERRUPT PENDING FLAG*/sbit AA = SMB0CN ^ 2; /* SMBUS 0 ASSERT/ACKNOWLEDGE FLAG */sbit SMBFTE = SMB0CN ^ 1; /* SMBUS 0 FREE TIMER ENABLE */sbit SMBTOE = SMB0CN ^ 0; /* SMBUS 0 TIMEOUT ENABLE *//* T2CON 0xC8 */sbit TF2 = T2CON ^ 7; /* TIMER 2 OVERFLOW FLAG*/sbit EXF2 = T2CON ^ 6; /* EXTERNAL FLAG*/sbit RCLK = T2CON ^ 5; /* RECEIVE CLOCK FLAG*/sbit TCLK = T2CON ^ 4; /* TRANSMIT CLOCK FLAG*/sbit EXEN2 = T2CON ^ 3; /* TIMER 2 EXTERNAL ENABLE FLAG*/sbit TR2 = T2CON ^ 2; /* TIMER 2 ON/OFF CONTROL*/sbit CT2 = T2CON ^ 1; /* TIMER OR COUNTER SELECT*/sbit CPRL2 = T2CON ^ 0; /* CAPTURE OR RELOAD SELECT*//* PSW */sbit CY = PSW ^ 7; /* CARRY FLAG */sbit AC = PSW ^ 6; /* AUXILIARY CARRY FLAG */sbit F0 = PSW ^ 5; /* USER FLAG 0 */sbit RS1 = PSW ^ 4; /* REGISTER BANK SELECT 1 */sbit RS0 = PSW ^ 3; /* REGISTER BANK SELECT 0 */sbit OV = PSW ^ 2; /* OVERFLOW FLAG */sbit F1 = PSW ^ 1; /* USER FLAG 1 */sbit P = PSW ^ 0; /* ACCUMULATOR PARITY FLAG *//* PCA0CN D8H */sbit CF = PCA0CN ^ 7; /* PCA 0 COUNTER OVERFLOW FLAG*/sbit CR = PCA0CN ^ 6; /* PCA 0 COUNTER RUN CONTROL BIT*/sbit CCF4 = PCA0CN ^ 4; /* PCA 0 MODULE 4 INTERRUPT FLAG*/sbit CCF3 = PCA0CN ^ 3; /* PCA 0 MODULE 3 INTERRUPT FLAG*/sbit CCF2 = PCA0CN ^ 2; /* PCA 0 MODULE 2 INTERRUPT FLAG*/sbit CCF1 = PCA0CN ^ 1; /* PCA 0 MODULE 1 INTERRUPT FLAG*/sbit CCF0 = PCA0CN ^ 0; /* PCA 0 MODULE 0 INTERRUPT FLAG*//* ADC0CN E8H */sbit AD0EN = ADC0CN ^ 7; /* ADC 0 ENABLE */sbit AD0TM = ADC0CN ^ 6; /* ADC 0 TRACK MODE */sbit AD0INT = ADC0CN ^ 5; /* ADC 0 CONVERISION COMPLETEINTERRUPT FLAG */sbit AD0BUSY = ADC0CN ^ 4; /* ADC 0 BUSY FLAG */sbit AD0CM1 = ADC0CN ^ 3; /* ADC 0 START OF CONVERSION MODEBIT 1 */sbit AD0CM0 = ADC0CN ^ 2; /* ADC 0 START OF CONVERSION MODEBIT 0 */sbit AD0WINT = ADC0CN ^ 1; /* ADC 0 WINDOW COMPARE INTERRUPTFLAG */sbit AD0LJST = ADC0CN ^ 0; /* ADC 0 RIGHT JUSTIFY DATA BIT *//* SPI0CN F8H */sbit SPIF = SPI0CN ^ 7; /* SPI 0 INTERRUPT FLAG*/sbit WCOL = SPI0CN ^ 6; /* SPI 0 WRITE COLLISION FLAG*/sbit MODF = SPI0CN ^ 5; /* SPI 0 MODE FAULT FLAG*/sbit RXOVRN = SPI0CN ^ 4; /* SPI 0 RX OVERRUN FLAG*/sbit TXBSY = SPI0CN ^ 3; /* SPI 0 TX BUSY FLAG*/sbit SLVSEL = SPI0CN ^ 2; /* SPI 0 SLAVE SELECT*/sbit MSTEN = SPI0CN ^ 1; /* SPI 0 MASTER ENABLE*/sbit SPIEN = SPI0CN ^ 0; /* SPI 0 SPI ENABLE*/sbit P10 = P1^0;sbit P11 = P1^1;sbit P12 = P1^2;sbit P13 = P1^3;sbit P14 = P1^4;sbit P15 = P1^5;sbit P16 = P1^6;sbit P17 = P1^7;sbit P20 = P2^0;sbit P21 = P2^1;sbit P22 = P2^2;sbit P23 = P2^3;sbit P24 = P2^4;sbit P25 = P2^5;sbit P26 = P2^6;sbit P27 = P2^7;sbit P30 = P3^0;sbit P31 = P3^1;sbit P32 = P3^2;sbit P33 = P3^3;sbit P34 = P3^4;sbit P35 = P3^5;sbit P36 = P3^6;sbit P37 = P3^7;#endif七、调试过程及分析将编写好的源程序输入电脑,编译后呈现很多错误,这些错误有很多时平时的实验碰到过的,例如:输入的分号格式不正确,零和字母O弄混杂了,删改头文件时出现问题等等,幸好这些错误在平时的实验中碰到了,所以改错误很轻易,但同时也阐明了,平时的错误现在还在换,证实错误我还没有完整的改正,这点我以后必定要留意了,争取错误换了两次就不能在换了。