ARM------->第七天,ADC模块、Qt串口控制助手

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));//将所有字节转换成字符串
}

界面文件:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值