/*---------------------------------------------------------------------
文件名称: JSQIII_main.C
初始作者: 于言江
初始版本: V2.0
功能说明: 此程序用于波纹管生产线计数。
1、根据选用波纹管模块的不同自动调整系数以适应各种波纹管的计数。
2、可设置长度报警,达到设定长度时报警提示,也可接自动切割机。
3、具有长度校准功能。
初始日期: 2009年8月03日
修改版本:
修改内容:
修改日期:
CPU 型号: C8051F340
软件工具: keil
----------------------------------------------------------------------------*/
#include "c8051F340.h"
#include "INTRINS.H"
#define delay_time_scan 100 /*修改键盘扫描去抖时间*/
#define Flicker_time 600 /*修改闪烁时间*/
#define FlashAddress 0x3a00 //存取Flash数据的地址 //永久保存数据(数据地址0x3a00)
#define ElementX 10 //定义存储数组元素的个数
#define Alert_time 5000 /*修改报警时间*/
/*****************************************************
变量声明
******************************************************/
sbit SET =P2^5;//设置按键
sbit NEXT=P2^6;//光标移位按键
sbit UP =P2^7;//增数按键
sbit OUT =P1^7;//输出
bit SETUP_flag;//设置标志 “1”进入设置状态;“0”退出设置状态。
bit key_action_flag;//按键动作标志
bit Flicker_flag;//闪烁标志
bit save_flag;//保存标志
bit out_flag;//输出标志
bit error_flag;//错误标志
unsigned char key_data,delay_T2;//键盘数据,按键延时
unsigned char Cursor;//光标
unsigned int data_reg,set_reg,set_reg_Comparison;
unsigned int Flicker_Count;//闪烁时间计数
unsigned int OUT_Count;//输出倒计时
unsigned char LED_INC;
unsigned char LED_BCD[8];
unsigned int long_data;//产品长度数据
unsigned long count_data;//产品计数
unsigned char MODE;//模块编码
#define AA 10
#define yy 17
#define JJ 18
#define uu 19
#define iii 20
#define nn 21
#define GG 22
#define nop 16
unsigned char code name_tab[]={yy,uu,nop,yy,AA,nn,nop,JJ,iii,nn,GG,nop};
// 0 1 2 3 4 5 6 7 8 9 A b c d E F 灭 y J u i n G
unsigned char code LED_CODE_TAB[]={0x81,0xed,0x43,0x49,0x2d,0x19,0x11,0xcd,0x01,0x09,0x05,0x31,0x73,0x61,0x13,0x17,0xff,0x29,0x69,0xf1,0xf7,0x75,0x91};
unsigned int ApplyNumber;//用户可以应用的数
unsigned long ADdataInc;
unsigned char idata test_string[ElementX];//将被拷贝到FLASH中的字符串
#define UFW075 0.033 // 1号 波峰/米:304, 单位分米
#define UFW085 0.033 // 2号 波峰/米:297,
#define UFW10 0.033 // 3号 波峰/米:300,
#define UFW13 0.035 // 4号 波峰/米:284,
#define UFW17 0.041 // 5号 波峰/米:240,
#define UFW22 0.043 // 6号 波峰/米:233,
#define UFW23 0.043 // 7号 波峰/米:,
#define UFW26 0.047 // 8号 波峰/米:217,
#define UFW29 0.051 // 9号 波峰/米:199,
#define UFW37 0.051 //10号 波峰/米:197,
*/
float code Tube_Name_TAB[]={0,UFW075,UFW085,UFW10,UFW13,UFW17,UFW22,UFW23,UFW26,UFW29,UFW37};
//float code Tube_Name_TAB[]={1,1,1,1,1,1,1,1,1,1,1,1};
/*====================================================================================
====================================================================================*/
void Timer_Init(void){
TCON = 0x01;
TMOD = 0x05;
CKCON = 0x02;
TH0 = 0x00;
TL0 = 0x00;
TMR2CN = 0x24;
TMR2RLH = 0x80;
TMR2H = 0x80;
}
void Port_IO_Init(void){
P0MDOUT = 0x00;
P1MDOUT = 0xF7;
P2MDOUT = 0xe0;
P3MDOUT = 0x00;
P4MDOUT = 0x00;
P0SKIP = 0x01;
XBR0 = 0x01;
XBR1 = 0xd0; //d0
}
void Oscillator_Init(void){
OSCICN = 0x83; // Set internal oscillator to run
// at its maximum frequency
}
void Interrupts_Init(void){
IP = 0x02;
IE = 0xA2;
EIE1 = 0x10;
EIP1 = 0x10;
IT01CF = 0x00;
}
/*****************************************************
初始化
******************************************************/
void Init_Device(void){//MCU驱动初始化
Timer_Init(); //定时器初始化
Port_IO_Init(); //IO引脚初始化
Oscillator_Init(); //时钟初始化
Interrupts_Init(); //中断初始化
}
/*****************************************************
延时函数(1ms)
******************************************************/
void delay_s(unsigned int ms){
unsigned int i,j;
for (i=0;i=delay_time_scan){
if(key_tmp!=0xe0){
delay_T2=0;//计时清零
key_action_flag=1;//按键动作
if(key_tmp==0xc0){
key_data=1;
SETUP_flag=~SETUP_flag;//设置标志“1”有效;“0”无效。
Cursor=SETUP_flag;//光标有效
if(SETUP_flag){
set_reg_Comparison=set_reg;//暂保存原始设置的数据,用于判断是否需要将设置的数据存入FLASH。
save_flag=1;//保存标志
}
}else if(key_tmp==0xa0){
if(SETUP_flag){
Cursor++;if(Cursor4)Cursor=1;//光标移动
}
}else if(key_tmp==0x60){
if(SETUP_flag){
LED_BCD[Cursor-1]++;
if(LED_BCD[Cursor-1]9)LED_BCD[Cursor-1]=0;//增值:0--9循环
BCD_TO_HEX();
}else{
count_data=0;
}
}
}
}
}
//-----------------------------------按键“抬起”后执行此段程序
if((key_tmp==0xe0)&(key_action_flag)){
delay_T2++;
if(delay_T2=delay_time_scan){
delay_T2=0;//计时清零
key_action_flag=0;
key_data=0;
}
}
}
/*****************************************************
HEX转换为BCD码 转换函数
******************************************************/
void HEX_TO_BCD(unsigned int hex,hex1){
EA=0;
//++++++++++++++++++++++++++
LED_BCD[3]=hex/1000;hex=hex%1000;
LED_BCD[2]=hex/100;hex=hex%100;
LED_BCD[1]=hex/10;hex=hex%10;
LED_BCD[0]=hex;
//--------------------------
if(!SETUP_flag){
if(LED_BCD[3]==0){
LED_BCD[3]=16;
if(LED_BCD[2]==0){
LED_BCD[2]=16;
}
}
}
//++++++++++++++++++++++++++
LED_BCD[7]=hex1/1000;hex1=hex1%1000;
LED_BCD[6]=hex1/100;hex1=hex1%100;
LED_BCD[5]=hex1/10;hex1=hex1%10;
LED_BCD[4]=hex1;
//--------------------------
if(!SETUP_flag){
if(LED_BCD[7]==0){
LED_BCD[7]=16;
if(LED_BCD[6]==0){
LED_BCD[6]=16;
if(LED_BCD[5]==0){
LED_BCD[5]=16;
}
}
}
}
//++++++++++++++++++++++++++
EA=1;
}
/*****************************************************
显示函数 YUYANJIANG
******************************************************/
unsigned char JinWei_flag;//千进位标志
void display(void){
P3=(0xff); //消除阴影
if(LED_INC==0){
P4=LED_CODE_TAB[LED_BCD[LED_INC]]; //□ □ □.■
if((Flicker_flag)&(Cursor==1)){
P3=(0xff);
}else{
P3=(0xef);
}
}
if(LED_INC==1){
P4=0xfe&LED_CODE_TAB[LED_BCD[LED_INC]]; //□ □ ■.□
if((Flicker_flag)&(Cursor==2)){
P3=(0xff);
}else{
P3=(0xdf);
}
}
if(LED_INC==2){
P4=LED_CODE_TAB[LED_BCD[LED_INC]]; //□ ■ □.□
if((Flicker_flag)&(Cursor==3)){
P3=(0xff);
}else{
P3=(0x7f);
}
}
if(LED_INC==3){
P4=LED_CODE_TAB[LED_BCD[LED_INC]]; //■ □ □.□
if((Flicker_flag)&(Cursor==4)){
P3=(0xff);
}else{
P3=(0xbf);
}
}
//--------------------------------
if(LED_INC==4){
if(JinWei_flag==4){
P4=0xfe&LED_CODE_TAB[LED_BCD[LED_INC]]; //□ □ □ ■.
}else{
P4=LED_CODE_TAB[LED_BCD[LED_INC]]; //□ □ □ ■
}
P3=(0xfb);
}
if(LED_INC==5){
if(JinWei_flag==3){
P4=0xfe&LED_CODE_TAB[LED_BCD[LED_INC]]; //□ □ ■.□
}else{
P4=LED_CODE_TAB[LED_BCD[LED_INC]]; //□ □ ■ □
}
P3=(0xf7);
}
if(LED_INC==6){
if(JinWei_flag==2){
P4=0xfe&LED_CODE_TAB[LED_BCD[LED_INC]]; //□ ■.□ □
}else{
P4=LED_CODE_TAB[LED_BCD[LED_INC]]; //□ ■ □ □
}
P3=(0xfe);
}
if(LED_INC==7){
if(JinWei_flag==1){
P4=0xfe&LED_CODE_TAB[LED_BCD[LED_INC]]; //■.□ □ □
}else{
P4=LED_CODE_TAB[LED_BCD[LED_INC]]; //■ □ □ □
}
P3=(0xfd);
}
//--------------------------------
LED_INC++;
if(LED_INC=8){
LED_INC=0;
}
}
///////////////////////////////////////////////////////////////
unsigned long count_dis;//计数高于四位数乘十再显示。
void get_count_data(void){ //计数
unsigned char tmpH,tmpL;
unsigned int inc=0;
EA=0;
tmpL=TL0;TL0=0;
tmpH=TH0;TH0=0;
inc=tmpH;inc=incFlicker_time){
Flicker_flag=~Flicker_flag;
Flicker_Count=0;
}
if(!TF2H){
TF2L=0;
}else{
TF2L=0;
TF2H=0;
TMR2RLH = 0xb3;//0xb3
TMR2RLL = 0x80;//0xf0
}
display();
key_scan();
if(out_flag){
OUT_Count=Alert_time;
out_flag=0;
}
if(OUT_Count!=0){
OUT_Count--;
if(OUT_Count==0){
OUT=1;
}
}
TR2=1;
}
/*****************************************************
Flash存取程序
******************************************************/
//-----------------------------------------------------
//Flash存取程序开始
void Save_Flash(void){// 程序存储器空间的指针(FLASH), 指向待写地址
unsigned char *pgen; // 一般指针
unsigned char xdata *pwrite;
unsigned int j=ElementX, ii;
EA=0;
// 擦除512字节的信息页(位于'FlashAddress')
FLSCL = 0x80; // 设置FLASH标度寄存器(对2MHz系统时钟)
PSCTL = 0x03; // 将PSWE和PSEE置‘1’MOVX指令写对应的FLASH页
pwrite =FlashAddress; // 将指针指向待擦除页
FLKEY=0xa5; FLKEY=0xf1;//开锁,//每写一个字节都要开锁一次
*pwrite = 0xff; // 启动擦除过程
PSCTL = 0x01; // 清除PSEE,PSWE仍然置1
// MOVX指令将写到对应的地址
// 拷贝字符串 的内容到FLASH页,从地址FlashAddress开始。
pgen = test_string; //指针pgen 指向源字符串
do {
FLKEY=0xa5;FLKEY=0xf1;//开锁,******每写一个字节必须开锁一次******
*pwrite++ = *pgen; //拷贝字节
j--;pgen++;
}while(j!=0); //直到NULL结束符
FLSCL = 0x80; // 设置FLASH标度寄存器(对2MHz系统时钟)
PSCTL = 0x00; // 将PSWE和PSEE置‘0’MOVX指令不能写FLASH页
for(ii=0;ii8;
test_string[i]=ch2;i++;
test_string[i]=ch1;
}
//-----------------------------------------------------
//从数组中读取数据,参数为数组中第几组数据
Read_Data(unsigned char Element){
unsigned char i,ch1,ch2;
int IntData;
i=Element*2;
ch1=test_string[i];i++;
ch2=test_string[i];
IntData=ch1;
IntData=IntData4;
LED_BCD[1]=0x0f&hex;hex=hex4;
LED_BCD[2]=0x0f&hex;hex=hex4;
LED_BCD[3]=0x0f&hex;
//--------------------------
if(!SETUP_flag){
if(LED_BCD[3]==0){
LED_BCD[3]=16;
if(LED_BCD[2]==0){
LED_BCD[2]=16;
}
}
}
//++++++++++++++++++++++++++
EA=1;
}
/*****************************************************
模块识别函数
******************************************************/
unsigned char pdata Comp=0;
unsigned int Comp_k[]={0,0xF075,0xF085,0xF100,0xF130,0xF170,0xF220,0xF230,0xF260,0xF290,0xF370};
unsigned code code_k[]={0,6,10,2,0,4,8,0,0,5,9,1,0,3,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
void identify_mode(void){ //识别
unsigned char i,k;
TR2=0;
EA=0;
P2=0xff;
k=((~(P2&0x1f))&0x1f);
MODE=code_k[k];k=MODE;
if((k10)|(k==0)){ /*目前只有种“10”型号,所以此数只到“9”*/
error_flag=1;//如果没有模块插入则报错
}else {
error_flag=0;
}
EA=1;
TR2=1;
/*每次装入新模块显示模块编号20秒钟左右*/
if(Comp!=MODE){
Comp=MODE;
delay_s(20);
for(i=0;i=set_reg){
if(OUT_Count==0){
out_flag=1;
OUT=0;
}
long_data=0;count_data=0;
}
//---------------------------------------------------------------------------------------- 显示
if(SETUP_flag){ //选择正运行显示与设置数据显示
HEX_TO_BCD(set_reg,0);
}else if(error_flag==0){
HEX_TO_BCD(long_data,count_dis);
}else if(error_flag==1){
HEX_TO_BCD(long_data,count_dis/*=0*/);
}
//---------------------------------------------------------------------------------------- 存储
if((!SETUP_flag)&(set_reg_Comparison!=set_reg)&(save_flag)){//避免多次存储
Int_to_Char(set_reg,0);
Save_Flash();
save_flag=0;
}
}
}
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。