-
.
PIC
单片机编程样例
MCU:PIC16F1938;
开发语言:
C
语言
开发工具:
编译环境:
MPLAB
IED
;
C
编译器:
HI-TECH
PICC C compiler
编辑软件:
source insight
烧录工具:
MPLAB ICD2
仿真软件:
Protues
说明:
程序已经通过编译并在仿真软件和硬件平台上成功跑起来;
目的:对用到
PIC16F
系列单片机
开发软件的群众提供样例支持,希望有帮助。
Protues
仿真图:
1
、一些定义
typedef void VOID;
typedef bit BIT;
.
.
.
.
typedef
unsigned char UINT8;
typedef int
INT16;
typedef unsigned int UINT16;
typedef long INT32;
typedef unsigned long UINT32;
VOID delay(
VOID )
{
int i =
100;
while( i--
);
}
2
、
EEPROM
读写
/******
**************************************************
**********************
功
能:从
EEPROM
中读取一个字节的数据
原
型:
UINT8
EEPROM_read( UINT8 addr )
参数说明:
输入参数:
addr
输入地址
输出参数:无
返
回:读取的字节
注
意
:
*************
**************************************************
***************/
UINT8 EEPROM_read(
UINT8 addr )
{
UINT8 EE_data;
EEADRL = addr;
EEPGD = 0;
CFGS = 0;
GIE = 0;
//
禁止所有中断
RD = 1;
asm(
EE_data =
EEDATL;
RD = 0;
GIE = 1;
//
恢复所有中断
return EE_data;
}
/*************
**************************************************
***************
.
.
.
.
功
能:向
EEPROM
中写入一个字节的
数据
原
型:
VOID EEPROM_write( UINT8
addr, UINT8 ee_data )
参数说明:
输入参数:
addr
输入地址,
ee_data
需要写入的数据
输出参数:无
返
回:无
注
意
:
**************************************************
****************************/
VOID
EEPROM_write( UINT8 addr, UINT8 ee_data )
{
EEADRL = addr;
EEDATL = ee_data;
EEPGD = 0;
CFGS = 0;
GIE = 0;
//
禁止所有中断
WREN = 1; //
运行执行编程
/
擦除操作
EECON2 = 0x55;
//
必须按这样的时序
EECON2 = 0xAA;
WR = 1;
while(
WR==1 ); //
等待写操作完成
GIE = 1;
WREN = 0; //
禁止执行编程
/
擦除操作
}
p>
3
、
ADC
模块<
/p>
/**
ADC
模块的初始化
*/
static VOID ADC_init( VOID )
{
ADCON0 =
0b00110001; //
选择
AN12
通道、
ADC
使能位
ADCON1 = 0b11100000; //A
D
转换结果右对齐,
64
分频作为转换
时钟,选择
VSS
,
VDD
作为参考电压
ADIF = 0; //
清楚
AD
转换标志
}
static UINT16 throttle = 0;
static VOID AD_Function(
VOID )
{
.
.
.
.
UINT8 i;
UINT16 AD_result;
UINT16 AD_max = 0;
UINT16 AD_min = 2000;
throttle = 0;
初始化
for( i=0; i
{
ADIF = 0;
ADRESH = 0;
ADRESL = 0;
delay();
ADCON0 |= 0x02;
while( 0 == ADIF );
//
等待转换完成
ADIF = 0;
AD_result = ADRESH;
AD_result = AD_result << 8;
AD_result =
AD_result | ADRESL;
throttle +=
AD_result;
AD_max = AD_max > AD_result ? AD_max :
AD_result;
AD_min = AD_min < AD_result ? AD_min :
AD_result;
}
throttle = (throttle - AD_max - AD_min)
/ (AD_NUM - 2);
//
去掉最大值和最小
值,均值滤波
}
4
、定时器
0
/**
定时器
0
*/
static VOID
Timer0_init(VOID)
{
OPTION_REG = 0b10000100; //
禁止所有弱上拉、部指令周期时钟
32
分频
TMR0 = TIMER0_1MS;
//
定时器
0
的中断间隔为
1ms
TMR0IE = 1; //
定时器
0
开中断
.
.
.
-
-
-
-
-
-
-
-
-
上一篇:第六七八章习题答案
下一篇:ISO3166标准国际代码