具体实现功能
具体功能:
通过滑动变阻器和ADC0832模块对电压值进行采样,反馈电压值通过数码管进行显示,电压范围为0-5V,如图所示表示电压为3.92V。
设计介绍
单片机介绍
51单片是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C51为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。具有以下标准功能:8k字节Flash,512字节RAM,32 位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,三个16 位 定时器/计数器,一个6向量2级中断结构,全双工串行口。另外 STC89X51 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。最高运作频率35Mhz,6T/12T可选。
设计思路
文献研究法:搜集整理相关单片机智能手环系统相关研究资料,认真阅读文献,为研究做准备;
调查研究法:通过调查、分析、具体试用等方法,发现单片机智能手环系统的现状、存在问题和解决办法;
比较分析法:比较不同单片机智能手环系统的具体原理,以及同一类传感器性能的区别,分析单片机智能手环系统的研究现状与发展前景;
软硬件设计法:通过软硬件设计实现具体硬件实物,最后测试各项功能是否满足要求。
设计内容
仿真图
本设计利用protues8.7软件实现仿真设计,具体如图。
Protues也是在单片机仿真设计中常用的设计软件之一,通过设计出硬件电路图,及写入驱动程序,就能在不实现硬件的情况进行电路调试。另外,protues还能实现PCB的设计,在仿真中也可以与KEIL实现联调,便于程序的调试,且支持多种平台,使用简单便捷。
程序
本设计利用KEIL5软件实现程序设计,具体如图。作为本科期间学习的第一门编程语言,C语言是我们最熟悉的编程语言之一。当然,由于其功能强大,C语言是当前世界上使用最广泛、最受欢迎的编程语言。在单片机设计中,C语言已经逐步完全取代汇编语言,因为相比于汇编语言,C语言编译与运行、调试十分方便,且可移植性高,可读性好,便于烧录与写入硬件系统,因此C语言被广泛应用在单片机设计中。keil软件由于其兼容单片机的设计,能够实现快速调试,并生成烧录文件,被广泛应用于C语言的编写和单片机的设计。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define _rrca_() CY = ACC & 0x01 //产生RRC A指令
#define _rlca_() CY = ACC & 0x80 //产生RLC A指令
sbit bADcs=P1^4;
sbit bADcl=P1^5;
sbit bADda=P1^6;
sbit flag=P1^7;
sbit str=P2^7;
sbit d=P2^6;
sbit clk=P2^5;
bit choose=0;
unsigned char data1;
unsigned char count;
unsigned char cycle;
uint ge,xiao1,xiao2;
unsigned long data2;
//无小数点
const uchar table1[17]={0x81,0xed,0x43,0x49,0x2d,0x19,0x11,0xcd,0x01,0x09,0x71,0x31,0x93,0x61,0x13,0x17,0xff};
//有小数点
const uchar table2[17]={0x80,0xec,0x42,0x48,0x2c,0x18,0x10,0xcc,0x00,0x08,0x70,0x30,0x92,0x60,0x12,0x16,0xff};
uchar buffer[4]={0x00,0x00,0x00,0x00};
void Delayus(uchar i)
{
while(--i);
}
void display(void)
{
uchar bit_count=0;
uchar table_counter=0;
uchar byte_counter=0;
uchar temp_i=0;
buffer[0]=xiao2;
buffer[1]=xiao1;
buffer[2]=ge;
buffer[3]=0x00;
//led_str_off;//先清零
str=0;
//led_clk_off;
clk=0;
for(byte_counter=0;byte_counter<4;byte_counter++)
{
bit_count=8;
if(byte_counter==2)temp_i=table2[buffer[byte_counter]];
else
temp_i=table1[buffer[byte_counter]];
// nop;
while(bit_count>0)
{
if((temp_i&0x80)==0)
{
//led_d_off;
d=0;
}
else
{
//led_d_on;
d=1;
}
temp_i=(temp_i<<1);
// nop;
//led_clk_on;
clk=1;
// nop;
//led_clk_off;
clk=0;
// nop;
bit_count--;
}
}
//led_str_on;
str=1;
}
/*
void ad()
{
choose=0;
count = 0;
bADcs = 0;//当ADC0832未工作时其CS输入端应为高电平,此时芯片禁用.
bADcl = 0;
bADda = 1;//在第1 个时钟脉冲的下沉之前DI端必须是高电平.
bADcl = 1;
bADcl = 0;//pulse 1 down
bADda = 1;
bADcl = 1; bADcl = 0;//pulse 2 down
if(choose == 0)
bADda = 0;
else
bADda = 1;
bADcl = 1; bADcl = 0;//pulse 3 down
bADcl = 1; bADcl = 0;//pulse 4 down
//bADcl = 1;
for(cycle = 8; cycle > 0; cycle-- )
{
bADda = 1;
//bADcl = 0;//pulse
bADcl = 1;
CY = bADda;
_rlca_(); //RRC A
bADcl = 0;//pulse
}
data1= ACC;
for(cycle = 8; cycle > 0; cycle-- )
{
bADda = 1;
bADcl = 1;
CY = bADda;
_rrca_(); //RLC A
bADcl = 0;//pulse
}
//bADcl = 0;//pulse
} */
void ad(void)
{ uchar i;
//data1=0;
bADcs = 0;//当ADC0832未工作时其CS输入端应为高电平,此时芯片禁用.
bADcl=0;
bADda=1;
bADcl=1;
bADcl=0;//i down
bADda=1;
bADcl=1;
bADcl=0; // 2 down
bADda=0;
bADcl=1;
bADcl=0; // 3 down
bADda=1;
bADcl=1;
bADcl=0; // 4 down
for(i=8;i>0;i--)
{
data1<<=1;
bADcl=0;
bADcl=1;
if(bADda==1) data1|=0x01;
bADda=1;
}
/* for(i=8;i>0;i--)
{
bADcl=0;
bADcl=1;
} */
bADcs=1;
}
void cal()
{
data2=((ulong)data1*493)/256;
ge=data2/100;
xiao1=(data2%100)/10;
xiao2=data2%10;
}
main()
{
flag=1;
while(1){
ad();
cal();
display();
}}