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

📄 init.c

📁 带按键操作设定参数功能(C8051F020)
💻 C
字号:
//-----------------------------------------------------------------------------
// Includes
//-----------------------------------------------------------------------------
#include <c8051F020.h>
#include "stdio.h"
//-----------------------------------------------------------------------------
// 16-bit SFR Definitions for 'F02x
//-----------------------------------------------------------------------------
sbit LED=P1^6;
sbit SETK=P1^2;
sbit ADDK=P1^3;
sbit SHIFTK=P1^4;
sfr16 AD0=0xbe;
sfr16 DAC0=0xd2;
sfr16 DAC1=0xd5; 
//-----------------------------------------------------------------------------
// Global Constants
//-----------------------------------------------------------------------------
#define uchar  unsigned char
#define uint unsigned int
#define ANALOG_INPUTS 9    
#define SYSCLK 22118400          // Output of PLL derived from (INTCLK*2)
#define SAR_CLK 2500000          // Desired SAR clock speedfw
#define FUNC 10
#define SHIFT 5
//-----------------------------------------------------------------------------
// Function Prototypes
//-----------------------------------------------------------------------------
void Timer_Init(void);
void Port_IO_Init(void);
void UART_Init(void);
void Oscillator_Init(void);
void Interrupts_Init(void);
void Init_Device(void) ;
void Ad0_Init(void) ;
void Ad0_8data(void);
void Da_init(void) ;
void Da_out(uint Da_data0,uint Da_data1)	;
void key(void);
void delayms(uint x);
void setk(void);
void addk(void);
void shiftk(void);
//-----------------------------------------------------------------------------
// Global Variables
//-----------------------------------------------------------------------------
bit set_flag=0;
bit data_flag=0;
uchar func_code=0x00;
uchar shift_code=0x00;
uchar TIMER0_DATAH=0xf8; 
uchar TIMER0_DATAL=0xcc;      //时基1ms
uchar T_factor=0x64;          //1ms x 8  
uchar L0;                      
uint command_data[FUNC];
uint dat1=0x0000;
uint dat2=0x0000;
uint Result[ANALOG_INPUTS];
//-----------------------------------------------------------------------------
// main() Routine
//-----------------------------------------------------------------------------
main() { 
         Init_Device();
		 ET0=1;     //allow t0 int
		 EA=1;     
		 TR0=1;
         L0=T_factor;
		 for(;;)  {
				   WDTCN =0xa5;
				   Ad0_8data();
				   key();	
       			  }
        }
 
void  Ad0_Init(void) {	
                        AMX0CF=0x00;        //选择输入方式:单端或差分(低四位)," 0 "为单端 
                        AMX0SL=0x00;        //通道选择:低四位(0000-0111)对应AIN0-AIN7; 1XXX对应温度传感器
                                            //控制寄存器 */
                        AD0=0x0000;         //ad转换值高位字节(4位) 
                                            //ad转换值低位字节(8位) 
                        REF0CN= 0x07;       //参考电压设定
                                            // ADC conversion clock = 2.5MHz     
					    ADC0CF    = 0x40;
                        ADC0CN    = 0x40;             		    }
void  Ad0_8data(void) { 
                         uchar i=0;
						 AD0EN=1;  //使能AD//
                         for(i=0;i<ANALOG_INPUTS;i++){
						                              AMX0SL=i;
						                              AD0INT=0;
                                                      AD0BUSY=1;
                                                      while (AD0INT==0){WDTCN =0xa5;}
						                              Result[i]=AD0;  
													                                                               
					    							   }
		              }
void  Da_init(void) {  
                       REF0CN    = 0x07;
                    }

void  Da_out(uint Da_data0,uint Da_data1)	 {
                                               DAC0CN  =0x80;
					                           DAC0=Da_data0;
					                           DAC1CN =0x80;
					                           DAC1= Da_data1;
					                          }

void Timer_Init() {	
             	    CKCON     = 0x60;     //时钟选择system clk or system clk/12 
                    TMOD      = 0x01;     //time0 mode 1 :16 bit timing
					TH0 = TIMER0_DATAH;   //1ms timing 
                    TL0 = TIMER0_DATAL;
                    T2CON     = 0x30;     //UART0 baud rate;9600b/s  clk=system clk 
                    RCAP2L    = 0xB8;     //T2=UART0
                    RCAP2H    = 0xFF;
                    T4CON     = 0x30;     //UART1 baud rate;9600b/s  clk=system clk 
                    RCAP4L    = 0xB8;     //T4=UART1
                    RCAP4H    = 0xFF;

                   }
         
void UART_Init() { 
                    SCON0     = 0x40;
                    SCON1     = 0x40;
                  }
          
void Port_IO_Init() { 
                       XBR0      = 0x07;     //配置
                       XBR2      = 0x44;     //交叉开关 enable
					   P1MDIN    = 0x1c;     //p1.2,p1.3,p1.4 digital input 
					   P1MDOUT   = 0x40;     //P1.6口上拉
                     }
         
void Oscillator_Init() {
                        int i = 0;
                        OSCXCN    = 0x67;
                        for (i = 0; i < 3000; i++);  // Wait 1ms for initialization
                        while ((OSCXCN & 0x80) == 0);
                        OSCICN    = 0x08;
                        }
       
void Interrupts_Init() { 
                          IE        = 0x12;    
                          EIE2      = 0x60;     
                        }
void Init_Device(void) {    
                            Interrupts_Init();
							Oscillator_Init() ;
							Port_IO_Init() ;
							UART_Init() ;
							Timer_Init();
						    Ad0_Init();
							Da_init();
		                }
void Timer0_ISR (void) interrupt 1
{
   TR0=0;
   TF0=0;
   L0--;
   if(L0==0)    {
                  LED = ~LED; 
                  dat1++;
				  dat2=dat1*2;
				  if (dat1>0x0800){dat1=0x0800;}
                  Da_out(dat1,dat2) ;     
                  L0=T_factor;}                   // Toggle the LED
   TH0 = TIMER0_DATAH;                            // Reinit Timer0 register
   TL0 = TIMER0_DATAL;
   TR0=1;
   }
void key(void){ 
                 uchar shake;
				 SETK=1;
				 ADDK=1;
				 SHIFTK=1;                       //端口配置为输入状态
                 shake=P1&0x1c;                  //00011100b
				 delayms(5); 
				 SETK=1;
				 ADDK=1;
				 SHIFTK=1; 
                 if(shake==(P1&0x1c)) {
				                      switch(shake){
									                case 0x18:{setk();}break;
													case 0x14:{addk();}break;          
												    case 0x0c:{shiftk();}break;
						     					   }
				 	  
				}                    }
void setk(void)	{
                 while(SETK==0) {WDTCN =0xa5;}
                 if(set_flag) {data_flag=1;
				               shift_code=0x00;
							   }
                 set_flag=1;
                 }		  
			
void addk(void)	{
                 uint bitt;			  
			     while(ADDK==0){WDTCN =0xa5;}
			     if(set_flag)  {
				                 if(data_flag){
								                switch(shift_code){
												                   case 0: bitt=0x01;
                                                                   case 1: bitt=0x0a; 
                                                                   case 2: bitt=0x64; 
																   case 3: bitt=0x03e8;
															       case 4: bitt=0x2710;
                                                                   }
								                command_data[func_code]+=bitt;
								 
								               }
								 else         {
								        if(func_code<=FUNC) {func_code++;}	
								        else               {func_code=0x00;}	
                                              }
				               }
			     }

void shiftk(void){
                   while(SHIFTK==0){WDTCN =0xa5;}
                   if(data_flag){
				                  if(shift_code<=SHIFT) {shift_code++;}
				   
				                  else {shift_code=0;}
				                  
								 } 
                 }
void delayms(uint x){
                     uint x1;
					 while(x--){
					              for (x1 = 0; x1 < 3000; x1++);  //1ms??
					            }   
                    }

⌨️ 快捷键说明

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