PIC单片机入门_C语言编程技术

本文介绍了PIC单片机使用C语言编程的基础,包括在MpLab中配置编译环境,讲解了PICC的基本变量类型、高级变量、数据寄存器bank管理、volatile关键字的使用以及C和汇编混合编程的应用。
摘要由CSDN通过智能技术生成

1.为什么也是C语言?

用C 语言来开发单片机系统软件最大的好处是编写代码效率高、软件调试直观、维护升级方便、代码的重复利用率高等,因此C 语言编程在单片机系统设计中越来越广泛的运用。PIC 单片机的软件开发,同样可以用C 语言实现。
Microchip 公司没有自行开发PIC单片机的C 语言编译器,但其他公司有开发众多支持PIC 单片机的C 语言编译器,常见的有Hitech、CCS、IAR、Bytecraft 等公司。其中最常用的是Hitech 公司的PICC 编译器,它稳定可靠,编译生成的代码效率高,在用PIC 单片机开发者中得到广泛认可。
Hitech-PICC 编译器基本上符合ANSI C标准,但是不支持函数的递归调用。其主要原因是因为PIC 单片机特殊的堆栈结构。PIC 单片机的堆栈是硬件实现的,其深度已随芯片固定,无法实现需要大量堆栈操作的递归算法。  成的代码效率高,在用PIC 单片机开发者中得到广泛认可。

2.MpLab中配置PIC C编译环境,并进行项目开发

为便于PICC编译器的编译环境设置,应先在MPLAB IDE集成开发环境下创建一个PICC  C编译器的项目。
1.启动MPLAB IDE7.00集成开发环境窗口。选择集成开发环境中的Project->New菜单项,打开如下所示的新项目对话框,在此对话框中设置项目名和项目路径。
以下是使用 MPLAB X IDE 和 PIC16F877A 单片机设计的数字电压表代码。 ```c #include <xc.h> #include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <stdbool.h> #include <math.h> // 配置寄存器 #pragma config FOSC = HS // 声明时钟源为高速晶振 #pragma config WDTE = OFF // 关闭看门狗定时器 #pragma config PWRTE = OFF // 关闭上电复位延时 #pragma config BOREN = OFF // 关闭低电压复位 #pragma config LVP = OFF // 关闭低电压编程模式 // 定义宏 #define _XTAL_FREQ 20000000 // 定义主频为20MHz #define ADC_CHANNEL 0 // 定义ADC通道为0 // 函数声明 void init_adc(void); // 初始化ADC int read_adc(void); // 读取ADC值 void init_uart(void); // 初始化串口 void send_uart(char data); // 发送数据 void send_string_uart(char *str); // 发送字符串 void send_int_uart(int num); // 发送整数 // 主函数 void main(void) { // 初始化 TRISB = 0x00; // 设置B口为输出 PORTB = 0x00; // B口全部清零 init_adc(); // 初始化ADC init_uart(); // 初始化串口 while (1) { int adc_value = read_adc(); // 读取ADC值 float voltage = (adc_value * 5.0 / 1023.0); // 计算电压值 int voltage_int = (int) voltage; // 取整数部分 float voltage_decimal = (voltage - voltage_int) * 1000; // 取小数部分并转化为mV int voltage_decimal_int = (int) voltage_decimal; // 取整数部分 // 发送电压值 send_string_uart("Voltage: "); send_int_uart(voltage_int); send_uart('.'); if (voltage_decimal_int < 10) { send_uart('0'); // 如果小数部分小于10,前面补0 } send_int_uart(voltage_decimal_int); send_string_uart("V\r\n"); __delay_ms(500); // 延时500ms } } // 初始化ADC void init_adc(void) { ADCON0 = 0b00000001; // 设置ADC通道和工作模式 ADCON1 = 0b10000000; // 设置参考电压和AD转换时钟 } // 读取ADC值 int read_adc(void) { ADCON0bits.GO = 1; // 开始ADC转换 while (ADCON0bits.GO); // 等待转换完成 return ((ADRESH << 8) + ADRESL); // 返回ADC值 } // 初始化串口 void init_uart(void) { TRISCbits.TRISC6 = 0; // 设置TX为输出 TRISCbits.TRISC7 = 1; // 设置RX为输入 TXSTAbits.SYNC = 0; // 设置异步模式 TXSTAbits.BRGH = 1; // 设置高波特率 BAUDCTLbits.BRG16 = 1; // 启用16位波特率发生器 SPBRG = 129; // 设置波特率为9600,主频20MHz TXSTAbits.TXEN = 1; // 启用发送器 RCSTAbits.CREN = 1; // 启用接收器 } // 发送数据 void send_uart(char data) { while (!TXSTAbits.TRMT); // 等待发送缓冲区为空 TXREG = data; // 将数据发送到发送缓冲区 } // 发送字符串 void send_string_uart(char *str) { while (*str) { send_uart(*str); // 发送一个字符 str++; // 指针指向下一个字符 } } // 发送整数 void send_int_uart(int num) { char buffer[16]; // 定义一个缓冲区 sprintf(buffer, "%d", num); // 将整数转化为字符串 send_string_uart(buffer); // 发送字符串 } ``` 该代码通过 ADC 读取电压值,并将其转化为数字发送到串口,实现了一个简单的数字电压表。注意,在使用该代码时需要将单片机连接至电路板并连接相关电路。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值