📄 init.c
字号:
//-----------------------------------------------------------------------------
// Includes
//-----------------------------------------------------------------------------
#include <c8051F020.h>
#include "stdio.h"
//-----------------------------------------------------------------------------
// 16-bit SFR Definitions for 'F02x
//-----------------------------------------------------------------------------
sbit LED=P1^6;
sbit SETK=P1^2;
sbit ADDK=P1^3;
sbit SHIFTK=P1^4;
sfr16 AD0=0xbe;
sfr16 DAC0=0xd2;
sfr16 DAC1=0xd5;
//-----------------------------------------------------------------------------
// Global Constants
//-----------------------------------------------------------------------------
#define uchar unsigned char
#define uint unsigned int
#define ANALOG_INPUTS 9
#define SYSCLK 22118400 // Output of PLL derived from (INTCLK*2)
#define SAR_CLK 2500000 // Desired SAR clock speedfw
#define FUNC 10
#define SHIFT 5
//-----------------------------------------------------------------------------
// Function Prototypes
//-----------------------------------------------------------------------------
void Timer_Init(void);
void Port_IO_Init(void);
void UART_Init(void);
void Oscillator_Init(void);
void Interrupts_Init(void);
void Init_Device(void) ;
void Ad0_Init(void) ;
void Ad0_8data(void);
void Da_init(void) ;
void Da_out(uint Da_data0,uint Da_data1) ;
void key(void);
void delayms(uint x);
void setk(void);
void addk(void);
void shiftk(void);
//-----------------------------------------------------------------------------
// Global Variables
//-----------------------------------------------------------------------------
bit set_flag=0;
bit data_flag=0;
uchar func_code=0x00;
uchar shift_code=0x00;
uchar TIMER0_DATAH=0xf8;
uchar TIMER0_DATAL=0xcc; //时基1ms
uchar T_factor=0x64; //1ms x 8
uchar L0;
uint command_data[FUNC];
uint dat1=0x0000;
uint dat2=0x0000;
uint Result[ANALOG_INPUTS];
//-----------------------------------------------------------------------------
// main() Routine
//-----------------------------------------------------------------------------
main() {
Init_Device();
ET0=1; //allow t0 int
EA=1;
TR0=1;
L0=T_factor;
for(;;) {
WDTCN =0xa5;
Ad0_8data();
key();
}
}
void Ad0_Init(void) {
AMX0CF=0x00; //选择输入方式:单端或差分(低四位)," 0 "为单端
AMX0SL=0x00; //通道选择:低四位(0000-0111)对应AIN0-AIN7; 1XXX对应温度传感器
//控制寄存器 */
AD0=0x0000; //ad转换值高位字节(4位)
//ad转换值低位字节(8位)
REF0CN= 0x07; //参考电压设定
// ADC conversion clock = 2.5MHz
ADC0CF = 0x40;
ADC0CN = 0x40; }
void Ad0_8data(void) {
uchar i=0;
AD0EN=1; //使能AD//
for(i=0;i<ANALOG_INPUTS;i++){
AMX0SL=i;
AD0INT=0;
AD0BUSY=1;
while (AD0INT==0){WDTCN =0xa5;}
Result[i]=AD0;
}
}
void Da_init(void) {
REF0CN = 0x07;
}
void Da_out(uint Da_data0,uint Da_data1) {
DAC0CN =0x80;
DAC0=Da_data0;
DAC1CN =0x80;
DAC1= Da_data1;
}
void Timer_Init() {
CKCON = 0x60; //时钟选择system clk or system clk/12
TMOD = 0x01; //time0 mode 1 :16 bit timing
TH0 = TIMER0_DATAH; //1ms timing
TL0 = TIMER0_DATAL;
T2CON = 0x30; //UART0 baud rate;9600b/s clk=system clk
RCAP2L = 0xB8; //T2=UART0
RCAP2H = 0xFF;
T4CON = 0x30; //UART1 baud rate;9600b/s clk=system clk
RCAP4L = 0xB8; //T4=UART1
RCAP4H = 0xFF;
}
void UART_Init() {
SCON0 = 0x40;
SCON1 = 0x40;
}
void Port_IO_Init() {
XBR0 = 0x07; //配置
XBR2 = 0x44; //交叉开关 enable
P1MDIN = 0x1c; //p1.2,p1.3,p1.4 digital input
P1MDOUT = 0x40; //P1.6口上拉
}
void Oscillator_Init() {
int i = 0;
OSCXCN = 0x67;
for (i = 0; i < 3000; i++); // Wait 1ms for initialization
while ((OSCXCN & 0x80) == 0);
OSCICN = 0x08;
}
void Interrupts_Init() {
IE = 0x12;
EIE2 = 0x60;
}
void Init_Device(void) {
Interrupts_Init();
Oscillator_Init() ;
Port_IO_Init() ;
UART_Init() ;
Timer_Init();
Ad0_Init();
Da_init();
}
void Timer0_ISR (void) interrupt 1
{
TR0=0;
TF0=0;
L0--;
if(L0==0) {
LED = ~LED;
dat1++;
dat2=dat1*2;
if (dat1>0x0800){dat1=0x0800;}
Da_out(dat1,dat2) ;
L0=T_factor;} // Toggle the LED
TH0 = TIMER0_DATAH; // Reinit Timer0 register
TL0 = TIMER0_DATAL;
TR0=1;
}
void key(void){
uchar shake;
SETK=1;
ADDK=1;
SHIFTK=1; //端口配置为输入状态
shake=P1&0x1c; //00011100b
delayms(5);
SETK=1;
ADDK=1;
SHIFTK=1;
if(shake==(P1&0x1c)) {
switch(shake){
case 0x18:{setk();}break;
case 0x14:{addk();}break;
case 0x0c:{shiftk();}break;
}
} }
void setk(void) {
while(SETK==0) {WDTCN =0xa5;}
if(set_flag) {data_flag=1;
shift_code=0x00;
}
set_flag=1;
}
void addk(void) {
uint bitt;
while(ADDK==0){WDTCN =0xa5;}
if(set_flag) {
if(data_flag){
switch(shift_code){
case 0: bitt=0x01;
case 1: bitt=0x0a;
case 2: bitt=0x64;
case 3: bitt=0x03e8;
case 4: bitt=0x2710;
}
command_data[func_code]+=bitt;
}
else {
if(func_code<=FUNC) {func_code++;}
else {func_code=0x00;}
}
}
}
void shiftk(void){
while(SHIFTK==0){WDTCN =0xa5;}
if(data_flag){
if(shift_code<=SHIFT) {shift_code++;}
else {shift_code=0;}
}
}
void delayms(uint x){
uint x1;
while(x--){
for (x1 = 0; x1 < 3000; x1++); //1ms??
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -