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

📄 c8051f410.c

📁 C8051F410初始化设置程序,是一个很好的程序.
💻 C
字号:
//-----------------------------------------------------------------------------
// 包含文件
//-----------------------------------------------------------------------------
#include <c8051f410.h>                   // SFR 声明
#include "stdio.h"                      // printf() and getchar()
#include <intrins.h>

//-----------------------------------------------------------------------------
// 16-bit SFR Definitions for 'F41x
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
// 函数原型
//-----------------------------------------------------------------------------
void SYSCLK_Init (void);
void PORT_Init (void);
void UART0_Init (void);
void AIN1(void);
void Timer_Init(void);
void UART0_Init (void);

//-----------------------------------------------------------------------------
// 全局常量
//-----------------------------------------------------------------------------
#define SYSCLK      24500000           // 系统时钟频率 Hz
#define BAUDRATE        9600           // UART波特率 bps

//------------------------------------------------------------------------------
//全局变量
//-----------------------------------------------------------------------------
  int    SSS;
  long   hhh; 
  int i,j,w,z;
  unsigned char s,d,f; 
  int      aaa,bbb,oo;
//-------------------------------------------------------------------------------
//主程序
//-----------------------------------------------------------------------------
void main (void)
{
 unsigned int  mm;
    PCA0MD &= ~0x40;         // WDTE = 0 (clear watchdog timer enable)禁止看门狗
    SYSCLK_Init ();
    PORT_Init ();
 
    Timer_Init();
    UART0_Init();
    AIN1();
EIE1      = 0x08;           //允许AD0INT转换结束标志(该位为1表示完成了一次数据转换)的中断请求
EA=1;                       //开放总中断源
    while(1)
  {  
  while(AD0INT==0);       //为0则等待AD数据转换结束
    AD0INT=0;
    mm=(ADC0H<<8)+ADC0L;
 mm=mm&0x7ff;
 printf("mm=%d\n",mm);   //通过UART输出数据mm

 EIE1&=~0x08;            //禁止AD0INT转换结束标志的中断请求(即EIE1各位都清零)
 EA=0;                   //禁止所有中断

 for (i=0;i<125;i++)
      for (j=0;j<250;j++);
   
     EIE1      |= 0x08;  //允许AD0INT转换结束标志(该位为1表示完成了一次数据转换)的中断请求
     EA=1;               //开放总中断源

 } 

 }  

//-----------------------------------------------------------------------------
// 子程序初始化
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------  
//  IO口初始化子程序
//-----------------------------------------------------------------------------
//
// 配置数据交叉开关和通用IO口
//
void PORT_Init(void)
{   P1MDIN   &= 0xBF;      //把P1口的P16引脚配置为模拟输入
    P1SKIP    |= 0x47;      //使交叉开关跳过P10,P11,P12和P16
      XBR1      = 0x40;      //使能交叉开关
    XBR0      = 0x01;      //UART使能,使TX0,RX0连到端口引脚P04和P05
   P0MDOUT    = 0x10;      //P04(TX0)推挽输出,P05开漏输出
}

//-----------------------------------------------------------------------------
// 系统时钟初始化子程序
//-----------------------------------------------------------------------------
//void SYSCLK_Init(void)
//{ 
//    OSCICN   = 0x87;        //使用内部振荡器,不分频24.5MHz
//}
void SYSCLK_Init (void)
{
   
   OSCICN = 0x87;                      // 选择内部振荡器作为系统时钟SYSCLK
                                       // 内部振荡器不分频24.5MHz
                                        
}
//-----------------------------------------------------------------------------
// ADC0初始化
//-----------------------------------------------------------------------------
void AIN1(void)
{   ADC0MX    = 0x0E;         //选择P16作为模拟输入通道
    ADC0CF    = 0xC0;         //ADC转换时钟=0.9MHz,执行1次转换
    ADC0CN    = 0x81;         //使能ADC0,定时器3溢出启动ADC0转换,转换数据右对齐
    //ADC0CN    = 0x90;       //使能ADC0,写AD0BUSY为1启动转换,转换数据右对齐
    REF0CN    = 0x13;         //IDA1输出为P01,选择内部电压基准2.2V
  }
  
//-----------------------------------------------------------------------------
// 定时器初始化子程序
//----------------------------------------------------------------------------  
 //void Timer_Init(void)
//{
//    TMR3CN    = 0x24;        //定时器3允许,允许定时器3低字节中断,16位自动重装载工作方式
//   TMR3RLH   = 0x80;     //定时器3重载寄存器的高字节值

//}
void Timer_Init(void)
{
 TMR3CN =0x24;
 TMR3RLH =0x80;
}
 
//-----------------------------------------------------------------------------
// UART0初始化
//-----------------------------------------------------------------------------
void UART0_Init (void)
{
   SCON0 = 0x10;                       // SCON0: 波特率可编程的8位UART
                                       // level of STOP bit is ignored 停止位的逻辑电平被忽略
                                       // RX enabled 允许UART接收
                                       // ninth bits are zeros  8位UART方式中第9发送位未用
                                       // clear RI0 and TI0 bits RI0位和TI0位必须用软件清零
   if (SYSCLK/BAUDRATE/2/256 < 1) {
      TH1 = -(SYSCLK/BAUDRATE/2);
      CKCON &= ~0x0B;                  // T1M = 1; SCA1:0 = xx 定时器1使用系统时钟
      CKCON |=  0x08;
   } else if (SYSCLK/BAUDRATE/2/256 < 4) {
      TH1 = -(SYSCLK/BAUDRATE/2/4);
      CKCON &= ~0x0B;                  // T1M = 0; SCA1:0 = 01 定时器1使用系统时钟                 
      CKCON |=  0x09;
   } else if (SYSCLK/BAUDRATE/2/256 < 12) {
      TH1 = -(SYSCLK/BAUDRATE/2/12);
      CKCON &= ~0x0B;                  // T1M = 0; SCA1:0 = 00定时器1使用系统时钟12分频做时钟
   } else {
      TH1 = -(SYSCLK/BAUDRATE/2/48);
      CKCON &= ~0x0B;                  // T1M = 0; SCA1:0 = 10定时器1使用系统时钟48分频做时钟
      CKCON |=  0x02;
   }

   TL1 = TH1;                          // init Timer1 定时器1高低字节数据寄存器
   TMOD &= ~0xf0;                      // TMOD: timer 1 in 8-bit autoreload自动重装载的8位计数器/定时器
   TMOD |=  0x20;                       
   TR1 = 1;                            // START Timer1 启动定时器1

   TI0 = 1;                            // Indicate TX0 ready
}

⌨️ 快捷键说明

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