📄 blinky.c
字号:
//------------------------------------------------------------------------------------
// Blinky.c
//------------------------------------------------------------------------------------
// Copyright (C) 2004 Silicon Laboratories, Inc.
//
// AUTH: BW
// DATE: 10 OCT 01
//
// This program flashes the green LED on the C8051F2xx target board about five times
// a second using the interrupt handler for Timer2.
//
// Target: C8051F2xx
//
// Tool chain: KEIL Eval 'c'
//
//------------------------------------------------------------------------------------
// Includes
//------------------------------------------------------------------------------------
#include <c8051f200.h> // SFR declarations
//------------------------------------------------------------------------------------
// 16-bit SFR Definitions for 'F2xx
//------------------------------------------------------------------------------------
sfr16 DP = 0x82; // data pointer
sfr16 ADC0 = 0xbe; // ADC0 data
sfr16 ADC0GT = 0xc4; // ADC0 greater than window
sfr16 ADC0LT = 0xc6; // ADC0 less than window
sfr16 RCAP2 = 0xca; // Timer2 capture/reload
sfr16 T2 = 0xcc; // Timer2
//------------------------------------------------------------------------------------
// Global CONSTANTS
//------------------------------------------------------------------------------------
#define SLEEP 0x01 //PCON POWER SLEEP
#define ADCCH 30000 // ADC
unsigned int data adcbuf[30]; // ad
unsigned int idata adcxsh[30];
unsigned int idata ubat[30];
sbit T485 = P3^7; //TX RX CHANGE
//------------------------------------------------------------------------------------
// Function PROTOTYPES
//------------------------------------------------------------------------------------
void port_init (void);
void timer2_init (void);
void timer0_init (void);
void timer0_isr (void);
void uart_isr (void);
void dog_init (void);
void uart_init (void);
void adcl (void);
void txcl (void);
void loadxsh (void);
void savexsh (void);
unsigned char data m=0;
unsigned char bdata bz;
sbit bz_ad = bz^0;
sbit bz_tx = bz^1;
void main (void)
{ loadxsh();
port_init ();
timer0_init();
timer2_init();
uart_init();
dog_init(); //watch dog
EA = 1; // enable global interrupts
while (1)
{ PCON = SLEEP; //SLEEP
if(bz_ad==1) adcl(); //ad chu li
if(bz_tx==1) txcl(); //tongxin chu li
}
}
//////////////////////////////
// load xishu
/////////////////////////////
void loadxsh(void)
{ unsigned int code *pread;
unsigned char data i;
pread = 0x2000;
for(i=0;i<30;i++)
{ adcxsh[i] = *pread ;
pread++;
}
}
////////////////////////////////////
//gen huan xi shi
////////////////////////////////////
void savexsh(void)
{ unsigned int xdata *pwrite;
unsigned char data i;
//WDTCN = 0xde;
//WDTCN = 0xad;
// 擦除128 字节的信息页位于0x2000
EA = 0;
FLSCL = 0x89; // 设置FLASH 标度寄存器对16MHz 系统时钟
PSCTL = 0x03; // 将PSWE 和PSEE 置1 MOVX 指令对应
// 的FLASH 页
pwrite = 0x2000; // 将指针指向待擦除页
*pwrite = 0; // 启动擦除过程
PSCTL = 0x01; // 清除PSEE PSWE 仍然置1
for(i=0;i<30;i++)
{ *pwrite = adcxsh[i];
pwrite++;
}
PSCTL = 0; // 禁止FLASH 写
FLSCL = 0x8f; //
EA = 1;
}
//////////////////////////////
//ad chu li
/////////////////////////////
void adcl(void) //ad chul
{ unsigned char data m;
unsigned long data linshi1,linshi2;
bz_ad = 0;
ET0 = 0; //DISABLE TIME0 INTERRUPT
TR0 = 0; //STOP TIME0
for(m=0;m<30;m++)
{ linshi1 = adcbuf[m];
linshi2 = adcxsh[m];
ubat[m]= (linshi1*linshi2)/(long)ADCCH ;
}
TR0 = 1; //START TIME0
ET0 = 1; //ENABLE TIME0 INTERRUPT
}
//------------------------------------------------------------------------------------
// PORT_Init
//------------------------------------------------------------------------------------
void port_init (void)
{ OSCICN = 0x17; //SYSCLK 16M
PRT0MX = 0x01; //enable uart i/o
PRT0CF = 0x01; //tx push-pull
PRT3CF = 0x80; //p3.7 push_pull
P0MODE = 0xfc; // p0.2-p0.7 adc mode
P1MODE = 0x00; //P1-P3 adc mode
P2MODE = 0x00;
P3MODE = 0x80;
AMX0SL = 0x20; //ENABLE AMUX
ADC0CF = 0x80; //SAR=16
ADC0CN = 0xc0; //1100 0000
REF0CN = 0x03; //vref=vdd
PCON = 0x00; //POWER
}
void dog_init (void)
{
}
///////////////////////////////
//timer0 init
//////////////////////////////
void timer0_init(void)
{
TCON = 0x20; //0001 0000 STOP TIME1
TMOD = 0x01; //
CKCON = 0x20; //T2=16M T0,T1=16/12M
TL0 = 0xca; //1ms out
TH0 = 0xfa;
ET0 = 1; // enable Timer0 interrupts
TR0 = 1; //start timer0
}
//------------------------------------------------------------------------------------
// Timer2_Init
//------------------------------------------------------------------------------------
void timer2_init (int counts)
{
T2CON = 0x34; // timer2 uart timer
T2 = 0xff30; // 4800bp/s
ET2 = 1; // enable Timer2 interrupts
TR2 = 1; // start Timer2
}
////////////////////////////////////
//
////////////////////////////////////
//------------------------------------------------------------------------------------
// Interrupt Service Routines
//------------------------------------------------------------------------------------
void uart_init (void)
{
SCON = 0xf0 ; //MODE 1
ES = 1 ; //ENABLE INT
T485 = 0 ; //RECIEW STATE
}
//------------------------------------------------------------------------------------
// Timer2_ISR
//------------------------------------------------------------------------------------
// This routine changes the state of the LED whenever Timer2 overflows.
//
void timer0_isr (void) interrupt 1
{
T485 = 1 ;
}
void uart_isr (void) interrupt 3
{
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -