⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lesson10.c

📁 基于8051的生产线记件系统
💻 C
📖 第 1 页 / 共 3 页
字号:
					ET1 = 1;//使能T1
					TR1 = 1;//启动T1
					EX0 = 1;//使能外部中断0
					break;
				case 0xA3://显示所有产量(记录值)总和
					beep = 0;//提示键盘按下
					delay(50,100);
					beep = 1;
					uc_device_addr = 0xA0;//0xA0=1010 0000B, 1010is the device number,000 is the A2A1A0 hard wired, 0 write.
					for(j = 1;j < 7;j++)
					{
						uc_device_sub_addr = 0x00 + ((j) << 3);//EEPROM 首地址
						IRcvStr(uc_device_addr,uc_device_sub_addr,g_uc_data_receive,3);//以页方式读取//读出的数据保存在数组g_uc_data_receive中
						temp += g_uc_data_receive[2];
					}
					g_uc_hr_cnt = 0xFF;//不显示
					g_uc_min_cnt = temp >> 8;//显示数据的高8位
					g_uc_sec_cnt = temp & 0x00FF;//显示数据的低8位
					if((g_uc_sec_cnt&0x0F) > 9)//总和的结果应该以10进制的形式显示给用户
					{
						temp = (g_uc_sec_cnt&0xF0) + 1;
						g_uc_sec_cnt = (temp << 4) + ((g_uc_sec_cnt&0x0F) - 10);
					}
					display_led(g_uc_hr_cnt ,g_uc_min_cnt ,g_uc_sec_cnt);
					break;
				case 0xA4://模拟断电保存//断电时保存地址:0x40
					ET0 = 0;//禁止T0
					ET1 = 0;
					TR0 = 0;//停止T0
					TR1 = 0;
					EX0 = 0;//禁止外部中断0

					beep = 0;//提示键盘按下
					delay(50,100);
					beep = 1;
					uc_device_addr = 0xA0;//0xA0=1010 0000B, 1010is the device number,000 is the A2A1A0 hard wired, 0 write.
					uc_device_sub_addr = 0x40;//断电保存数据的EEPROM地址
					g_uc_data_send[0] = g_st_current_time.min;//断电时间
					g_uc_data_send[1] = g_st_current_time.sec;
					g_uc_data_send[2] = g_uc_log_number;//断电时刻的记录
					ISendStr(uc_device_addr,uc_device_sub_addr,g_uc_data_send,3);//以页方式读取//读出的数据保存在数组g_uc_data_receive中
					break;
				case 0xA5:
					ET0 = 0;//禁止T0
					ET1 = 0;
					TR0 = 0;//停止T0
					TR1 = 0;
					EX0 = 0;//禁止外部中断0
					time1_serial_init();
					for(j = 0;j < 7;j++)
					{
						uc_device_addr = 0xA0;//0xA0=1010 0000B, 1010is the device number,000 is the A2A1A0 hard wired, 0 write.
						uc_device_sub_addr = 0x00 + ((g_uc_recv_serial_cnt) << 3);
						IRcvStr(uc_device_addr,uc_device_sub_addr,g_uc_data_receive,3);
						memcpy(uc_temp_receive[j],g_uc_data_receive,3);
					}
					TR1 = 1;//start the timer1, not enable T1 interrupt
					ES = 1;//enable serial interrupt
					g_uc_sec_cnt = 0xAA;
					g_uc_min_cnt = 0xAA;
					g_uc_hr_cnt = 0xA2;
					display_led(g_uc_hr_cnt,g_uc_min_cnt,g_uc_sec_cnt);//display "1",ready for receive the serial data
					while(g_uc_recv_serial_cnt < 7)//waiting for 11 times serial interrupt
					{
						_nop_();
					}
					g_uc_recv_serial_cnt = 0;
					ES = 0;//mask the serial interrupt
					EA = 0;//mask all interrupt
					g_uc_sec_cnt = 0xA3;
					g_uc_min_cnt = 0xAA;
					g_uc_hr_cnt = 0xAA;
					display_led(g_uc_hr_cnt,g_uc_min_cnt,g_uc_sec_cnt);//display "1",ready for receive the serial data

					beep = 0;//提示键盘按下
					delay(50,100);
					beep = 1;
					/*for(j = 1;j < 7;j++)//send data to IBM
					{
						//uc_device_addr = 0xA0;//0xA0=1010 0000B, 1010is the device number,000 is the A2A1A0 hard wired, 0 write.
						//uc_device_sub_addr = 0x00 + ((j) << 3);
						//IRcvStr(uc_device_addr,uc_device_sub_addr,g_uc_data_receive,3);
						//SBUF = g_uc_data_receive[0];
						SBUF = 0x30;
						while(TI == 0)
						{
							delay(3,255);
						}
						TI = 0;
						SBUF = 0x31;
						while(TI == 0)
						{
							delay(3,255);
						}
						TI = 0;
						SBUF = 0x32;
						while(TI == 0)
						{
							delay(3,255);
						}
						TI = 0;
						beep = 0;
						delay(50,100);
						beep = 1;
					}*/
					/*SBUF = 0x21;//发送回车,提示PC数据发送完毕
					while(TI == 0)
					{
						delay(3,255);
					}
					TI = 0;*/

					beep = 0;//提示键盘按下
					delay(50,100);
					beep = 1;
					break;
				case 0xB0://显示当前记录
					TR0 = 0;//暂停T0
					beep = 0;//提示键盘按下
					delay(50,100);
					beep = 1;
					g_uc_hr_cnt = 0xFF;
					g_uc_min_cnt = 0xFF;
					g_uc_sec_cnt = g_uc_log_number;
					display_led(g_uc_hr_cnt ,g_uc_min_cnt ,g_uc_sec_cnt);

					delay(255,255);
					delay(255,255);
					delay(255,255);
					g_st_current_time.sec += 2;//给时钟进行时间补偿2s		
					TR0 = 1;//重新启动T0
					break;
				case 0xB1://第1段存放密码,从第2段开始存放采集的记录值
					uc_device_addr = 0xA0;//0xA0=1010 0000B, 1010is the device number,000 is the A2A1A0 hard wired, 0 write.
					uc_device_sub_addr = 0x00 + ((1) << 3);//EEPROM 首地址
					IRcvStr(uc_device_addr,uc_device_sub_addr,g_uc_data_receive,3);//以页方式读取//读出的数据保存在数组g_uc_data_receive中
					g_uc_hr_cnt = g_uc_data_receive[0];
					g_uc_min_cnt = g_uc_data_receive[1];
					g_uc_sec_cnt = g_uc_data_receive[2];
					display_led(g_uc_hr_cnt ,g_uc_min_cnt ,g_uc_sec_cnt);
					beep = 0;//连续发声
					delay(50,100);
					beep = 1;
					break;
				case 0xB2:
					uc_device_addr = 0xA0;//0xA0=1010 0000B, 1010is the device number,000 is the A2A1A0 hard wired, 0 write.
					uc_device_sub_addr = 0x00 + ((2) << 3);//EEPROM 首地址
					IRcvStr(uc_device_addr,uc_device_sub_addr,g_uc_data_receive,3);//以页方式读取//读出的数据保存在数组g_uc_data_receive中
					g_uc_hr_cnt = g_uc_data_receive[0];
					g_uc_min_cnt = g_uc_data_receive[1];
					g_uc_sec_cnt = g_uc_data_receive[2];
					display_led(g_uc_hr_cnt ,g_uc_min_cnt ,g_uc_sec_cnt);
					beep = 0;//连续发声
					delay(50,100);
					beep = 1;
					break;
				case 0xB3:
					uc_device_addr = 0xA0;//0xA0=1010 0000B, 1010is the device number,000 is the A2A1A0 hard wired, 0 write.
					uc_device_sub_addr = 0x00 + ((3) << 3);//EEPROM 首地址
					IRcvStr(uc_device_addr,uc_device_sub_addr,g_uc_data_receive,3);//以页方式读取//读出的数据保存在数组g_uc_data_receive中
					g_uc_hr_cnt = g_uc_data_receive[0];
					g_uc_min_cnt = g_uc_data_receive[1];
					g_uc_sec_cnt = g_uc_data_receive[2];
					display_led(g_uc_hr_cnt ,g_uc_min_cnt ,g_uc_sec_cnt);
					beep = 0;//连续发声
					delay(50,100);
					beep = 1;
					break;
				case 0xB4:
					uc_device_addr = 0xA0;//0xA0=1010 0000B, 1010is the device number,000 is the A2A1A0 hard wired, 0 write.
					uc_device_sub_addr = 0x00 + ((4) << 3);//EEPROM 首地址
					IRcvStr(uc_device_addr,uc_device_sub_addr,g_uc_data_receive,3);//以页方式读取//读出的数据保存在数组g_uc_data_receive中
					g_uc_hr_cnt = g_uc_data_receive[0];
					g_uc_min_cnt = g_uc_data_receive[1];
					g_uc_sec_cnt = g_uc_data_receive[2];
					display_led(g_uc_hr_cnt ,g_uc_min_cnt ,g_uc_sec_cnt);
					beep = 0;//连续发声
					delay(50,100);
					beep = 1;
					break;
				case 0xB5:
					uc_device_addr = 0xA0;//0xA0=1010 0000B, 1010is the device number,000 is the A2A1A0 hard wired, 0 write.
					uc_device_sub_addr = 0x00 + ((5) << 3);//EEPROM 首地址
					IRcvStr(uc_device_addr,uc_device_sub_addr,g_uc_data_receive,3);//以页方式读取//读出的数据保存在数组g_uc_data_receive中
					g_uc_hr_cnt = g_uc_data_receive[0];
					g_uc_min_cnt = g_uc_data_receive[1];
					g_uc_sec_cnt = g_uc_data_receive[2];
					display_led(g_uc_hr_cnt ,g_uc_min_cnt ,g_uc_sec_cnt);
					beep = 0;//连续发声
					delay(50,100);
					beep = 1;
					break;
				case 0xB6:
					uc_device_addr = 0xA0;//0xA0=1010 0000B, 1010is the device number,000 is the A2A1A0 hard wired, 0 write.
					uc_device_sub_addr = 0x00 + ((6) << 3);//EEPROM 首地址
					IRcvStr(uc_device_addr,uc_device_sub_addr,g_uc_data_receive,3);//以页方式读取//读出的数据保存在数组g_uc_data_receive中
					g_uc_hr_cnt = g_uc_data_receive[0];
					g_uc_min_cnt = g_uc_data_receive[1];
					g_uc_sec_cnt = g_uc_data_receive[2];
					display_led(g_uc_hr_cnt ,g_uc_min_cnt ,g_uc_sec_cnt);
					beep = 0;//连续发声
					delay(50,100);
					beep = 1;
					break;
				case 0xB7:
					uc_device_addr = 0xA0;//0xA0=1010 0000B, 1010is the device number,000 is the A2A1A0 hard wired, 0 write.
					uc_device_sub_addr = 0x00 + ((7) << 3);//EEPROM 首地址
					IRcvStr(uc_device_addr,uc_device_sub_addr,g_uc_data_receive,3);//以页方式读取//读出的数据保存在数组g_uc_data_receive中
					g_uc_hr_cnt = g_uc_data_receive[0];
					g_uc_min_cnt = g_uc_data_receive[1];
					g_uc_sec_cnt = g_uc_data_receive[2];
					display_led(g_uc_hr_cnt ,g_uc_min_cnt ,g_uc_sec_cnt);
					beep = 0;//连续发声
					delay(50,100);
					beep = 1;
					break;
				default:
					break;
			}
		}
	}	
	uc_keypad_response_flag = 0;//for single key press
}
/*************************************************/
/*name:keypad_response_single()
function:response to the key single number 
input:uc_key_number*/
/*************************************************/
void keypad_response_single(uchar key_number)
{
	data uchar k;	
	while(!(ACC == 0x87))//release the key//P1.7 for beep!
	{
		delay(2,255);
		P1 = 0x87;
		ACC = P1;
		ACC &= 0X87;
	}
	for(k=0;k<=11;k++)
	{
		if(key_number == g_uc_key_number_all[k])
		  break;
	}
	switch(k)
	{
		case 10:/*A*/
			break;
		case 11:/*B*/
			break;
		default:/*k = 0~9*/
				if(g_uc_disp_cnt < 7)//the maximal number is 6
				{
					g_uc_disp_cnt++;
					switch(g_uc_disp_cnt)
					{
						case 1:/*hr high*/
								g_uc_hr_cnt = k << 4;
								g_hr_disp = g_uc_hr_cnt;/*using OR can't mask the hr_low,so hr equal to 0*/						
							break;
						case 2:/*hr low*/
								g_uc_hr_cnt += k;
								g_hr_disp = g_uc_hr_cnt;
							break;
						case 3:/*min high*/
								g_uc_min_cnt = k << 4;
								g_min_disp = g_uc_min_cnt;
							break;
						case 4:/*min low*/
								g_uc_min_cnt += k;
								g_min_disp = g_uc_min_cnt;
							break;
						case 5:/*sec high*/
								g_uc_sec_cnt = k << 4;
								g_sec_disp = g_uc_sec_cnt;
							break;
						case 6:/*sec low*/
								g_uc_sec_cnt += k;
								g_sec_disp = g_uc_sec_cnt;
							break;
						default:		
							break;
					}
				}
			break;
	}
}
/*************************************************/
/*	name:display_led
	function:display the number*/
/*************************************************/
void display_led(uchar hr, uchar min,uchar sec)
{
	g_sec_disp = sec;//显示sec
	g_min_disp = min;//显示min
	g_hr_disp = hr;//显示hr
}
/*************************************************/
/*	name:delay
	function: */
/*************************************************/
void delay(uchar m, uchar n)
{
	data uchar i, j;
	for(i=0;i<m;i++)
	{
		for(j=0;j<n;j++);
	}
}
/*************************************************/
/*time0_interrupt()时钟计数,显示*/
/*************************************************/
void time0_interrupt(void) interrupt 1 using 3
{
	TH0 =0x3C   ;//重新装入初值15536
	TL0 =0xB0   ;//100ms=0.1s	
	g_uc_ms_cnt++;
	if(g_uc_ms_cnt==10)
	{
		g_uc_ms_cnt = 0;	
		g_st_current_time.sec ++;
		if((g_st_current_time.sec&0x0F)>9)	/*变量uc_sec_cnt为16进制数,显示应该为10进制*/
		{
			g_st_current_time.sec += 6;	/*(uc_sec_cnt&0x0F)按位与运算*/
		}		/*若没有if语句,则只能是到9以后,继续数到F才进位*/		
		display_led(g_st_current_time.hr,g_st_current_time.min,g_st_current_time.sec);/*显示时钟,每秒刷新一次*/
		if((g_st_current_time.sec)>=0x60)
		{
			g_st_current_time.sec = 0;
			g_st_current_time.min ++;
			if((g_st_current_time.min&0x0F)>9)		/*变量uc_min_cnt为16进制数,显示应该为10进制*/
			{
				g_st_current_time.min += 6;		/*(uc_min_cnt&0x0F)按位与运算*/
			}							/*若没有if语句,则只能是到9以后,继续数到F才进位*/	
			if((g_st_current_time.min)>=0x60)
			{
				g_st_current_time.min = 0;
				g_st_current_time.hr ++;
				if((g_st_current_time.hr&0x0F)>9)		/*变量uc_hr_cnt为16进制数,显示应该为10进制*/
				{
					g_st_current_time.hr += 6;			/*(uc_hr_cnt&0x0F)按位与运算*/
				}							/*若没有if语句,则只能是到9以后,继续数到F才进位*/
				if((g_st_current_time.hr)>=0x24)
				{
					g_st_current_time.hr = 0;
				}
			}
		}
	}
}
/*************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -