📄 hello.c
字号:
//烟机
//date 2004/12/01
#include <REG935.H> /* special function register declarations */
/* for the Philips P89C935 device */
#include <stdio.h> /* prototype declarations for I/O functions */
#define uchar unsigned char
void Initialize();
sbit Key1=P0^0;
sbit Key2=P0^1;
sbit Key3=P0^2;
sbit Key4=P0^3;
sbit Key5=P0^6;
sbit QD1=P0^4;
sbit QD2=P0^5;
sbit QD3=P1^7;
sbit QD4=P1^6;
sbit Lamp=P1^4;
//sbit No_electricity=P1^7;//断电 保护
sbit Machine_mode=P1^3;
sbit Machine_drive=P1^2;
bit jump1,jump2,jump3; //数码管 跳动
bit key_able; //按键 使能
bit sys_begin;
bit Lamp1,Lamp2;
uchar deng,deng2;
uchar temp;//串口变量
uchar disp1[11]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF};
uchar disp2[11]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0xFF};//显示 带点
uchar position;//移动数字的位置
uchar gear; //风机的档数
unsigned int time;//总定时 秒数
uchar time60; //最后60秒
uchar flash1,flash2,flash3;
uchar flash_diode;
uchar high_low;
uchar hour,ten_minute,minute;//显示的 数码管 数字
uchar disp_diode; //显示 发光二极管
uchar ii;
uchar com1,com2;
//----------------------------------------------------------
// The delay C function needs about 0.5 ms time
// time(us) = (250*6 + 2 +10)条指令 * 2/晶振
// i=1 time =0.003ms; i=2 time=0.5ms i=3 time=1ms.......
//----------------------------------------------------------
void delay(unsigned int i)
{
uchar j;
while(--i)
{
j=250;
while(--j);
}
}
//-------------------
//串口接受数据中断
//-------------------
void Rcv_ISR() interrupt 4 using 1
{
EA=0;
temp=SBUF;//保存所读取的数据
RI=0; //RI清零 以等待下次接受
if((temp==0x15)&&(!Lamp2)) //接受到正确的数据 开炉具 烟机自动工作
{
com1++;
if(com1>2)
{
Initialize();
Machine_mode=0;//中速
Machine_drive=1;
hour=0; //默认 50 分钟
ten_minute=5;
minute=0;
time=3058; //默认 3000 秒
gear=1; // gear=1 表示 中速
sys_begin=1;
com1=0;
}
}
if((temp==0x26)&&(!Lamp2)) //接受到正确的数据 关炉具 烟机延迟一分钟后自动关机
{
com2++;
if(com2>2)
{
time=0;
com2=0;
}
}
EA=1;
}
// void Send_ISR() interrupt 13
// {
// TI=0;
// }
//------------------
//发送数据
//------------------
void SendData()
{ EA=0;
TI=0; // TI 清零 准备 发送
SBUF=0x37; // 发送数据
while(!TI);// 当TI 为 1 时 发送完毕
TI=0; // TI 清0 准备下一次 发送
EA=1;
}
//------------------
//串口初始化
//------------------
void UART_Init()
{
SCON=0x50; //使能接收,选择串口模式1
SSTAT=0x60; //选择独立的Tx/Rx中断
BRGCON =0x00;
BRGR0=0x78; //1200 baud @ 6MHz
BRGR1=0x13;
BRGCON =0x03; //使能BRG
ESR=1; //ESR=Enable Serial Recieve
//EST=1; //EST=Enable Serial Transmit
}
//------------------
// T0 定时器
//------------------
void T0_int() interrupt 1 using 2
{
EA=0;
TR0=0;
TL0=0x00; TH0=0x00;
TR0=1;
if((Key1)&&(Key2)&&(Key3)&&(Key4)&&(Key5))
EKBI=1; //键盘中断允许
//初始化端口
QD1=1;
QD2=1;
QD3=1;
QD4=1;
P2=0xFF;
QD1=0; //点亮第一个数码管
if(!jump1)//如果不跳动的话
P2=disp2[hour];
else //处理跳动
{
flash1++;
switch (flash1/10)
{
case 0: P2=0xFF; break;
case 1: P2=disp2[hour]; break;
case 2: P2=0xFF; break;
case 3: P2=disp2[hour]; break;
case 4: P2=0xFF; break;
case 5: P2=disp2[hour]; break;
case 6: P2=0xFF; break;
case 7: P2=disp2[hour]; break;
default: jump1=0; break;//不跳了
}
}
delay(5);// Delay about 2 ms
//初始化端口
QD1=1;
QD2=1;
QD3=1;
QD4=1;
P2=0xFF;
QD2=0; //点亮第二个数码管
if(!jump2)//如果不跳动的话
P2=disp1[ten_minute];
else //处理跳动
{
flash2++;
switch (flash2/10)
{
case 0: P2=0xFF; break;
case 1: P2=disp1[ten_minute]; break;
case 2: P2=0xFF; break;
case 3: P2=disp1[ten_minute]; break;
case 4: P2=0xFF; break;
case 5: P2=disp1[ten_minute]; break;
case 6: P2=0xFF; break;
case 7: P2=disp1[ten_minute]; break;
default: jump2=0; break;//不跳了
}
}
delay(5);// Delay about 2 ms
//初始化端口
QD1=1;
QD2=1;
QD3=1;
QD4=1;
P2=0xFF;
QD3=0;//点亮第三个数码管
if(!jump3) //如果不跳动的话
P2=disp1[minute];
else //处理跳动
{
flash3++;
switch (flash3/10)
{
case 0: P2=0xFF; break;
case 1: P2=disp1[minute]; break;
case 2: P2=0xFF; break;
case 3: P2=disp1[minute]; break;
case 4: P2=0xFF; break;
case 5: P2=disp1[minute]; break;
case 6: P2=0xFF; break;
case 7: P2=disp1[minute]; break;
default: jump3=0; break;//不跳了
}
}
delay(5);// Delay about 2 ms
//初始化端口
QD1=1;
QD2=1;
QD3=1;
QD4=1;
P2=0xFF;
QD4=0;
disp_diode|=0xF9;//除了 灯 以外的 发光二极管 全关
if(gear==1) //中速
{
flash_diode++;
switch (flash_diode/10)
{
case 0: disp_diode&=0x7E; break;
case 1: disp_diode&=0x5F; break;
// case 2: disp_diode&=0x7D; break;
default: flash_diode=0; break;
}
}
if(gear==2)//高速
{
flash_diode++;
switch (flash_diode/5)
{
case 0: disp_diode&=0xBE; break;
case 1: disp_diode&=0x9F; break;
// case 2: disp_diode&=0xBD; break;
default: flash_diode=0; break;
}
}
if(gear==3)//低速
{
flash_diode++;
switch (flash_diode/15)
{
case 0: disp_diode&=0x7E; break;
case 1: disp_diode&=0x5F; break;
// case 2: disp_diode&=0x7D; break;
default: flash_diode=0; break;
}
if(flash_diode/15==1)//表示低数度的 发光二极管 闪动
disp_diode|=0x80;
}
if(Lamp1)
disp_diode&=0xFB;
else
disp_diode|=0x04;
if(Lamp2)
disp_diode&=0xFD;
else
disp_diode|=0x02;
P2=disp_diode;
delay(5);// Delay about 2 ms
//初始化端口
QD1=1;
QD2=1;
QD3=1;
QD4=1;
P2=0xFF;
EA=1;
}
//------------------
// 实时时钟定时器
//------------------
unsigned int time1,time2;
void RTC_int() interrupt 10 using 3
{
EA=0;
RTCH=0xB7; //定时 1S
RTCL=0x1A;
RTCCON=0x43;// 清零中断标志
if(time>0)
{
time--;
hour=time/3600;
time1=time%3600;
ten_minute=time1/600;
time2=time1%600;
minute=time2/60;
}
else
{
if(sys_begin)
{
key_able=0;// 移位 和 加法 按键不可用
time60--; //最后60秒
hour=10; //不显示小时位
ten_minute=time60/10;
minute=time60%10;
if(time60==0)
{
Initialize();
TR0=0;
if(!Lamp2)
{
for(ii=0;ii<10;ii++)
{
SendData();
delay(11);
}
}
TR0=1;
}
}
}
if(gear==3) //风机 低数 状态下的 高2秒 低2秒的 控制
{
high_low++;
switch (high_low/2)
{
case 0: Machine_mode=0;
Machine_drive=0; break;
case 1: Machine_mode=0;
Machine_drive=1; break;
default: Machine_mode=0;
Machine_drive=0;
high_low=0; break;
}
}
EA=1;
}
void Key_int() interrupt 7 using 0
{
EA=0;
EKBI=0;
if((!Key1)&&(key_able))
{
delay(31);//// Delay about 15 ms
if(!Key1)
{//处理时钟移位动作
position++;
if(position>3) position=1;
if(position==1) {jump1=1;jump2=0;jump3=0;flash1=0;}
if(position==2) {jump1=0;jump2=1;jump3=0;flash2=0;}
if(position==3) {jump1=0;jump2=0;jump3=1;flash3=0;}
}
}
if((!Key2)&&(key_able))
{
delay(31);//// Delay about 15 ms
if(!Key2)
{//处理时钟加法动作
if(position==1)
{
if(hour<10)
{
hour++;
if(hour>9) hour=0;
time=hour*3600+ten_minute*600+minute*60+58;
jump1=1;
flash1=0;
}
}
if(position==2)
{
if(ten_minute<10)
{
ten_minute++;
if(ten_minute>5) ten_minute=0;
time=hour*3600+ten_minute*600+minute*60+58;
jump2=1;
flash2=0;
}
}
if(position==3)
{
if(minute<10)
{
minute++;
if(minute>9) minute=0;
time=hour*3600+ten_minute*600+minute*60+58;
jump3=1;
flash3=0;
}
}
}
}
if(!Key3)
{
delay(31);//// Delay about 15 ms
if(!Key3)
{//点亮或熄灭 灯 动作
Lamp=~Lamp;
deng++;
switch (deng/2)
{
case 0: Lamp1=1; break;
default: deng=0 ;Lamp1=0; break;
}
if(Lamp1)
disp_diode&=0xFB;
else
disp_diode|=0x04;
}
}
if(!Key5)
{
delay(31);//// Delay about 15 ms
if(!Key5)
{//点亮或熄灭 灯 动作
deng2++;
switch (deng2/2)
{
case 0: Lamp2=1; break;
default: deng2=0; Lamp2=0; break;
}
if(Lamp2)
disp_diode&=0xFD;
else
disp_diode|=0x02;
}
}
if(!Key4)
{
delay(31);//// Delay about 15 ms
if(!Key4)
{//风机 转速 控制
gear++;
if(gear>3) gear=0;
if(gear==0) //停机
{
Machine_mode=0;
Machine_drive=0;
}
if(gear==1) //开始 中档
{
Machine_mode=0;
Machine_drive=1;
if(!sys_begin)
{
hour=0;
ten_minute=5;
minute=0;
time=3058;
sys_begin=1;
}
}
if(gear==2) //高档
{
Machine_mode=1;
Machine_drive=0;
}
if(gear==3) //低档
{
high_low=0;
}
}
}
KBCON=0x00;
EA=1;
}
//------------------
// 数据 初始化
//------------------
void Initialize()
{
key_able=1;//按键能动
sys_begin=0;
position=1;//位置在第一位
jump1=0;jump2=0;jump3=0; //数字不跳动
gear=0;//风机停机档
Machine_mode=0; //关风机
Machine_drive=0;
Lamp=0;//关灯
Lamp1=0;
deng=0;
Lamp2=0;
deng2=0;
time=0;//时间清空
time60=60;
flash1=0;
flash2=0;
flash3=0;
flash_diode=0;
high_low=0;
hour=10; //都不显示
ten_minute=10;
minute=10;
disp_diode=0xFF;
com1=0;com2=0;
}
//------------------------------------------------
// The main C function.
//------------------------------------------------
void main()
{
EA=1; //中断总允许
//P0,P1,P2口模式设置
P0M1 = 0xFF;
P0M2 = 0xFF;
P1M1 = 0xDC;
P1M2 = 0xDC;
P2M1 = 0xFF;
P2M2 = 0xFF;
//P0,P1,P2初始化
P0=0xFF;
P1=0xC3;
P2=0xFF;
TMOD=0x01;//定时器模式1
TL0=0x00; TH0=0x00;
ET0=1; //定时器中断允许
TR0=1; //打开 定时器 以产生 振荡频率
//产生38KHz,50%占空比
//使T1(P0.7)
TH1=0xD9;
TMOD=0x21;
AUXR1|=0x20;
TR1=1;
//产生38KHz,50%占空比的方波
EWDRT=1; //实时时钟 中断开启
WDCON=0xE0; //关看门狗 定时器
RTCH=0xB7; //定时 1S
RTCL=0x1A;
RTCCON=0x43;// 开启实时时钟定时器
WFEED1=0xA5;
WFEED2=0x5A;
UART_Init();//串口初始化
KBPATN=0xFF;//键盘中断初始设置
KBCON=0x00;
KBMASK=0x4F;
EKBI=1;
Initialize();//数据初始化
delay(1001); // Delay about 0.5 seconds
while (1)
{
delay(2); // Delay about 0.0005 seconds
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -