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

📄 main.c

📁 采用两片凌阳61实现的建简易智能车程序
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <SPCE061V004.H>
#define Set_IOB_Bit(x)		(*P_IOB_Data = *P_IOB_Buffer | x)	//置高
#define Clear_IOB_Bit(x)	(*P_IOB_Data = *P_IOB_Buffer & ~x)	//置低
#define	Set_IOA_Bit(x)		(*P_IOA_Data = *P_IOA_Buffer | x)
#define	Clear_IOA_Bit(x)	(*P_IOA_Data = *P_IOA_Buffer & ~x)
#define HaveKey  1  
#define NoKey    0
#define FM       1
#define AM       0
#define normal   2
#define OUTB     0x0000         //OUTB and buffer
#define OUTA     0x0001         //OUTA
#define	TIMER_DATA_FOR_32KHZ (0xffff - 384)	      // 时钟频率为Fosc/2,采样率为32kHz
unsigned int  state;                              //FM 和AM 的状态区别
unsigned int  FM_flag;                            //调频开始结束的标志
unsigned int  data_name;                          //数组名首地址
unsigned int  KeyVal;                             //键值
unsigned int  KeyFlag;                            //按键标识
unsigned int  wei_flag;                           //显示频率的位标志 
unsigned int  V_value=0;                          //单片机测得的电压幅值
unsigned int  Sound=0;                            //调频时的AD采样数值
unsigned int  Ctrl_val=0;                         //幅度的控制变量
unsigned int  data_val;                           //AGC的控制字
unsigned int  key_num;                            //数字键的键值
unsigned long int  fre_val;                            //输入的频率值
unsigned int  ma[10] = {25,50,75,100,125,150,175,200,225,255};        //AM的调制系数,待调整
unsigned int  pinpian;                            //FM时,对于不同频偏AD采样值乘的系数
unsigned long int frequence,fo;                   //AD9851频率控制字的实际值,和调频的中心频率
extern unsigned int pin[],lv[],Hz[],A[],M[],F[],m[],a[],K[],baifenhao[],pian[],zui[],da[],
					denghao[],maohao[],blank[]; //用到的字母和符号
extern unsigned int zero[],one[],two[],three[],four[],five[],six[],seven[],eight[],nine[];//0~9十个数字
//*******************************************************************************//
//名称:Page()
//功能:开机显示默认频率为1000Hz的界面
//*******************************************************************************//
void Page()
{
	*P_Watchdog_Clear=1;
	Display_hanzi1(1,0,pin);
	Display_hanzi1(1,16,lv);
	Display_num1(1,32,maohao);
//	Display_num1(1,40,zero);
//	Display_num1(1,48,zero);
//	Display_num1(1,56,zero);
//	Display_num2(1,0,zero);
	Display_num2(1,8,one);
	Display_num2(1,16,zero);
	Display_num2(1,24,zero);
	Display_num2(1,32,zero);
	Display_hanzi2(1,48,Hz);
}
//***************************************************************//
//函数名称:DisplayFreq()
//功能:显示频率值
//***************************************************************//
void DisplayFreq()
{
	unsigned long int tempv;
	unsigned int  k,reg,*pointer;
	*P_Watchdog_Clear=1;
	tempv = fre_val;
	k = tempv / 10000000;
	pointer = num_view(k);
	Display_num1(1,40,pointer);
	reg = tempv / 1000000;
	k = reg %10;
	pointer = num_view(k);
	Display_num1(1,48,pointer);
	reg = tempv / 100000;
	k = reg % 10;
	pointer = num_view(k);
	Display_num1(1,56,pointer);
	reg = tempv / 10000;
	k = reg % 10;
	pointer = num_view(k);
	Display_num2(1,0,pointer);
	reg = tempv / 1000;
	k = reg % 10;
	pointer = num_view(k);
	Display_num2(1,8,pointer);
	reg = tempv / 100;
	k = reg % 10;
	pointer = num_view(k);
	Display_num2(1,16,pointer);
	reg = tempv / 10;
	k = reg % 10;
	pointer = num_view(k);
	Display_num2(1,24,pointer);
	k = tempv % 10;
	pointer = num_view(k);
	Display_num2(1,32,pointer);
	Display_hanzi2(1,48,Hz);
}		   
//*******************************************************************************//
//函数名称:num_view()
//函数功能:将数字转换成相应的数组名
//入口参数:所要转换的数字 
//返回参数:相应的数组名(字库首地址)			
//*******************************************************************************//
num_view(int i)
  { 
  		unsigned int *data_name;
    	*P_Watchdog_Clear=1;
    	switch(i)
     	{  
     		case 0:  data_name=zero;  break;
        	case 1:  data_name=one;  break;
        	case 2:  data_name=two;  break;
        	case 3:  data_name=three;  break;
        	case 4:  data_name=four;  break;
        	case 5:  data_name=five;  break;
        	case 6:  data_name=six;  break;
        	case 7:  data_name=seven;  break;
        	case 8:  data_name=eight;  break;
        	case 9:  data_name=nine;  break;
        	default:
        	break;
     	}
     	return  data_name;   
   }
//*******************************************************************
//延时函数
//******************************************************************
void delay()
{
	unsigned int i;
	for(i=0;i<1000;i++)
	{
		*P_Watchdog_Clear=1;
	}
}   
//***********************************************************************************
//函数名称:num_press()
//功能:对数字键进行处理
//参数:通过全局变量key_num,state_flag和wei_flag传递
//***********************************************************************************
void num_press()
{
	unsigned int *pointer;
	*P_Watchdog_Clear = 0x0001;	
		switch(wei_flag)
        {
        	case 0:
        		  pointer = num_view(key_num);
        		  Display_num1(1,40,pointer);
        		  break;
        	case 1:
        	      pointer = num_view(key_num);
        	      Display_num1(1,48,pointer);
        	      break;
        	case 2:
        	      pointer = num_view(key_num);
        	      Display_num1(1,56,pointer);
        	      break;
        	case 3:
        	      pointer = num_view(key_num);
        	      Display_num2(1,0,pointer);
        	      break; 
        	case 4:
        	      pointer = num_view(key_num);
        	      Display_num2(1,8,pointer);
        	      break;
        	case 5:
        	      pointer = num_view(key_num);
        	      Display_num2(1,16,pointer);
        	      break;
        	case 6:
        	      pointer = num_view(key_num);
        	      Display_num2(1,24,pointer);
        	      break; 
        	case 7:
        	      pointer = num_view(key_num);
        	      Display_num2(1,32,pointer);
        	      Display_hanzi2(1,48,Hz);
        	      break;      
        	default:
        	      break;                    	  
        }
         fre_val = fre_val * 10 + key_num;
         WriteAD9851(fre_val);
         delay();
         delay();                 
}

//***********************************************************************************//
//函数名称:WriteAD9851()
//功能:向AD9851写频率控制字
//参数:实际频率值,长整形
//***********************************************************************************//
void  WriteAD9851(unsigned long int Frequency)
{
	unsigned long int tempfrequence;
	unsigned int H_16bit,L_16bit;
	*P_Watchdog_Clear=1; 
	Frequency = (unsigned long int)Frequency * 35.79139413;    
	tempfrequence = Frequency >>8;
	H_16bit = (unsigned int)(tempfrequence>>8);
	L_16bit = (unsigned int)(Frequency & 0x0000ffff);
	WriteFreq(H_16bit,H_16bit);
}	 
	       	
//***********************************************************************************//
//函数名称:InitialSystem()
//功能:初始化IO口,LCD,AD9851,键盘,
//************************************************************************************//
void  InitialSystem()
{
	*P_IOA_Dir = 0xffe7;
	*P_IOA_Attrib = 0xffe7;
	*P_IOA_Data = 0x0000;
	
	*P_SystemClock = 0x0000;                    //设置系统时钟为最快
	Init9851();
	Initial_lcd();
	KeyInit();
	*P_TimerA_Ctrl = 0x0030; 				  	// 时钟频率为CLKA的Fosc/2
	*P_TimerA_Data = TIMER_DATA_FOR_32KHZ; 		// 置入计数初值,数据采样率为 32kHz
	Page();                                                             
	KeyFlag = NoKey;
	wei_flag = 0;
	state = normal;
	FM_flag = 0;
	V_value = 0;
	Ctrl_val = 0;
    fre_val = 0;
    fo = 3579140;                              //初始中心频率默认为100K
    WriteAD9851(1000);                         //开机默认输出1000Hz
}	
	    
//************************************************************************************************//
// 函数: main()
// 描述:主函数
//************************************************************************************************//
main()
{   
    unsigned int j,k,*showtemp; 
    *P_Watchdog_Clear=1;                            
    InitialSystem();                    //系统初始化
    //***************************************//
    ma[0] = 0x00f0;
    CtrlAM(ma[0]);
    WriteAD9851(1000);
    WriteAD9851(100000);
    WriteAD9851(1000000);
    WriteAD9851(5000000);
    WriteAD9851(10000000);
    WriteAD9851(15000000);
    //***************************************//
   while(1)                             //扫描键盘
	{
//		AGC();
		KeyFlag = KeyScan();
		if(KeyFlag)
		{
			KeyVal = GetKey();
			switch (KeyVal)
//**********************************************************************************************//
	        {  case 1:              

⌨️ 快捷键说明

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