/*********************************************************************************************************
** Small RTOS(51)
** The Real-Time Kernel(For Keil c51)
**
** (c) Copyright 2002-2003, chenmingji
** All Rights Reserved
**
** V1.20.0
**
**
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: ext1.c
**创 建 人: 陈明计
**最后修改日期: 2003年8月3日
**描 述: ext1源代码。
**
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 陈明计
** 版 本: V0.50
** 日 期: 2002年2月22日
** 描 述: 原始版本
**
**------------------------------------------------------------------------------------------------------
** 修改人: 陈明计
** 版 本: V1.11.0
** 日 期: 2003年12月2日
** 描 述: 删除TaskD代码
**
**------------------------------------------------------------------------------------------------------
** 修改人: 陈明计
** 版 本: V1.12.0
** 日 期: 2003年12月2日
** 描 述: 无变化
**
**------------------------------------------------------------------------------------------------------
** 修改人: 陈明计
** 版 本: V1.20.0
** 日 期: 2003年8月3日
** 描 述: 根据新版本要求修改
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人: Crossmind http://www.ednchina.com/Blog/crossmind/
** 日 期: 2008-3-22
** 描 述: Protues 7.2 + EDNCHINA 51仿真板
** 功能描述:
EX3: 数据采集、处理及显示练习 【练习重点:信号量使用】
创建2个任务:
任务B - 数据采集,读ADC0832
任务A - 采集数据处理并显示在LCD上
其他EX:
EX1: 创建3个任务,分别闪烁三颗 LED 【练习重点:创建任务】
EX2: 创建3个任务,分别向LCD随机位置写入字符"A","B","C" 【练习重点:LCD驱动程序】
** EX系列将不断增加
更多关于SmallRTOS的内容请到我的博客:http://www.ednchina.com/Blog/crossmind/
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#include "config.h"
#define ADCSem 0
void TaskA(void);
void TaskB(void);
unsigned char SamplingData=0; //两个任务用来传递采样值
/********************************************************
** ADC0832 硬件接口及预定义
********************************************************/
sbit ADCS =P2^0;
sbit ADDI =P3^7;
sbit ADDO =P3^7;
sbit ADCLK =P3^6;
#define VREF 5.0 //基准电压
/******************************************************
** LCD LM016L 硬件接口及预定义
P0 LCD BUS
P10 RS
P11 RW
P12 E
******************************************************/
sbit LcdEn = P1^2;
sbit LcdRw = P1^1;
sbit LcdRs = P1^0;
#define DBPort P0
#define LCD_COMMAND 0 // Command
#define LCD_DATA 1 // Data
#define LCD_CLEAR_SCREEN 0x01 // 清屏
#define LCD_HOMING 0x02 // 光标返回原点
//设置显示模式
#define LCD_SHOW 0x04 //显示开
#define LCD_HIDE 0x00 //显示关
#define LCD_CURSOR 0x02 //显示光标
#define LCD_NO_CURSOR 0x00 //无光标
#define LCD_FLASH 0x01 //光标闪动
#define LCD_NO_FLASH 0x00 //光标不闪动
//设置输入模式
#define LCD_AC_UP 0x02
#define LCD_AC_DOWN 0x00 // default
#define LCD_MOVE 0x01 // 画面可平移
#define LCD_NO_MOVE 0x00 //default
//内部等待函数
unsigned char LCD_Wait(void)
{
LcdRs=0;
LcdRw=1; _nop_();
LcdEn=1; _nop_();
LcdEn=0;
return DBPort;
}
//向LCD写入命令或数据
void LCD_Write(bit style, unsigned char input)
{
LcdEn=0;
LcdRs=style;
LcdRw=0; _nop_();
DBPort=input; _nop_();//注意顺序
LcdEn=1; _nop_();//注意顺序
LcdEn=0; _nop_();
LCD_Wait();
}
void LCD_SetDisplay(unsigned char DisplayMode)
{
LCD_Write(LCD_COMMAND, 0x08|DisplayMode);
}
void LCD_SetInput(unsigned char InputMode)
{
LCD_Write(LCD_COMMAND, 0x04|InputMode);
}
//初始化LCD
void LCD_Initial()
{
LcdEn=0;
LCD_Write(LCD_COMMAND,0x38); //8位数据端口,2行显示,5*7点阵
LCD_Write(LCD_COMMAND,0x38);
LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //开启显示, 无光标
LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC递增, 画面不动
}
//液晶字符输入的位置************************
void GotoXY(unsigned char x, unsigned char y)
{
if(y==0)
LCD_Write(LCD_COMMAND,0x80|x);
if(y==1)
LCD_Write(LCD_COMMAND,0x80|(x-0x40));
}
//将字符输出到液晶显示
void PrintXY(unsigned char x, unsigned char y,unsigned char *str)
{
GotoXY(x,y);
while(*str!='\0')
{
LCD_Write(LCD_DATA,*str);
str++;
}
}
/*************************************************
// ADC0832接口程序
// 完全是Copy来的
**************************************************/
unsigned int Adc0832(unsigned char channel) //AD转换,返回结果
{
unsigned char i,j,ndat;
unsigned int dat=0;
if(channel==0)channel=2;
else
if(channel==1)channel=3;
ADDI=1;
_nop_();
_nop_();
ADCS=0;//拉低CS端
_nop_();
_nop_();
ADCLK=1;//拉高CLK端
_nop_();
_nop_();
ADCLK=0;//拉低CLK端,形成下降沿1
_nop_();
_nop_();
ADCLK=1;//拉高CLK端
ADDI=channel&0x1;
_nop_();
_nop_();
ADCLK=0;//拉低CLK端,形成下降沿2
_nop_();
_nop_();
ADCLK=1;//拉高CLK端
ADDI=(channel>>1)&0x1;
_nop_();
_nop_();
ADCLK=0;//拉低CLK端,形成下降沿3
ADDI=1;//控制命令结束
_nop_();
_nop_();
dat=0;
for(i=0;i<8;i++)
{
dat|=ADDO;//收数据
ADCLK=1;
_nop_();
_nop_();
ADCLK=0;//形成一次时钟脉冲
_nop_();
_nop_();
dat<<=1;
if(i==7)dat|=ADDO;
}
for(i=0;i<8;i++)
{
j=0;
j=j|ADDO;//收数据
ADCLK=1;
_nop_();
_nop_();
ADCLK=0;//形成一次时钟脉冲
_nop_();
_nop_();
j=j<<7;
ndat=ndat|j;
if(i<7)ndat>>=1;
}
ADCS=1;//拉低CS端
ADCLK=0;//拉低CLK端
ADDO=1;//拉高数据端,回到初始状态
dat<<=8;
dat|=ndat;
return(dat); //return ad k
}
void main(void)
{
OSInit();
//系统节拍中断使用定时器2,中断频率为600Hz,晶振12MHz
TMOD = (TMOD & 0XF0) | 0X01;
TH0 = (65536 - (12000000 / 12) / 100) / 256;
TL0 = (65536 - (12000000 / 12) / 100) % 256;
TR0 = 1;
ET0 = 1;
//创建3个任务,分别闪烁三个LED
LCD_Initial();
OSTaskCreate(TaskA, NULL, 0);
OSTaskCreate(TaskB, NULL, 1);
while(1)
{
PCON = PCON | 0x01; /* CPU进入休眠状态 */
}
}
//TASKB,读取ADC0832数据,置信号量
void TaskB(void)
{
while (1)
{
SamplingData = Adc0832(0); //读ADC0832 0通道
OSSemPost(ADCSem); //置信号量,通知任务A采样完成
OSWait(K_TMO,OS_TICKS_PER_SEC/100); //延时10mS
}
}
//任务A: 计算平均值,然后在LCD上显示出来
void TaskA(void)
{
char displaystr[10];
unsigned char i;
float AverageVolt=0, Voltage;
PrintXY(0,0,"Voltage:");
PrintXY(0,1,"Average:");
OSSemCreate(ADCSem,0); //建立信号量,并初始化为0
while (1)
{
AverageVolt = 0;
for(i=0;i<10;i++)
{
OSSemPend(ADCSem,0); /*无限等待信号量ADCSem,也就是等待ADC数据采样完毕 */
//得到信号量
Voltage = SamplingData * VREF/255; //计算电压值
AverageVolt += Voltage; //累加以计算平均值
sprintf(displaystr,"%4.2fV",Voltage); //LCD显示
PrintXY(12,0,displaystr);
}
AverageVolt = AverageVolt / 10; //计算平均值
sprintf(displaystr,"%4.2fV",AverageVolt); //LCD显示
PrintXY(12,1,displaystr);
}
EX3 - ADC数据采集任务及信号量使用程序
需积分: 10 183 浏览量
2009-12-04
09:26:50
上传
评论
收藏 8KB RAR 举报
yanyulou
- 粉丝: 0
- 资源: 37
最新资源
- C语言基础-C语言编程基础之Leetcode编程题解之第30题串联所有单词的子串.zip
- C语言基础-C语言编程基础之Leetcode编程题解之第29题两数相除.zip
- C语言基础-C语言编程基础之Leetcode编程题解之第28题找出字符串中第一个匹配项的下标.zip
- 实验报告模板(1).docx
- C语言基础-C语言编程基础之Leetcode编程题解之第26题删除有序数组中的重复项.zip
- C语言基础-C语言编程基础之Leetcode编程题解之第25题K个一组翻转链表.zip
- hnu计算机系统作业-计算机系统基础课程大作业.zip
- 树莓派app.apk
- C++的基于同态加密技术的匿名电子投票系统源码.zip
- SW建模格式图.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈