Proteus C51仿真学习板
Proteus C51仿真学习板0——Keil&Proteus
Proteus C51仿真学习板1——LED点灯
Proteus C51仿真学习板2——数码管
Proteus C51仿真学习板3——定时器
Proteus C51仿真学习板4——外部中断
Proteus C51仿真学习板5——串口中断
Proteus C51仿真学习板6——ADC
Proteus C51仿真学习板7——LCD1602
Proteus C51仿真学习板8——矩阵键盘
Proteus C51仿真学习板9——IIC
Proteus C51仿真学习板10——DAC ?
根据前面学习的10个例程,进行综合demo设计。
功能需求:
??? 1、ADC采集数据,数码管显示对应ADC值以及电压值,定时器5s一次采集;
??? 2、ADC数据保存到EEPROM并通过串口打印;
??? 3、矩阵键盘键值读取,LCD1602显示。
????基本囊括了8个例程。对于初学者而言,既是对前面例程的复习,也是一个总结。软硬件水平均可提高,你值得拥有。
?
/**
******************************************************************************
* @file main.c
* @author Alex——小白
* @version V1.0
* @date 2021.10.1
* @brief ALL综合例程:1、ADC采集数据5s一次, 并存储到EEPROM,数码管显示对应电压,且读出对应数据串口打印;
2、矩阵键盘获取键值,LCD1602显示。
* @store Proteus仿真店子——公众号
* @Link https://shop484534014.taobao.com/
* @Email 844545015@qq.com
******************************************************************************
* @attention All Rights Reserved
**/
?
#include <main.h>
?
void main(void)
{
?
bit DisplayCol = 0;
static uint8_t i = 0;
static uint8_t DisplayRow = 0, GetKeyValue = 0xFF;
static uint8_t SaveAddr = 0, ReadValue = 0;
static uint16_t Voltage = 0, ADCValue = 0;
?
TIMER0.Init(); //TIMER0 初始化
UART.Init(); //UART 初始化
KeyPad.Init(); //KeyPad 初始化
LCD1602.Init(); //LCD1602 初始化
ADC.Init(); //ADC 初始化
I2C.Init(); //I2C 初始化
SEG.Init(); //SEG 初始化
Delay.ms(20);
?
while(1)
{
GetKeyValue = KeyPad.KeyValue(); //获取按键值
if(GetKeyValue != 0xFF) //判断按键值是否有效
{
if(DisplayRow == 16) //计满16列后换行
{
DisplayRow = 0;
DisplayCol = !DisplayCol;
}
UART.SendString("KeyValue:",9); //有效,串口打印数据
UART.SendData(GetKeyValue);
UART.SendString("\r\n",2);
LCD1602.WriteChar(DisplayRow,DisplayCol,GetKeyValue); //LCD显示键值
DisplayRow++; //变量行+1
}
else
{
if(TIMER0.time > 4) //5s采集一次
{
ADCValue = 0; //清零
for(i=0;i<8;i++) //ADC采集8次
{
ADCValue += ADC.GetValue();
}
ADCValue = ADCValue>>3; //取平均
EEPROM.WriteAddrData(SaveAddr,ADCValue); //写入EEPROM
Delay.ms(50);
ReadValue = EEPROM.ReadAddrData(SaveAddr); //读出数据
if(ADCValue == ReadValue) //判断读写是否正确
{
Voltage = ReadValue * 1.95; //电压转换1.95=5*100/256
UART.SendString("ReadValue:",10);
UART.SendData(ReadValue/100 + '0');
UART.SendData(ReadValue%100/10 + '0');
UART.SendData(ReadValue%10 + '0');
UART.SendString(" Voltage: ",10);
UART.SendData(Voltage/100 + '0');
UART.SendData('.');
UART.SendData(Voltage%100/10 + '0');
UART.SendData(Voltage%10 + '0');
UART.SendString("\r\n",2);
}
else UART.SendString("Error Reading!\r\n",16);
TIMER0.time = 0;
SaveAddr++; //地址每次加1
}
}
SEG.Display(0,ReadValue/100); //数码管显示ADC值
SEG.Display(1,ReadValue%100/10);
SEG.Display(2,ReadValue%10);
SEG.Display(5,Voltage/100); //数码管显示电压值
SEG.Display(5,16);
SEG.Display(6,Voltage%100/10);
SEG.Display(7,Voltage%10);
}
}
?
/******************************************************************************
END
******************************************************************************/
?
如需全部例程以及综合demo的Keil源码和Proteus工程,请关注:
Proteus仿真店子
|