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

📄 020main.c

📁 cf8020+cp2200(网络)的驱动实现
💻 C
字号:
#include "global.h"
sfr16 DP = 0x82; // 数据指针
sfr16 TMR3RL = 0x92; // 定时器3重装值
sfr16 TMR3 = 0x94; // 定时器3计数器
sfr16 ADC0 = 0xbe; // ADC0数据
sfr16 ADC0GT = 0xc4; // ADC0大于窗口
sfr16 ADC0LT = 0xc6; // ADC0小于窗口
sfr16 RCAP2 = 0xca; // 定时器2捕捉/重装
sfr16 T2 = 0xcc; // 定时器2
sfr16 RCAP4 = 0xe4; // 定时器4捕捉/重装
sfr16 T4 = 0xf4; // 定时器4
sfr16 DAC0 = 0xd2; // DAC0数据
sfr16 DAC1 = 0xd5; // DAC1数据
//-----------------------------------------------------------------------------
// 全局常量
//-----------------------------------------------------------------------------
#define SYSCLK 22118400 // 系统时钟频率Hz
#define BAUDRATE 115200 // UART波特率bps
#define SAMPLERATE0 50000 // ADC0采样频率Hz
#define NUM_SAMPLES 2048 // ADC0采样次数
#define TRUE 1
#define FALSE 0
sbit LED = P1^6; // LED=’1’ 意为开
sbit SW1 = P3^7; // SW1=’0’ 意为按压开关
//-----------------------------------------------------------------------------
// 函数原型
//-----------------------------------------------------------------------------
void SYSCLK_Init (void);
void PORT_Init (void);
void UART0_Init (void);
void ADC0_Init (void);
void Timer3_Init (int counts);
xdata unsigned samples[100]; // 存储ADC0结果数组
char flag = 0;

sfr16 TMR2RL   = 0xca;                    // Timer2 reload value
sfr16 TMR2     = 0xcc;                    // Timer2 counter

void main(void)
{
	long i; // 循环计数器
	WDTCN = 0xde; // 禁止看门狗定时器
	WDTCN = 0xad;
	SYSCLK_Init (); // 初始化振荡器
	PORT_Init (); // 初始化数据交叉开关和通用IO口
	UART0_Init (); // 初始化UART0
	Timer3_Init (SYSCLK/SAMPLERATE0); // 初始化定时器3溢出作为ADC0采样率
	EA = 1; // 允许全部中断
	while (1) {
//	P0 = P1 = P2 = P3 = P4 = P5  = P6 = P7 = 0XFF;
		flag = !flag;
		LED = flag; // 在采样过程中点亮LED
		 wait_ms(100);
	//	EIE2 |= 0x02; // 允许ADC0中断
		//while (ADC0_DONE == FALSE); // 等待采样结果
		// 上传采样值到UART0
	//	LED = 0; // 上传其间关LED 灭
	//	for (i = 0; i < NUM_SAMPLES; i++) 
	//	{
		//	printf("%u", samples[i]);
			//printf("%u",samples[i]);
	//	}
//		printf ("\n");
	}

}


void SYSCLK_Init (void)
{
	int i; // 延时计数器
	OSCXCN = 0x67; // 开启外部振荡器22.1184MHz晶体
	for (i=0; i < 256; i++) ; // 等待振荡器启振
	while (!(OSCXCN & 0x80)) ; // 等待晶体振荡器稳定
	OSCICN = 0x88; // 选择外部振荡器为系统时钟源并允许丢失时钟检测器
}

void PORT_Init (void)
{
	XBR0 = 0x04; // 使能UART0
	XBR1 = 0x00;
	XBR2 = 0x40; // 使能数据交叉开关和弱上拉
	P0MDOUT |= 0x01; // 允许TX0为推挽输出
	P1MDOUT |= 0x40; // 允许P1.6(LED)为推挽输出
}
//-----------------------------------------------------------------------------
void UART0_Init (void)
{
	SCON0 = 0x50; // SCON0: 模式1, 8位UART, 使能RX
	TMOD = 0x20; // TMOD: 定时器1, 模式2, 8位重装
	TH1 = -(SYSCLK/BAUDRATE/16); // 根据波特率的值设定定时器1重装值
	TR1 = 1; // 启动定时器1
	CKCON |= 0x10; // 定时器1使用系统时钟作为时基
	PCON |= 0x80; // SMOD00 = 1
	TI0 = 1; // 表示TX0就绪
}

void Timer3_Init (int counts)
{
	TMR3CN = 0x02; // 停止定时器3; 清除TF3;
// 使用系统时钟作为时基
	TMR3RL = -counts; // 初始化重装值
	TMR3 = 0xffff; // 立即开始重装
	EIE2 &= ~0x01; // 禁止定时器3中断
	TMR3CN |= 0x04; // 启动定时器3
}

void wait_ms(int ms)
{


   T2CON = 0x00;                      // Stop Timer2; Clear TF2;

   RCAP2 = -(SYSCLK/1000/12);         // Timer 2 overflows at 1 kHz
   TMR2 = RCAP2;

   ET2 = 0;                            // Disable Timer 2 interrupts

   TR2 = 1;                            // Start Timer 2  

   ms = ms;
   while(ms){
   TF2 = 0;
      while(!TF2);                     // wait until timer overflows
      ms--;                            // decrement ms
   }

   TR2 = 0;                            // Stop Timer 2

}

⌨️ 快捷键说明

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