1.ADC
模拟量转换为数字量
模拟量:连续的 比如,温度 电压 电阻 高度 湿度。。。
数字量:离散的
在前几天的代码基础下,添加adc.c文件、adc.h文件,修改makefile工程文件和main.c文件
adc.c文件:
#include "adc.h"
#include "uart.h"
void adc_init()
{
//选择通道
ADCMUX = 3;
//设置分辨率为10
ADCCON &= ~(0X1 << 16);
//分频使能
ADCCON |= 0x1 << 14;
//设置分频值
ADCCON = ADCCON & ~(0XFF << 6) | 19 << 6;
//adc工作在普通模式,不是省电模式
ADCCON &= ~(0X1 << 2);
//自己手动启动,不是读的时候启动
ADCCON = ADCCON & ~(0x1 << 1);
}
//ADC模块接收数字量
int adc_read()
{
ADCCON |= 0X1;
while(!(ADCCON & (0X1 << 15)));
int ret = ADCDAT & 0X3FF;
return ret;
}
//ADC模块将数字量转换成模拟量
void send_adc(int data)
{
uart_putc(' ');
int tmp = data / 10;
int a = tmp / 100 + '0'; //数字量的百位取出,加'0'转换成相应的字符
uart_putc(a); //发送相应的字符
int b = tmp / 10 % 10 + '0'; //数字量的十位取出,加'0'转换成相应的字符
uart_putc(b); //发送相应的字符
int c = tmp % 10 + '0'; //数字量的个位取出,加'0'转换成相应的字符
uart_putc(c); //发送相应的字符
uart_putc(' ');
}
adc.h文件:
#ifndef _ADC_H_
#define _ADC_H_
#define ADCCON *((volatile unsigned int *)0x126C0000)
#define ADCMUX *((volatile unsigned int *)0x126C001C)
#define ADCDAT *((volatile unsigned int *)0x126C000C)
void adc_init();
int adc_read();
void send_adc(int data);
#endif
makefile工程文件:
CROSS = arm-none-linux-gnueabi-
CC=$(CROSS)gcc
LD=$(CROSS)ld
OBJCOPY=$(CROSS)objcopy
all:
$(CC) -g -c -o main.o main.c
$(CC) -g -c -o led4.o led4.c
$(CC) -g -c -o start.o start.s
$(CC) -g -c -o uart.o uart.c
$(CC) -g -c -o pwm.o pwm.c
$(CC) -g -c -o adc.o adc.c
$(LD) start.o led4.o main.o uart.o pwm.o adc.o -Tmap.lds -o led4.elf
$(OBJCOPY) -O binary -S led4.elf led4.bin
$(CROSS)objdump -D led4.elf > led4.dis
clean:
rm -f *.o *.elf *.bin *.dis
main.c文件:
#include "led4.h"
#include "uart.h"
#include "adc.h"
#include "pwm.h"
void delay()
{
int i;
for(i = 0; i < 2000000; i++);
}
int main()
{
//初始化adc模块
adc_init();
//初始化Led灯
led5_init();
led4_init();
led3_init();
led2_init();
//初始化uart
uart_init();
//初始化蜂鸣器
pwm_init();
int i=10;//设置流水灯次数
while(1)
{
char c=uart_getc();
if('1'==c)
{
led2_on();
led3_off();
led4_off();
led5_off();
}
else if('2'==c)
{
led3_on();
led2_off();
led4_off();
led5_off();
}
else if('3'==c)
{
led4_on();
led2_off();
led3_off();
led5_off();
}
else if('4'==c)
{
led5_on();
led2_off();
led3_off();
led4_off();
}
else if('5'==c)
{
pwm_no();
}
else if('6'==c)
{
pwm_off();
}
else if('7'==c)
{
while(--i)
{
//实现led2-led5的流水点灯,延时间隔为delay()
led5_off();
led2_on();
delay();
led2_off();
led3_on();
delay();
led3_off();
led4_on();
delay();
led4_off();
led5_on();
delay();
}
}
else if('c' == c)
{
send_adc(adc_read());
}
else
{
led2_off();
led3_off();
led4_off();
led5_off();
pwm_off();
}
}
return 0;
}
2.QT串口
.pro工程文件添加串口模块
.h头文件:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QtSerialPort/QSerialPort>//提供串口功能
#include <QtSerialPort/QSerialPortInfo>//系统串口访问功能
#include <QList>//链表模板类
#include <QPainter>//绘图类
#include <QPaintEvent>//绘图事件
#include <QImage>//图片类
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
void paintEvent(QPaintEvent *);
private slots:
void on_pushButton_clicked();
void on_pushButton_2_clicked();
void on_pushButton_3_clicked();
void on_pushButton_4_clicked();
void on_pushButton_5_clicked();
void on_pushButton_6_clicked();
void on_pushButton_8_clicked();
void on_pushButton_7_clicked();
void on_pushButton_9_clicked();
void on_pushButton_10_clicked();
void recvData();
private:
Ui::MainWindow *ui;
QSerialPort *serialport;//定义串口
QImage age;//定义图片对象
};
#endif // MAINWINDOW_H
mainwindow.cpp源文件:
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
this->resize(800,500);//设置窗口大小
this->setWindowTitle(" 串口控制助手");//设置窗口标题
age=QImage(":/1.png");//图片对象初始化
#if 0
//方法一:通过QSerialPortInfo查找可用串口
foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
{
QSerialPort serial;
serial.setPort(info);
if(serial.open(QIODevice::ReadWrite))//打开串口
{
ui->comboBox->addItem(info.portName());
}
}
#endif
//方法二:获得可用的串口
QList <QSerialPortInfo> list;
list = QSerialPortInfo::availablePorts ( );
int i;
for (i = 0; i < list.size () ; i++)
{
ui->comboBox->insertItem(i, list.at(i).portName());
}
serialport = new QSerialPort;//初始化串口
serialport->setPortName("COM7");//设置串口名
serialport->setBaudRate(115200);//设置波特率
serialport->setDataBits(QSerialPort::Data8);//设置数据位(如8)
serialport->setParity(QSerialPort::NoParity);//设置校验位(如0)
serialport->setStopBits(QSerialPort::OneStop);//设置停止位(如1)
serialport->setFlowControl(QSerialPort::NoFlowControl);//设置流控制(无流控制)
if(serialport->open(QIODevice::ReadWrite))//打开串口
{
ui->label_2->setText("打开成功!");
}
else
{
ui->label_2->setText("打开失败!");
}
//信号和槽的关联
connect(serialport, SIGNAL(readyRead()),this, SLOT(recvData()));
}
#if 1
void MainWindow::paintEvent(QPaintEvent *)
{
QPainter pt(this);//在当前窗口绘画
QImage age1=age.scaled(this->width(),this->height());//让图片自适应窗口大小
pt.drawImage(0,0,age1,0,0,this->width(),this->height());//绘画
update();//更新
}
#endif
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()//点亮led2
{
QByteArray data1 = "1";
serialport->write(data1);
}
void MainWindow::on_pushButton_2_clicked()//点亮led3
{
QByteArray data2 = "2";
serialport->write(data2);
}
void MainWindow::on_pushButton_3_clicked()//点亮led4
{
QByteArray data3 = "3";
serialport->write(data3);
}
void MainWindow::on_pushButton_4_clicked()//点亮led5
{
QByteArray data4 = "4";
serialport->write(data4);
}
void MainWindow::on_pushButton_5_clicked()//开启蜂鸣器
{
QByteArray data5 = "5";
serialport->write(data5);
}
void MainWindow::on_pushButton_6_clicked()//关闭蜂鸣器
{
QByteArray data6 = "6";
serialport->write(data6);
}
void MainWindow::on_pushButton_8_clicked()//流水灯
{
QByteArray data7 = "7";
serialport->write(data7);
}
//关闭灯和蜂鸣器,若进入流水灯模式,只能等流水次数结束(10次)
void MainWindow::on_pushButton_7_clicked()
{
QByteArray data8 = "8";
serialport->write(data8);
}
void MainWindow::on_pushButton_9_clicked()//退出
{
this->close();
}
void MainWindow::on_pushButton_10_clicked()//发送显示电阻值的信号---->'c'
{
QByteArray data9 = "c";
serialport->write(data9);
}
void MainWindow::recvData()//将电阻值显示在文本框
{
QByteArray arr = serialport->readAll();//读取所有字节,存入字节数组中
ui->lineEdit->setText(QString(arr));//将所有字节转换成字符串
}
界面文件: