📄 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 + -