《武汉理工大学单片机应用》实习报告
附录
一、程序代码见下:
#include
sfr ISP_CONTR = 0xe7; //定义STC89C52单片机ISP寄存器地址
sbit recvLED = P3^6; //接收指示灯
sbit sendLED = P3^7; //发送指示灯
//共阳数码管段选码 //一下的字形以此为: /* 0,1,2,3,4,5, 6,7,8,9,A,B, C,D,E,F, ,-, ],_ */
unsigned char code segTable[]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92, 0x82,0xf8,0x80,0x90,0x88,0x83, 0xc6,0xa1,0x86,0x8e,0xff,0xbf, 0xf0,0xf7};
//4位数码管显示缓存
unsigned char num[]={16,16,16,16};
//key为扫描到的按键 //index为显示序号
unsigned char key,index,sec,cnt=0,sendFlag=0,recvNum=0;
void numDisp(void); //数据输入功能 void tempDisp(void); //温度显示功能 void seriComm(void); //串口通信功能 void resetSys(void); //软件复位功能
36
《武汉理工大学单片机应用》实习报告
void delayms(unsigned int ms) //延时 {
unsigned char i; for (;ms;ms--) for (i=110;i;i--); }
void sysInit(void) //系统初始化 {
TMOD = 0x21; //定时器0工作状态1 TH0 = (65536-2000)/256; TL0 = (65536-2000)%6; TH1 = 0xfd; TL1 = 0xfd; TR1 = 1; // REN = 1; SM0 = 1; SM1 = 1; ES = 1; EA = 1; //开总中断 ET0 = 1; //开定时器0中断 TR0 = 1; //启动定时器0 }
void welcome() {
char i;
while(!key) //等待按键,数码管流水显示 { for (i=3;i>=0;i--) { num[0]=num[1]=num[2]=num[3]=16; num[i]=17; delayms(150); if (keyscan()) return; delayms(150); if (keyscan()) return; delayms(150); if (keyscan()) return; }
37
《武汉理工大学单片机应用》实习报告
for (i=0;i<4;i++) { num[0]=num[1]=num[2]=num[3]=16; num[i]=17; delayms(150); if (keyscan()) return; delayms(150); if (keyscan()) return; delayms(150); if (keyscan()) return; } key=keyscan(); } }
void main() {
sysInit(); //系统初始化 welcome(); while(1) { key = keyscan(); switch(key) //根据键值执行功能 { case 'A': numDisp(); break; case 'B': tempDisp(); break; case 'C': seriComm(); break; case 'D': resetSys(); break; default: break; } } }
void Timer0() interrupt 1 //定时器0中断 {
// char i;
TH0 = (65536-2000)/256; //中断时间为2ms TL0 = (65536-2000)%6;
segDuan = 0xff; //关闭数码管,消除影像 segWei = 0xff;
38
《武汉理工大学单片机应用》实习报告
switch(index%4) //依次扫描显示数码管 { case 0: segDuan=segTable[num[0]];segWei=0xfe;break; case 1: segDuan=segTable[num[1]];segWei=0xfd;break; case 2: segDuan=segTable[num[2]];segWei=0xfb;break; case 3: segDuan=segTable[num[3]];segWei=0xf7;break; }
if ((!(sec%2))&&(sendFlag)) { // for (i=0;i<4;i++) { sendLED = 0; SBUF = num[index%4]; while(!TI); TI = 0; sendLED = 1; } }
index++; //索引加一 if (index==100) { index=0; sec++; } }
void Seri() interrupt 4 {
if(RI) { ET0 = 0; RI = 0; num[cnt%4] = SBUF; cnt++; ET0 = 1; recvNum++; if (recvNum==50) { recvNum = 0; recvLED = !recvLED; } }
39
《武汉理工大学单片机应用》实习报告
}
void numDisp(void) //数据输入功能 {
key = 0;
num[0]=16;num[1]=12;num[2]=1;num[3]=18; //数码管显示\ delayms(5000);
num[0]=19;num[1]=num[2]=num[3]=16; //清除 while(!key) //等待按键,同时闪烁光标 { key = keyscan(); if (sec%2) num[0]=16; else num[0]=19; }
num[0]=16; //清楚 while(1) { key=keyscan(); if (key=='B'||key=='C'||key=='D') //若按下了B,C,D键 return; //则退出以切换功能 if (('0'<=key)&&(key<='9')) //若按下了数字键 { num[3]=num[2]; //右移一位 num[2]=num[1]; num[1]=num[0]; num[0]=key-0x30; //转换数字的ASCII码为数字,赋给第一位 } if (key=='c') //两种清除方式 { num[0]=num[1]=num[2]=num[3]=17; } if (key=='b') { num[0]=num[1]=num[2]=num[3]=16; } } }
void tempDisp(void) //温度显示功能 {
40