PIC单片机C语言程序设计(14)
的数字和简单的字符。字符式LCD 不仅可显示数字而且可显示多种字符(字符库)。点阵式LCD 不仅可以显示字符、数字,还可显示多种图形、曲线及汉字,实现屏幕的动画。图61 中的LCD 是字符型的,常用的型号是1602, 即16 字x2 行的。读者在电子市场购买1602 模块时,定向商家索取该模块的详细使用说明书。
图61
柔性薄膜压力传感器是一种超薄性( 仅0.1mm 厚)压力传感器,常用于医学上,该传感器受压时,其输出的模拟信号很小,所以都应加运算放大器进行放大处理后,才能送到单片机的A/D 转换输入端,如图61 中的RA0/AN1 或RA1/AN2 端。
图61 的Pic16F873A 的硬件电路, 是一种常规的A/D 转换和LCD 显示电路, 其中Pic16F873A 的①脚外接常规的Pic 单片机复位电路;⑼、⑽脚外接晶振XT 和C1、C2 的单片机时钟电路;Pic16F873A 的B 口,其位RB4、RB3 和RB2 分别与1602LCD 的E、EW 和RS的控制端相连,以便Pic 单片机控制1602LCD的基本操作。
Pic16F873A 的C 口, 其位RC0~RC7 与1602LCD 的数据引脚D0~D7 分别相连,以便Pic 单片机控制1602LCD 的指令和数据的读写操作。LCD(1602)的③脚VL 为LCD 对比度调整端,接正电源时,对比度最低,接地时对比度最高,使用时通过外接10KΩ 电位器,调整所需的对比度。
该电路是笔者为某医院烧伤科设计的治疗仪部分主要电路, 在这里取其A/D 转换的C程序部分, 以说明Pic 单片机的专用寄存器:
ADCON1、ADRESH、ADRESL、ADCON0、PIR1 和PIE1 等,在A/D 转换时的使用方法和操作步骤。这里没有给出治疗仪的全部C 程序。
以下是Pic16F873A 的A/D 转换的操作步骤和相关的程序。
A/D 转换的初始化,如图62 所示。
图62
对于A/D 转换程序的初始化一般要经过图62 的几个步骤。
A/D 转换初始化函数代码如下:
void adcsh()
{
TRISA=0X07;// 设定I/O 口为输入
ADCON1=0X8a;
//RA0~RA5 设为模拟口,RA3 接参考电压。
ADCON0=0X81;
// 通道0,选择系统时钟focs/32.
ADRESH=0;
ADRESL=0; // 清空转换结果寄存器
GIE=1; // 打开总中断
PEIE=1; // 打开第一外围中断屏蔽
ADIE=1; // 打开A/D 中断
ADIF=0; // 清除A/D 中断标志位。
}
以上流程图和代码是采用中断服务程序来读取A/D 转换数值的,虽然通过查询标志位方式也可以达到同样的效果,但是在实际应用中,中断服务方式因方便、可靠、节省芯片运行时间而成为常用的编程结构。对于中断服务程序,越简单越好,因PIC 单片机特殊的堆栈结构,不宜在中断服务程序内作数据运算和太多调用函数的操作,原则是取出值后立即退出中断,以保证其它的任务能及时被响应。图63 是中断服务流程图。
图63
AD 中断C 语言的基本写法:
void interrupt AD(void)
// 必须用interrupt 关键词,编译器才会判定是中断服务程序
{
unsigned int ad_1=0;
if(ADIF==1)
// 判断A/D 转换中断标志位是否为1 ;
{
ADIF=0;// 清零中断标志位
ad_1=(ADRESH0X03)*256+ ADRESL;
// 读取A/D 转换结果,并将低字 节和高字节进行整合。
}
}
从以上的代码看出,C 语言比汇编要简单得多,进入中断后,标志位清零是必须的,返回指令可以不写,这是最基本的中断服务程序。
以下提供在实际应用中的代码:
AD 初始化函数:
void adcsh()
{
OPTION=OPTION|0x80;// 关闭弱上拉
TRISC=0X00;
TRISB=0X03;
PORTC=0X00;
ADCON1=0X8a;
// 转换结果右对齐,RA0~RA5 设为模拟口,
RA3 可接参考电压。
TRISA=0X07;
ADCON0=0X81;// 打开通道0 作数据采样
PORTA=0XFF;
ADRESH=0;
ADRESL=0;// 转换结果寄存器清零
INTCON=0x00;// 关闭所有中断
GIE=1;// 打开总中断
PEIE=1;// 打开第一外围中断
ADIE=1;// 打开AD 中断
ADIF=0;// 清除AD 中断标志位
}
以下是中断服务函数:
void interrupt AD(void)
{
unsigned int ad_1=0;
// 定义一个ad 转换结果寄存器
if(k16)
{
ADIF=0; // 清楚AD 标志位
ad_1=(ADRESH0X03)*256+ ADRESL;
// 读取AD 转换结果
ad_sum=ad_sum+ad_1;
k++;
if(k16)
ADGO=1; // 启动AD
}
if(k==16)
{
ad_1=ad_sum/16;
if( b>16)
{
if(ad_1>ad_temp)
ad_1=ad_1-ad_temp;
else if(ad_1ad_temp)
ad_1=ad_temp-ad_1;
else if(ad_1==ad_temp)
ad_1=0;
AD_
value=(float)(ad_1);
}
d=1;
ad_sum=0;
k=0;
if(b32)
{
b++;
ADGO=1;
}
if(b==15)
ad_temp=ad_1;
}
}
上述A/D 转换的C 程序,初学时有些难度,但结合A/D 转换相关的专用寄存器功能,也不难理解的,待下次连载15,笔者对A/D 转换方法,还有一些说明的,读者可以关注。
- 基于PIC单片机的智能型漏电断路器设计(11-25)
- 基于PIC单片机的无线实时监控防盗系统的设计与实现(11-18)
- PIC单片机键盘矩阵扫描C语言程序(12-02)
- PIC单片机控制第一个发光管闪动程序(12-02)
- PIC单片机驱动LCD12864液晶显示闪动字体程序(12-02)
- PIC单片机控制8位流水灯C语言程序(12-02)