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

📄 main.c

📁 富士通单片机MB90F387上实现MODBUS
💻 C
字号:
#include "GLOBAL.H"
#include "vectors.h"
#include "monitor.h"
#include "stdlib.h"

#define     scan0   PDR1_P12
#define     scan1   PDR1_P13
#define     scan2   PDR1_P14
#define     scan3   PDR1_P15
#define     scan4   PDR1_P11

#define     SLD     PDR5_P54
#define     SCK     PDR5_P53
#define     SDIN    PDR5_P55

#define     BL       PDR1_P10


uchar   p10ms_req;
uint    p100ms = 0;
uchar   p100ms_req;
uchar   p10s_flag = 0;

uint    timeu[20];


volatile uint soft_timer;

uint    temperature;
uchar   LCD_OFFSET;

uchar  setloop; //used for test


/*------------------ 初始化IO端口 --------------------------*/
void init_pio(void)
{
  PDR1 = 0x1;  /*数据寄存器*/
  DDR1 = 0xbf; /*方向寄存器1:输出 0:输入*/

  PDR2 = 0x00;
  DDR2 = 0xff;

  PDR3 = 0x0;
  DDR3 = 0x87;

  PDR4 = 0x4;
  DDR4 = 0x2;

  ADER = 0x1;
  PDR5 = 0x0;
  DDR5 = 0xfe;
  ADCS = 0xc200;
}

/*----------用于LCD 偏置电压 --------*/
void init_ppg(void)
{ 
  PRLL3 = 0x00;
  PPGC3 = 0x69;
  PPG23 = 0x4B;
  PRL3 = (255 - 120) + (120 << 8);
  PPGC3_PEN3 = 1;
}


// 周期定时器,每个周期一次
uchar ptime(uchar no,uint period)
{
	if (timeu[no] > 0)
	{
	    timeu[no]--;
	    return 0;
	} 
	else
	{
	    timeu[no] = period;
	    return 0xff;
	}    
}


void update_adc(void)
{
    uint    i;
    i = ADCR & 0x3ff;
    ADCS = 0xc200;
    if (i < 108) i = 108;       // 上限 50 度
    if (i > 133) i = 133;       // 下限 -10 度
    temperature = (133 - i) * 12 / 5;
}

void update_dac(uint dac_val)
{ 
    PRL3 = (255 - dac_val) + (dac_val << 8);
}


void InitReloadTimer(void)
{
    TMRLR0 = 1249;      /* set reload value to 2.5 ms */
    TMCSR0 = 0x81B;     /* prescaler 2us at 16 MHz */
    ICR03 = 6;          // 打开 ReloadTimer0 中断


    TMRLR1 = 1249;      /* set reload value to 2.5 ms */
    TMCSR1 = 0x81B;     /* prescaler 2us at 16 MHz */
//    ICR12 = 6;
}


/* Reload Timer 0, 每 2.5 ms 中断一次 */
__interrupt void OnReloadTimer0(void)
{
    TMCSR0_UF = 0;       /* reset underflow interrupt request flag */
    soft_timer++;
    if (!(soft_timer & 3))
    {
        p10ms_req = 1;
    }  	
	if (!(soft_timer & 40))
    {        
        update_dac(LCD_OFFSET);  // 调整 LCD 偏置电压
        p100ms_req = 1;    
        ++p100ms;
        if(p100ms == 1000)  
        {
        	 p100ms = 0;
        	 p10s_flag =1;        	 
        }           
    } 
}  
void p10ms(void)
{
    uchar   keycode;
    if (ptime(0,1))  // 20ms 周期
    {
        keycode = read_key();
        if(keycode)           
             process_key(keycode);                 
    }  
    BL = 1;          // 点亮 LCD 背光         
    if (ptime(1,9))  // 100ms 周期
    {           
        // LCD 更新               
        display_menu();      
    }
}

main()
{
	uint    result;
  uchar   keycode;
  	char   buff[20];
  	
  __DI(); 
  InitIrqLevels();
  InitReloadTimer();
  init_eeprom();
  init_pio();
  init_ppg();
  init_lcd();
  __EI(); 
  
  LCD_OFFSET = read_eerom(1006);
  update_dac(LCD_OFFSET);   // 调整 LCD 偏置电压
  Clr_Scr();


	//防止操作器与对象同时上电过程中初始化错误
	display_str(0,2,"Initializing... ");	
	wait_ms(1000); //1s  	
  //显示操作器软件版本号
  display_str(0,0,"Software Version"); 
  display_str(0,2,"================");  
  display_str(0,4," Modbus20070928 ");   
  display_str(0,6,"                "); 
  wait_ms(2000); //2s    	   

//Test Area	
/*
tmp11 = crc16(tesst1,6);
strcpy(buff,"                ");                
sprfu(&buff[5],tmp11,0,5);
display_str(0,0,buff);                           	
while(!setloop);
*/		

	
    //进入Modbus通信参数设置界面,包括设备地址、波特率、数据格式	 	
	//如果需要修改,则按动上下左右按键修改后,回车确认并保存,界面将切换到下一参数设计界面
	//否则,直接按动按键采用默认值即可		
	edit_val = read_eerom(1010);//读本机地址
	menu_ptr1 =0;		
	display_menus();	
	while(!setloop)
	{
	     if (p10ms_req)
	     {
	      	 p10ms_req = 0;
	       
	         if (ptime(0,1))  // 20ms 周期
	         {
        			keycode = read_key();
        			if(keycode)           
            			process_keys(keycode);   
           }
           if (ptime(1,9))  // 100ms 周期
           {
	         				display_menus();	         	
	         }
	     }
	}
	set_cursor(0xff,0xff);
	 
  //根据上述设置,初始化串口1	
	init_uart1(ModbusBPS,Commformat);  //通用变频器可设置(5,0):38400,8,N,1直接连接
  //系统联机以实现读取或者修改参数,或者控制变频器的运行的功能
  display_str(0,0,"                "); 
  display_str(0,2,"                ");  
  display_str(0,4,"   Connecting   "); 
  display_str(0,6,"     ......     ");    	
	
	while(1)
	{	    
	     if (p10ms_req)
	     {
	      	 p10ms_req = 0;
	         p10ms();
	      }
	 }
}




⌨️ 快捷键说明

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