XX学院
毕业设计(文)
题 目 基USB数采集系统
院 (系) 电气信息工程学院
专业班级 测控普
学生姓名 学号
指导教师 职称 教授
评阅教师 职称
20XX年 X月 X 日
摘
单片机种科学领域代作巧廉价时作巨代单片机信号发生处理领域非常作实际生产生活中单片机仅仅需产生定求波形需已知信号进行检测处理作量运生产生活中中常种应信号幅度频率检测幅度频率加控制
设计采STC89C52单片机作控芯片设计信号产生信号检测数传输数模模数转换液晶显示等模块集成完整方波测量系统系统通单片机产生方波信号方波信号检测程中运IIC协议PCF8591芯片ADDA功终利LCD12864显示功产生方波信号幅度频率检测方波信号幅度频率两组数进行较分析误差
关键词:STC89C52单片机 方波信号 PCF8591 ADC DAC IIC LCD12864
摘 I
绪 1
1 方波测量设计目意义 2
11设计目 2
12设计意义 2
2 系统方案设计 3
21设计思路 3
22硬件选择 3
211单片机: 3
212 PCF8591: 3
213 LCD12864: 4
3 系统硬件设计 5
31 单片机系统 5
32 键电路设计 5
33 PCF8591转换电路设计 6
34 LCD显示设计 6
4 系统软件设计 7
41 程序设计 7
42 LCD显示子程序设计 8
43 PCF8591数模模数转换子程序设计 8
5 调试性分析 9
51 调试步骤 9
511 硬件调试: 9
512软件调试: 9
513 LCD显示调试: 9
514 波形显示调试: 9
52 性分析 10
53 误差分析 10
6 致谢 11
7 心体会 12
8 参考文献 13
附录 1 系统硬件电路图 14
附录 2 波形采集图 15
附录 3 软件部分 16
绪
着电子产品广泛应单片机应领域相广泛仪器仪表家电机电体化产品研发开发等行业单片机设计员业提升创业目前单片机已渗透生活领域难找没单片机足迹领域导弹导航装置飞机种仪表控制计算机网路通讯数传输工业动化程实时控制盒数处理广泛种智IC卡日常电子产品离开单片机设计中单片机仅仅需产生定求波形需已知信号进行检测处理作量运生产生活中
1 方波测量设计目意义
11设计目
设计采STC89C52单片机产生方波信号产生信号检测基功:利单片机产生方波通键调节方波幅值频率已产生信号进行检测实时幅度频率LCD12864显示
幅值调节范围:05V步进值01V
频率调节范围:1100Hz步进值1Hz
12设计意义
设计目学生更掌握Keil4STC烧录软件硬件部分学生解芯片具体功环境软件部分学生更定时器中断逻辑语言运学生学理知识实践相结合起理中出结真正社会服务提高实际动手力独立思考
2 系统方案设计
21设计思路
采STC89C52单片机数模转换器PCF8591实现波形产生波形产生方法STC89C52单片机执行波形程序PCF8591转换器输入端输入相应数DA转换电路输出端通运放电路转换相应电压波形方案原理简单时适合操作实现起相较容易产生方波波形幅度频率键控制增加者减少够示波器显示出求波形波形幅度频率步进实现调节具线路简单行性高符合设计求等优点加LCD液晶显示够LCD显示出频率值幅度值信息输出波形较稳定精度较高电路简单性价高
键选择
单片机
PCF8591
波形显示
LCD显示
图21系统组成结构框图
22硬件选择
211单片机:
STC89C52高速低功耗超强抗干扰新代单片机指令代码完全兼容传统8051速度快812倍部集成MAX810 专复位电路2路PWM8路高速10位AD转 换(250KS)针电机控制强干扰场合
212 PCF8591:
PCF8591单片集成单独供电低功耗8bit CMOS数获取器件PCF8591具4模拟输入1模拟输出1串行I2C总线接口PCF85913址引脚A0 A1A2硬件址编程允许I2C总线接入8PCF8591器件需额外硬件PCF8591器件输入输出址控制数信号通双线双I2C总线串行方式进行传输
PCF8591引脚信息
AIN0~AIN3:模拟信号输入端A0~A2:引脚址端
VDDVSS:电源端(25~6V)
SDASCL:I2C 总线数线时钟线
OSC:外部时钟输入端部时钟输出端
EXT:部外部时钟选择线部时钟时 EXT 接
AGND:模拟信号
AOUT:DA 转换输出端
VREF:基准电源端
213 LCD12864:
带中文字库128X64 种具4 位8 位行2 线3 线串行种接口方式部含国标级二级简体中文字库点阵图形液晶显示模块显示分辨率128×64 置8192 16*16 点汉字128 16*8 点ASCII 字符 集利该模块灵活接口方式简单方便操作指令构成全中文机交互图形界面显示8×4 行16×16 点 阵汉字 完成图形显示低电压低功耗显著特点该模块构成液晶显示方案类型图形点阵液晶 显示模块相硬件电路结构显示程序简洁该模块价格略低相点阵图形液晶模块
3 系统硬件设计
31 单片机系统
单片机系统需外围时钟电路复位电路单片机系统着两外围电路正常工作面单片机系统原理图
图31 STC89C52单片机系统
32 键电路设计
实现采3键进行波形转换幅值改变频率改变 KEY1KEY2改变增加减少幅值频率KEY3转换调节幅度频率面键电路图
图32 键电路图
33 PCF8591转换电路设计
PCF8591单片单电源低功耗8位CMOS数采集器件具4模拟输入输出串行I2C总线接口DAC转换电路图34知次设计I2C总线模拟量输出中三引脚A0A1A2置低电I2C总线Philips公司推出新型单片机系统采串行总线控器外围器件仅两条线进行信息传输条称时钟线(SCL)条位数线(SDA)图中SCLSTC89C52单片机P37口连接SDASTC89C52单片机P36口连接AOUT示波器相连观察波形
图33 PCF8591电路图
34 LCD显示设计
硬件采LCD12864液晶显示屏显示屏波形转化显示显示屏面液晶显示电路
图34 LCD12864液晶显示电路
4 系统软件设计
41 程序设计
软件设计根功分模块编程模块:程序模块(定时器1定时器0外部中断0LCD显示模块)iic协议DACADC转换模块键模块
程序先进行定时器0定时器1iic初始化液晶显示程序然根键控制波形示波器显示相应波形刚开始没改变程序初始频率幅值波形输出程序初始频率幅值初设值改变幅值频率单片机扫描根变化频率幅值进行中断定时初始值设定进行定时器中断重新设定频率幅度值显示LCD12864然变化波形数字量通PCF8591芯片DA转换成模拟量输出新波形
程序设计框图:
准备
PCF8591
ADDA
LCD12864
初始化
KEY2?
KEY1?
KEY3?
幅度频率增加
幅度频率
减少
幅度频率
切换
终止
图41 程序设计流程图
42 LCD显示子程序设计
液晶显示程序程序实时显示出前波形幅值频率键切换液晶显示着变液晶显示程序需首先初始化进行数传输进行字符显示写出相应程序进行LCD显示
图42 LCD 显示流程图
43 PCF8591数模模数转换子程序设计
程序采PCD8591作DAAD转换器需A1A1A2接单片机P37P36接PCF8591SCLSDA端口AOUT接示波器供显示DADA转换满足I2C协议进行数传输
void DAC(uchar date) DA
{
start()
write_byte(0x90) 0x90写址
ack()
write_byte(0x40)
ack()
write_byte(date)
ack()
stop()
}
uchar ADC(uchar c) AD
{
uchar k
start()
write_byte(0x90) 0x90写址
ack()
write_byte(c)
ack()
start()
write_byte(0x91) 0x91读址
ack()
kread_byte()
stop()
return k
}
5 调试性分析
51 调试步骤
511 硬件调试:
检查线路连接错误SDASCL接单片机P36P37口VCC接电源GND接AOUT接示波器载数单片机数传输时候PCF8591红色灯会停闪说明数传输否数传输
512软件调试:
首先I2C协议否正确否传输数键逻辑关系否正确LCD显示否正确定时器0定时器1初始化否误外部中断0检测频率否效
513 LCD显示调试:
方波发生器机界面LCD12864显示液晶定时器定时值会影响LCD刷新速度定时器定时值太时候会发生LCD法显示状态影响操作判断LCD显示程序放函数while(1)死循环里样会出现闪屏现象LCD调试中加for循环减少机界面刷新速度解决界面闪屏现象更提高机界面性液晶进行初始化注意液晶单片机引脚相互应
514 波形显示调试:
调节电源输出5V电压调整示波器电路供电观察示波器记录频段应波形情况峰峰值调试结果表明该电路求频率范围部分频率范围基失真高频率低频率少许失真中频率接100Hz时方波高低电压跃变时出现毛刺应该零较器频率特性致
52 性分析
段时间运行系统性进行测试方波波形说示波器测试性指标前面述设计波形发生器产生标准方波信号幅值0—5V步进01V变化频率0Hz—100Hz步进1Hz调整
调试程:程序烧入单片机连接示波器示波器显示标准方波液晶显示器显示第行幅度第二行频率第三行测量幅度第四行测量频率KEY3没KEY1键波形幅度步进01V增加KEY2键波形幅度步进01V减少KEY3KEY1键波形频率步进1Hz增加KEY2键波形频率步进1Hz减少
53 误差分析
调试幅度44V时增加幅值会相误差频率超60Hz左右时继续增加会出现误差
分析:调节幅度时初始值0—255数字量应实际05V电压值例151键程序中数字量步进6实际应该55左右PCF8591DA功示波器精度早幅度误差调节频率时初始值1100数字量程序中根定时器定时功计算出100应计数值分应1100Hz频率计数值定时器1定时1s根外部中断0捕捉降功1s中捕捉脉数进行处理刚应频率值计算100计数值时取整数PCF8591ADDA影响示波器精度素导致频率出现误差
6 致谢
回顾前做课程设计确实步步做收获较明显学老师帮助完成感受深刻次课程设计程意义中首先感谢钟老师聂老师短短两周老师做合理安排老师抓较紧促进度次感谢组员没没容易完成务期间苦想问题指示利完成次课程设计谢谢老师伙伴
知听谁说学里老师负责想说瞎说里找负责老师次谢谢老师
7 心体会
基单片机方波测量设计设计中涉典型控制程通单片机控制模数转换器PCF8591产生需模拟信号通AD转换产生波形测量测量出产生波形幅值通定时器外部中断熟练运测量出产生波形频率样方波发生测量装置控制领域相广泛应范围终做出方波测量设计基满足题目中求
课程设计培养学生综合运学知识发现提出分析解决实际问题锻炼实践力重环节学生实际工作力具体训练考察程次单片机课程设计感慨颇确选题总体方案设计理实践两星期日子里说苦甜学东西说芯片程序编写时仅巩固前学知识学书没学知识通次课程设计懂理实际相结合重理知识远远够学理知识实践相结合起理中出结真正社会服务提高实际动手力独立思考力设计程中遇问题然定方案解决非常完善
次课程设计终利完成设计中遇编程问题老师学指导终问题解决时帮助学位指导老师次表示忠心感谢
8 参考文献
(1) 胡文金 单片机系统实训教程 重庆:重庆学出版社2005
(2) 梁森 动检测技术应北京:机械工业出版社2012
(3) 程德福 智仪器 机械工业出版社20099
(4) 张靖武单片机系统PROTUSE设计仿真北京:电子工业出版社2007
(5) 王俊英基AT89C51单片机PWM专信号发生器设计微计算机信息2005
附录 1 系统硬件电路图
附录 2 波形采集图
附录 3 软件部分
#include
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define _Nop()
Uint code Hz[100]{10000500033332500200016671429125011111000909833769714667625588556526500 476455435417400385370357345333323313303294288278270263256250
244238233227222217213208204200196192189185182179175172169167
164161159156154152149147145143141139137135133132130128127125
123122120119118116115114112111110109108106105104103102101100}
sbit sdaP3^6
sbit sclP3^7
bit FZ0
unsigned int count_f0
unsigned char zd_count0
unsigned char js_count0
unsigned int b0
unsigned int n2
unsigned char TH
unsigned char TL
unsigned int mode0
unsigned int fd150
unsigned int u
unsigned int m
*************
sbit CS P2^4 RS
sbit SIDP2^5 RW
sbit EP2^6 SCLK
sbit PSBP1^4 E
*************
sbit KEY2P3^3 键
sbit KEY5P1^6
sbit KEY6P1^7
***********************************************
void delay(unsigned int z)
{ unsigned int xy
for(xzx>0x)
for(y125y>0y)
}
***************************************************
void SendByte(unsigned char Dbyte)
{
unsigned char i
CS1 片选
for(i0i<8i++)
{
E0
if((Dbyte< SID1
else
SID0
E1
E0
}
CS0
}
void Lcd_WriteCmd(unsigned char Cbyte )
{
delay(10)
SendByte(0xf8)传送命令(11111000)
SendByte(0xf0&Cbyte)
SendByte(0xf0&(Cbyte<<4))
}
void Lcd_WriteData(unsigned char Dbyte )
{
delay(10)
SendByte(0xfa)RW(0)RS(1) 传送数(11111010)
SendByte(0xf0&Dbyte)
SendByte(0xf0&(Dbyte<<4))
}
void InitLCD() 初始化LCD
{
Lcd_WriteCmd(0x30)
Lcd_WriteCmd(0x06)
Lcd_WriteCmd(0x0c)
Lcd_WriteCmd(0x04)
Lcd_WriteCmd(0x01)
Lcd_WriteCmd(0x02)
Lcd_WriteCmd(0x80)
}
void xianshi(unsigned char xunsigned char yunsigned char *stri) LCD显示坐标
{
if(x1) Lcd_WriteCmd(0x80+y1)
else if(x2) Lcd_WriteCmd(0x90+y1)
else if(x3) Lcd_WriteCmd(0x88+y1)
else if(x4) Lcd_WriteCmd(0x98+y1)
while(*stri>0)
{
Lcd_WriteData(*stri)
stri++
}
}
****************************************************
void delayp()
{}
void delay_1ms(uint z)
{
uint xy
for(xzx>0x)
for(y100y>0y)
}
*****************************************I2C
void start()
{
sda1 *数线拉高*
_Nop()
scl1
_Nop() *延迟47us*
_Nop()
_Nop()
_Nop()
_Nop()
sda0 *数线拉低*
_Nop()
_Nop()
_Nop()
_Nop()
_Nop()
}
void stop()
{
sda0
_Nop()
scl1
_Nop()
_Nop()
_Nop()
_Nop()
_Nop()
sda1
_Nop()
_Nop()
_Nop()
_Nop()
_Nop()
}
void ack() iic应答
{
uchar i200
scl1
_Nop()
_Nop()
_Nop()
_Nop()
_Nop()
while((sda1)&&(i))
scl0
_Nop()
_Nop()
_Nop()
}
void init_iic() iic 初始化
{
sda1
_Nop()
_Nop()
_Nop()
_Nop()
_Nop()
scl1
_Nop()
_Nop()
_Nop()
_Nop()
_Nop()
}
void write_byte(uchar dat) 写数
{
uchar i temp
tempdat
for(i0i<8i++)
{
temp<<1
scl0
_Nop()
_Nop()
_Nop()
_Nop()
sdaCY
_Nop()
_Nop()
_Nop()
_Nop()
scl1
_Nop()
_Nop()
_Nop()
_Nop()
_Nop()
}
scl0
_Nop()
_Nop()
_Nop()
_Nop()
_Nop()
sda1
_Nop()
_Nop()
_Nop()
_Nop()
_Nop()
}
uchar read_byte() 读数
{
uchar i k
for(i0i<8i++)
{
k<<1
scl1
_Nop()
_Nop()
_Nop()
_Nop()
kk|sda
_Nop()
_Nop()
_Nop()
_Nop()
scl0
_Nop()
_Nop()
_Nop()
_Nop()
}
sda1
_Nop()
_Nop()
_Nop()
_Nop()
return k
}
void DAC(uchar date) DA
{
start()
write_byte(0x90)
ack()
write_byte(0x40)
ack()
write_byte(date)
ack()
stop()
}
uchar ADC(uchar c)
{
uchar k
start()
write_byte(0x90)
ack()
write_byte(c)
ack()
start()
write_byte(0x91)
ack()
kread_byte()
stop()
return k
}
****************************************************
int main()
{
TMOD 0x11
TH0 (65536100)256 12MHz100us定时
TL0 (65536100)256
TH1 (655365000)256 5ms定时
TL1 (655365000)256
EA 1
EX0 1 外部中断0
IT0 1
ET0 1
ET1 1
TR0 1
TR1 1
init_iic()
while(1)
{
PSB0
InitLCD()
delay_1ms(100)
for(u0u<3u++)
{
xianshi(11幅值)
Lcd_WriteData(0x30+(fd51))
xianshi(15)
Lcd_WriteData(0x30+(((fd51)*2)10)10)
xianshi(16V)
xianshi(21频率 )
Lcd_WriteData(0x30+(n100))
Lcd_WriteData(0x30+(n10)10)
Lcd_WriteData(0x30+(n10))
xianshi(26Hz)
xianshi(31测量幅值)
Lcd_WriteData(0x30+(m51))
xianshi(37)
Lcd_WriteData(0x30+((m51)*2)1010)
xianshi(38V)
xianshi(41测量频率)
Lcd_WriteData(0x30+(count_f100))
Lcd_WriteData(0x30+(count_f1010))
Lcd_WriteData(0x30+(count_f10))
xianshi(48Hz)
}
}
}
**************************************************************
void refresh_bx( void ) interrupt 1
{
TH0 (65536100)256
TL0 (65536100)256
b++
if(b>(Hz[n]2))
{
b0
if(FZ0)
{
DAC(0x00)
}
if(FZ1)
{
DAC(fd)
mADC(0x43)
}
FZ~FZ
}
}
void refresh_hz( void ) interrupt 0
{
zd_count++
}
********************************************
void refresh_jp( ) interrupt 3
{
TH1 (655365000)256
TL1 (655365000)256
js_count++
if(js_count>200)
{
js_count0
count_fzd_count
zd_count0
}
if(flag_start1)
{
flag_count++
}
if(KEY60)
{
delay_1ms(10)
if(KEY60)
modemode+1
if(mode>2)
mode0
while(KEY6)
}
*******************************************
if(KEY20&&mode1)
{
delay_1ms(100)
nn+1
if(n>100)
n1
while(KEY2)
}
if(KEY50&&mode1)
{
delay_1ms(100)
nn1
if(n<0)
n100
while(KEY5)
}
*******************************************
if(KEY20&&mode0)
{
delay_1ms(10)
fdfd+6
if(fd>255)
fd0
while(KEY2)
}
if(KEY50&&mode0)
{
delay_1ms(10)
fdfd6
if(fd<0)
fd255
while(KEY5)
}
}
文档香网(httpswwwxiangdangnet)户传
《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
该内容是文档的文本内容,更好的格式请下载文档