📄 project based on embeded system(c51).txt
字号:
/*****************************************************************************/
//文件说明:
// 1。整个程序是基于small rtos51编写的,并遵守了使用协议
// 2。这是一个正式产品的程序的一个部分,省略了一部分控制方面的关键代码,和实现产品中的特殊功能的代码,但关于嵌入式small rtos51应用的部分都已经给出
// 3。本文所述的产品,我已经写了相关的文章,对于任务的规划进行了简单的说明,
// 文章已经被《单片机与嵌入式系统应用》录用, 不过估计要等几个月才能刊出,可以向本人索取,
// 4。在整个程序的编写过程中,得到了陈明计先生的热心指导,在此表示衷心的感谢
// 5。文件是用keil7.07版本编译的,如果需要工程文件,请和我联系
// 6。本人对于51的理解不够深刻,而且刚开始接触嵌入式系统,水平有限,希望与大家交流。
// 7。希望各位高手能指点一二:对程序的各个方面 , 希望您给我一点建议,能让我的水平有一个很大的提升
// *************************************************************************************************/
// 我的联系方式:
// 陈杰峰 wishercjf@163.com
// 欢迎各位大侠拍砖
/*********************************************************************************************************
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: main.c
**创 建 人: 陈杰峰 wishercjf@163.com
**最后修改日期: 2004年6月2日
**描 述: 本文件是整个系统的核心,完成系统的大部分功能
*************************************************************************************
** 修改人:
** 日 期:
** 描 述:
**
**------------------------------------------------------------------------------------------------------
***********************************************************************************************************/
#include "config.h"
sbit motor=P1^0; //连接电机
sbit speaker=P1^1; //连接蜂鸣器
sbit red=P1^6; //红色报警灯
sbit yellow=P1^7; //黄色加温灯
sbit powerkey=P1^2; //连接电压报警
sbit SPI_CLK=P1^4; //da输出脉冲
sbit SPI_DATA=P1^3; //da输出数据
sbit CS_DA=P1^5; //da片选
uint8 OS_Q_MEM_SEL NotUse _at_ 0x0000; //指针的NULL为0,这个变量占用0地质避免出现有效的NULL指针
uint8 OS_Q_MEM_SEL CommandData[16]; //给命令消息队列分配的队列空间
uint8 OS_Q_MEM_SEL Drip[5]; //存储反馈的滴数
uint8 OS_Q_MEM_SEL serial[5]; //液晶要显示的东西
uint8 shengyin;
uint8 moshi,wendu;
uint16 sheding,yijing,sudu;
uint8 run;
uint16 runtime,stoptime;
uint8 dripnub;
uint8 testpage,test;
uint8 yeup,keytime;
uint8 power,powertime;
uint8 setbaojing;
//转速表,修改具体数据,实际转速对应已经去掉
uint16 code rate[4][301]={
0
};
//停止时间表
uint16 code stoptimebiao[4][301]={
0
};
/*********************************************************************************************************
** 函数名称: intdata()
** 功能描述: 初始化函数,设置了全局变量的初值
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块:
**
** 作 者: 陈杰峰 wishercjf@163.com
** 日 期: 2004年5月4日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void intdata()
{
moshi=1;
wendu=45;
run=0;
dripnub=0;
testpage=0;
test=2;
sheding=1000;
yijing=0;
sudu=150;
yeup=0;
keytime=0;
serial[0]=0;
serial[1]=0;
serial[2]=0;
serial[3]=0;
serial[4]=0;
}
/*********************************************************************************************************
** 函数名称: init
** 功能描述: 初始化函数,一般在多任务环境启动前调用
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块:
**
** 作 者: 陈杰峰 wishercjf@163.com
** 日 期: 2004年5月4日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void init(void)
{
//"系统初始化"
//IE = 0x00; //"清除中断"
//ES = 1; //4"串行中断允许"
EX0 = 1; //0"外部中断0允许"
ET0 = 1; //1"定时器0中断允许"
EX1 = 1; //2"外部中断1允许"
// ET1 = 1; //3"定时器1中断允许"
//ET2 = 1;
//IP = 0; //"清除中断优先级"
//PS = 1; //"串行中断优先"
//PX0 = 1; //"外部中断0"
PT0 = 1; //"定时器中断0"
//PX1 = 1; //"外部中断1"
//PT1 = 0; //"定时器中断1"
//TCON "定时器控制寄存器"
// TCON = 0;
//TF1 "T1溢出标志"
//TR1 = 1; //"T1运行控制"
//TF0 "T0溢出标志"
//TR0 = 1; //"T0运行控制"
//IE1 "外部中断1申请标志"
IT1 = 1; //"外部中断1触发方式 0=电平 1=边沿"
//IE0 "外部中断0申请标志"
IT0 = 1; //"外部中断0触发方式 0=电平 1=边沿"
//TMOD "定时器模式控制寄存器"
// |GATE |C//T |M0 |M1 |GATE |C//T |M0 |M1 |
//"高4位用于T1 低4位用于T0"
//SCON "串行控制"
//| SM0 | SM1 | SM2 | REN | TB8 | RB8 | TI | RI |
//"| SM0 SM1 | 工作方式 | 说 明 | 波 特 率 |"
//"| 0 0 | 方 式 0 |? 同步移位 | fosc/12 |"
//"| 0 1 | 方 式 1 | 10位异步收发 | 定时器控制 |"
//"| 1 0 | 方 式 2 | 11位异步收发 |fosc/32|fosc/64|"
//"| 1 1 | 方 式 3 | 11位异步收发 | 定时器控制 |"
//"SM2 多机通讯允许"
//"REN 接收允许控制"
//"TB8 发送数据第9位"
//"RB8 接收数据第9位"
//"TI 发送中断标志"
//"RI 接受中断标志"
//PCON "电源控制寄存器"
//SMOD"波特率选择位 =1 方式1,2,3 波特率加倍"
//"波特率=2^(sod)*fosc/(32*12*(256-初值))"
//使用定时器0设置蜂鸣器频率,频率为3000Hz
//系统节拍中断使用定时器2,中断频率为600Hz
}
/*********************************************************************************************************
** 函数名称: Delay(unsigned int time)
** 功能描述: 延时函数,在操作系统中,其实不需要这个函数,
** 但是我用的液晶速度比较慢,要等待一段时间
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块:
**
** 作 者: 陈杰峰 wishercjf@163.com
** 日 期: 2004年5月4日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
Delay(unsigned int time)
{unsigned int ii,jj;
for (jj=0;jj<time;jj++);
{
for (ii=0;ii<100;ii++);
}
}
/*********************************************************************************************************
** 函数名称: main
** 功能描述: 主函数,用户程序从这里执行
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: init(),OSStart()、Delay()、intdata();
**
** 作 者: 陈杰峰 wishercjf@163.com
** 日 期: 2004年5月4日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void main(void)
{
unsigned int i;
for(i=0;i<500;i++)
{
Delay(100); //延时0.2秒
}
intdata();
init();
OSStart();
}
/*********************************************************************************************************
** 函数名称: command
** 功能描述: 命令处理任务,高层命令由这个任务执行,相当于应用程序
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: OSSemCreate(),OSQPend()
** OSQIntPost(),
** 作 者: 陈杰峰 wishercjf@163.com
** 日 期: 2004年5月15日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void Command(void)
{
uint8 KeyTemp[4];
while(1)
{
OSQPend(KeyTemp,KeyReadBuf,0);
OSQPend(KeyTemp + 1,KeyReadBuf,0);
switch(KeyTemp[0])
{
case KEY_DOWN:
switch(test)
{
case 2://第二个实验页面
switch(KeyTemp[1])
{
case KEYMOSHI:
moshi++;
if(moshi>4)
{
moshi=1;
}
serial[0]=CMOSHI;
OSQIntPost(CommandData, serial[0]);
break;
case KEYQUEDING:
serial[0]=CYEMIAN;
serial[1]=5;
OSQIntPost(CommandData, serial[0]);
serial[0]=CYEMIAN;
serial[1]=6;
OSQIntPost(CommandData, serial[0]);
serial[0]=CSHEDING;
serial[1]=sheding/256;
serial[2]=sheding%256;
serial[3]=1;
OSQIntPost(CommandData, serial[0]);
serial[0]=CSUDU;
serial[1]=sudu/256;
serial[2]=sudu%256;
serial[3]=0;
OSQIntPost(CommandData, serial[0]);
test=3;
break;
default:
break;
}
break;
case 3://第三个实验页面
switch(KeyTemp[1])
{
case KEYJIA:
if(yeup==0)
{
sheding++;
serial[0]=CSHEDING;
serial[1]=sheding/256;
serial[2]=sheding%256;
serial[3]=1;
OSQIntPost(CommandData, serial[0]);
}
else
{
sudu++;
serial[0]=CSUDU;
serial[1]=sudu/256;
serial[2]=sudu%256;
serial[3]=1;
OSQIntPost(CommandData, serial[0]);
}
break;
case KEYJIAN:
if(yeup==0)
{
sheding--;
serial[0]=CSHEDING;
serial[1]=sheding/256;
serial[2]=sheding%256;
serial[3]=1;
OSQIntPost(CommandData, serial[0]);
}
else
{
sudu--;
serial[0]=CSHEDING;
serial[0]=CSUDU;
serial[1]=sudu/256;
serial[2]=sudu%256;
serial[3]=1;
OSQIntPost(CommandData, serial[0]);
}
break;
case KEYQUEDING:
if(yeup==0)
{
serial[0]=CSHEDING;
serial[1]=sheding/256;
serial[2]=sheding%256;
serial[3]=0;
OSQIntPost(CommandData, serial[0]);
serial[0]=CSUDU;
serial[1]=sudu/256;
serial[2]=sudu%256;
serial[3]=1;
OSQIntPost(CommandData, serial[0]);
yeup=1;
}
else
{
serial[0]=CYEMIAN;
serial[1]=7;
OSQIntPost(CommandData, serial[0]);
serial[0]=CYEMIAN;
serial[1]=8;
OSQIntPost(CommandData, serial[0]);
runtime=rate[moshi-1][sudu];
stoptime=stoptimebiao[moshi-1][sudu];
yeup=0;
test=4;
}
break;
default:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -