📄 310_inital.c
字号:
#include <stdio.h>
#include "310_struct.h"
#define uchar unsigned char
#define uint unsigned int
#define ADC0_TEMP0 0
#define ADC0_TEMP1 1
#define ADC0_HIH0 2
#define dry 1
#define warmth 2
#define wet 3
#define alarmlimit 0xaf
void INIT_PORT (void) ;
INIT_ADC0 (unsigned char channel) ;
uint ADC0_TEMP (void) ;
void INIT_UART0 (void) ;
void INIT_TIMER2 (unsigned int iT2num) ;
void INIT_PCA(void) ;
void INIT_INTERRUPT (void) ;
void time3_open (void) ;
void time_open (void) ;
void time3_close (void) ;
void time_close (void) ;
void delay (void) ;
void INIT_SYS_CLK (void) ;
void step_machinery (uchar up_down) ;
void mode(uchar mode_num) ;
void uvcn(void) ;
void fan_speed (void) ;
void run_cn(uchar runbu) ;
void alarm(void) ;
extern xdata struct model locate ;
extern uchar power ;
extern uchar min ;
sbit AA = P3^0 ;
sbit BB = P3^1 ;
sbit CC = P3^2 ;
sbit DD = P3^3 ;
sbit fanh = P1^3 ;
sbit fanl = P1^4 ;
sbit compress = P1^5 ;
sbit uv = P1^6 ;
sbit hot = P1^7 ;
sbit expulsion = P2^0 ;
sbit ring = P2^1 ;
sbit run_lamp = P2^3 ;
sbit dry_lamp = P2^4 ;
sbit wet_lamp = P2^5 ;
sbit warm_lamp = P2^6 ;
sbit uv_lamp = P2^7 ;
/**********************************************
Function:SYSCLK_Init
Description:Choose the clock of system;
Called by:main();
***********************************************/
void INIT_SYS_CLK (void)
{
int i; // delay counter
for (i=0; i < 256; i++) ; // XTLVLD blanking interval (>1ms)
OSCICN = 0xc3;//select local oscillator as SYSCLK
CLKSEL = 0x00;//select SYSCLK from register OSCICN setup ;
while (!(OSCICN & 0X40)) {
;
}
RSTSRC = 0x04 ;
}
void INIT_PORT (void){
XBR1 = 0x42 ;
XBR0 = 0x01 ; // Enable crossbar and weak pull-ups
P0MDOUT = 0x13 ;
P1MDOUT = 0xf8 ;
P2MDOUT = 0xff ;
P3MDOUT = 0x0f ;
}
void INIT_PCA(void) {
PCA0CN = 0x40 ;
PCA0MD = 0x00 ; //pca_clock = sys_clock/12 ;
PCA0CPM0 = 0x11 ; //下降沿
PCA0CPM1 = 0x21 ; //上升沿
}
INIT_ADC0 (unsigned char channel){
REF0CN = 0x0a ;
//Choose the VREF come from VDD;
AMX0P = channel;//0x1e ; //channel
//Select ADC0 channel ; example :AMX0P = 0X00 ,Select P1.0
AMX0N = 0xff ;
//Select ADC0 second channel ; like up
ADC0CF = 0x08 ;
//Select ADC0 CLKSAR ;
ADC0CN = 0xc0 ;
/**ADC0CN********************
* BIT 7 6 5 4 3 2 1 0
* | | | | | |__|__|___SAR Start kind choose; 000:write AD0BUSY ADC0 start
* | | | | | 001:timer 0 full ADC0 start
* | | | | | 010:timer 2 full ADC0 start
* | | | | | 011:timer 1 full ADC0 start
* | | | | | 100:information of CNVSTR input
* | | | | | 101:timer 3 full ADC0 start
* | | | | |_____________ADC0 windows compare
* | | | |________________ADC0 busy
* | | |___________________
* | |______________________
* |_________________________
*/
}
uint ADC0_TEMP (void){
uint temp ;
uint buffer ;
uchar change_times ;
temp = 0 ;
for (change_times = 0;change_times < 0x0f;change_times++){
ADC0CN |= 0x10 ;
while(AD0INT == 0){ //Waiting conventer over;
}
ADC0CN &= 0xcf;
buffer = 0 ; //Clear buffer ;
buffer = ADC0H ; //Adc0h to buffer ;
buffer = (buffer << 8) ;
buffer += ADC0L ;
temp += buffer ;
}
return (temp) ;
}
void INIT_UART0 (void)
{
SCON0 = 0x10 ; // SCON0: mode 1, 8-bit UART, enable RX
}
/**********************************************
入口地址:Timer2_Init()
功能:T2作为串口发送和接收时钟;
被调用函数:main();
***********************************************/
void INIT_TIMER2 (unsigned int iT2num)
{
CKCON = 0x00 ;//use system/12 clock;
TL1 = iT2num;//0x95; // Init reload values
TH1 = iT2num;//0x95; // set to reload immediately
TMOD = 0x20 ;
TCON = 0x00 ;
TR1 = 1 ;
}
void INIT_INTERRUPT (void){
EIE1 = 0x98 ; //Enable interrupt all of PCA,T3,AD;
IE = 0x20 ; //open T2;
EA = 1 ;
}
void delay (void){
uint delay_num ;
uchar delay_loop ;
for (delay_loop = 0 ;delay_loop<200 ;delay_loop++){
for (delay_num = 0;delay_num < 400;delay_num++){
;
}
}
}
void step_machinery (uchar up_down) {
uchar step_num ;
if (up_down != 0){
for (step_num = 10 ;step_num != 0 ;step_num --){
AA = 1 ;
BB = 0 ;
CC = 0 ;
DD = 0 ;
delay () ;
AA = 0 ;
BB = 1 ;
CC = 0 ;
DD = 0 ;
delay () ;
AA = 0 ;
BB = 0 ;
CC = 1 ;
DD = 0 ;
delay () ;
AA = 0 ;
BB = 0 ;
CC = 0 ;
DD = 1 ;
delay () ;
}
for (step_num = 10 ;step_num != 0 ;step_num --){
AA = 1 ;
BB = 0 ;
CC = 0 ;
DD = 0 ;
delay () ;
AA = 0 ;
BB = 0 ;
CC = 0 ;
DD = 1 ;
delay () ;
AA = 0 ;
BB = 0 ;
CC = 1 ;
DD = 0 ;
delay () ;
AA = 0 ;
BB = 1 ;
CC = 0 ;
DD = 0 ;
delay () ;
}
}
else {
AA = 0 ;
BB = 0 ;
CC = 0 ;
DD = 0 ;
delay () ;
}
}
void time_open (void){
TMR2RLL = 0X00 ;
TMR2RLH = 0X00 ;
TMR2L = 0X00 ;
TMR2H = 0X00 ;
TMR2CN = 0X04 ;
}
void time3_open (void){
TMR3RLL = 0X00 ;
TMR3RLH = 0X00 ;
TMR3L = 0X00 ;
TMR3H = 0X00 ;
TMR3CN = 0x04 ;
}
void time3_close (void){
TMR3CN = 0x00 ;
}
void time_close (void){
TMR2CN = 0x00 ;
}
void time (void){
if (locate.timer == 0){
time3_close () ;
}
}
void mode(void) {
static uchar history ;
uint temp_adopt ;
uchar temph ;
uchar templ ;
if (locate.mode_choose == dry){ //干衣模式
dry_lamp = 1 ;
wet_lamp = 0 ;
warm_lamp = 0;
compress = 0 ;
delay () ;
INIT_ADC0 (ADC0_TEMP0) ;
temp_adopt = ADC0_TEMP () ;
temp_adopt = (temp_adopt >> 4) ;
temp_adopt = (temp_adopt * 10) / 17 ;
templ = temp_adopt ;
temph = (temp_adopt >> 8) ;
// SBUF0 = templ ; //将发送缓冲中的数据发送出去;
// while(TI0 == 0) //等待;
// {}
// TI0 = 0;
if(templ > 35){
hot = 0 ;
delay () ;
}
if(templ < 25){
hot = 1 ;
delay () ;
}
if (min == 1){ //3分钟时间到
min = 0 ; //清除时钟标志
power = 0 ; //locate.power ;
time_close (); //关闭定时器
history = 0 ;
}
if(locate.power == 0){
if(history != 1){
time_open () ; //定时器开启
history = 1 ;
}
}
else {
power = 1 ;
}
}
if(locate.mode_choose == wet){ //抽湿模式
static uchar history ;
dry_lamp = 0 ;
hot = 0 ;
wet_lamp = 1 ;
warm_lamp = 0;
delay () ;
power = locate.power ;
if (min == 1 ){ //3分钟时间到
min = 0 ; //清除时钟标志
history = 0 ;
compress = 1 ;
delay () ;
time_close (); //关闭定时器
}
INIT_ADC0 (ADC0_HIH0) ;
temp_adopt = ADC0_TEMP () ;
temp_adopt = (temp_adopt >> 4) ;
temp_adopt = (temp_adopt * 10) / 7 ;
templ = temp_adopt ;
temph = (temp_adopt >> 8) ;
// SBUF0 = templ ; //将发送缓冲中的数据发送出去;
// while(TI0 == 0) //等待;
// {}
// TI0 = 0;
if((templ - 2) > locate.humidity ){
if(locate.power == 0){
if(history != 1){
time_open () ; //定时器开启
history = 1 ;
}
}
}
if((locate.humidity - 2) > templ){
compress = 0 ;
delay () ;
}
}
if(locate.mode_choose == warmth){ //才暖模式
dry_lamp = 0 ;
wet_lamp = 0 ;
warm_lamp = 1 ;
compress = 0 ;
delay () ;
INIT_ADC0 (ADC0_TEMP0) ;
temp_adopt = ADC0_TEMP () ;
temp_adopt = (temp_adopt >> 4) ;
temp_adopt = (temp_adopt * 10) / 17 ;
templ = temp_adopt ;
temph = (temp_adopt >> 8) ;
// SBUF0 = templ ; //将发送缓冲中的数据发送出去;
// while(TI0 == 0) //等待;
// {}
// TI0 = 0;
if((templ - 1) > locate.temp){
hot = 0 ;
delay () ;
}
if((locate.temp - 1) > templ){
hot = 1 ;
delay () ;
}
if (min == 1){ //3分钟时间到
min = 0 ; //清除时钟标志
power = 0;//locate.power ;
history = 0 ;
time_close (); //关闭定时器
}
if(locate.power == 0){
if(history != 1){
time_open () ; //定时器开启
history = 1 ;
}
}
else {
power = 1 ;
}
}
}
void uvcn(void){
if(locate.uv == 1){
uv = 1 ;
uv_lamp = 1 ;
delay () ;
}
else {
uv = 0 ;
uv_lamp = 0 ;
delay () ;
}
}
void fan_speed (void){
if(locate.fan == 1){
fanh = 1 ;
fanl = 0 ;
delay () ;
}
else {
fanh = 0 ;
fanl = 1 ;
delay () ;
}
}
void run_cn(uchar runbu){
if(runbu != 0){
run_lamp = 1 ;
expulsion = 0 ;
DD = 1 ;
delay () ;
}
else {
run_lamp = 0 ;
expulsion = 1 ;
DD = 0 ;
delay () ;
}
}
void alarm(void){
uchar alarmnum ;
INIT_ADC0 (ADC0_TEMP1) ;
alarmnum = ADC0_TEMP () ;
if(alarmnum > alarmlimit){
ring = 1 ;
}
else {
ring = 0 ;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -