![PIC实例程序[精校版本]_第1页](http://file1.renrendoc.com/fileroot_temp2/2021-1/28/1bdba036-0559-47f3-8c5f-88e05ffcb04c/1bdba036-0559-47f3-8c5f-88e05ffcb04c1.gif)
![PIC实例程序[精校版本]_第2页](http://file1.renrendoc.com/fileroot_temp2/2021-1/28/1bdba036-0559-47f3-8c5f-88e05ffcb04c/1bdba036-0559-47f3-8c5f-88e05ffcb04c2.gif)
![PIC实例程序[精校版本]_第3页](http://file1.renrendoc.com/fileroot_temp2/2021-1/28/1bdba036-0559-47f3-8c5f-88e05ffcb04c/1bdba036-0559-47f3-8c5f-88e05ffcb04c3.gif)
![PIC实例程序[精校版本]_第4页](http://file1.renrendoc.com/fileroot_temp2/2021-1/28/1bdba036-0559-47f3-8c5f-88e05ffcb04c/1bdba036-0559-47f3-8c5f-88e05ffcb04c4.gif)
![PIC实例程序[精校版本]_第5页](http://file1.renrendoc.com/fileroot_temp2/2021-1/28/1bdba036-0559-47f3-8c5f-88e05ffcb04c/1bdba036-0559-47f3-8c5f-88e05ffcb04c5.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、MCD-DEMO2A/D转换程序实例PIC16F877A+PICC /实验目的:熟悉A/D转换/软件思路:选择RA0做为模拟输入通道;/ 结果只取低8位/ 连续转换5次再求平均值做为转换结果/ 结果送数码管的高低3位显示/硬件要求:跳线J18接通/ 拨码开关S6全部置ON,S5第4-6位置ON,第1-3位置OFF/ 为不影响结果,其他拨码开关置OFF。#include /包含单片机内部资源预定义_CONFIG(0x1832); /芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡const char TABLE=0xc0,0xf9,0xa4,0xb0,0x99,0
2、x92,0X82,0XF8,0X80,0X90; /定义常数0-9的数据表格void DELAY(); /delay函数申明void init(); /I/O口初始化函数申明void display(int x); /显示函数申明/- /主程序开始void main() int result=0x00; /定义转换结果寄存器 while(1) /死循环 int i; /定义循环次数控制寄存器 result=0x00; /转换结果清0 for(i=5;i0;i-) /求5次转换结果的平均值 init(); /调用初始化函数 ADGO=0X1; /开启转换过程 while(ADGO); /等待转换
3、完成 result=result+ADRESL; /累计转换结果 result=result/5; /求5次结果的平均值 display(result); /调用显示函数 /-/初始化函数void init() PORTA=0XFF; PORTD=0XFF; /熄灭所有显示 TRISA=0X1; /设置RA0为输入,其他为输出 TRISD=0X00; /设置D口全为输出 ADCON1=0X8E; /转换结果左对齐,RA0做模拟输入口,其它做普通I/O ADCON0=0X41; /系统时钟Fosc/8,选择RA0通道,允许ADC工作 DELAY(); /保证采样延时 /-/显示函数void di
4、splay(int x) int bai,shi,ge,temp; /定义4个临时变量 temp=x; /暂存AD转换的结果 bai=temp/0x64; /求显示的百位 shi=(temp%0x64)/0xa; /求显示的十位 ge=(temp%0x64)%0xa; /求显示的个位 PORTD=TABLEbai; /查表得百位显示的代码 PORTA=0x1f; /RA3输出低电平,点亮百位显示 DELAY(); /延时一定时间,保证显示亮度 PORTD=TABLEshi; /查表得十位显示的代码 PORTA=0x2F; /RA4输出低电平,点亮十位显示 DELAY(); /延时一定时间,保证
5、亮度 PORTD=TABLEge; /求个位显示的代码 PORTA=0x37; /RA5输出低电平,点亮个位显示 DELAY(); /延时一定时间,保证亮度 /-/延时程序void DELAY() /延时程序 int i; /定义整形变量 for(i=0x100;i-;); /延时 2008-3-21 11:47:00flash607等级:小学三年级文章:10积分:432门派:无门无派注册:2008年5月7日第 2 楼 学习学习!很好的东西加很好的程序!2008-5-22 10:35:00libozero等级:初中一年级文章:37积分:1204门派:无门无派注册:2008年5月14日第 3 楼
6、 求汇编的AD转换程序实例2008-5-28 10:15:00zhongruntian头衔:丐帮帮主等级:老师(版主)文章:8684积分:178421门派:丐帮注册:2005年3月13日第 4 楼 坎坷不平,艰难重重,若无耐心,难望有成.PIC16技术支持QQ:443935535 2008-5-28 11:03:00slaoliu等级:高中一年级文章:85积分:2142门派:无门无派注册:2006年11月7日第 5 楼 此程序为什么用 PROTEUS7.1 仿真不能正常工作呢.2008-8-15 12:09:00charles_ccw等级:小学三年级文章:9积分:392门派:无门无派注册:20
7、07年1月16日第 6 楼 为什麽當我跑程式时转动电位器,不是出现一次0-255,而是0-255 四次呢? 请指教!2008-9-28 14:08:00zhongruntian头衔:丐帮帮主等级:老师(版主)文章:8684积分:178421门派:丐帮注册:2005年3月13日第 7 楼 以下是引用charles_ccw在2008-9-28 14:08:00的发言:为什麽當我跑程式时转动电位器,不是出现一次0-255,而是0-255 四次呢? 请指教!这样就对了!877A的A/D转换是10位的,而这个程序只取了低8位。实际转换结果应该是:00 000 - 00 255 - 01 000 - 01
8、 - 01 255 - 10 000 - 10 255 - 11 000 - 11 255 (高两位是二进制,后面三位是十进制,这样写主要是为了方便。如 00 2555 其中00是两位二进制,255是三位十进制)坎坷不平,艰难重重,若无耐心,难望有成.PIC16技术支持QQ:443935535 2008-9-28 15:44:00charles_ccw等级:小学三年级文章:9积分:392门派:无门无派注册:2007年1月16日第 8 楼 请问一下,如何才可以变回一组数字呢,即 000-255 或 000-1024 呢? 谢谢!2008-9-28 16:46:00wangjingcan等级:小学
9、二年级文章:7积分:361门派:无门无派注册:2009年2月23日第 9 楼 result=result+ADRESL; /累计转换结果?当ADRESL值较大时(如0XFE)数据不会溢出?2009-4-29 10:37:00zhongruntian头衔:丐帮帮主等级:老师(版主)文章:8684积分:178421门派:丐帮注册:2005年3月13日第 10 楼 以下是引用wangjingcan在2009-4-29 10:37:00的发言:result=result+ADRESL; /累计转换结果?当ADRESL值较大时(如0XFE)数据不会溢出?result是int型啊。楼主 MCD-DEMO2
10、PIC单片机红外线遥控接收解码实例PIC16F877A+PICC/实验目的:熟悉遥控接码解码的方法/数码管显示解码结果:高四位为用户码,低2位为按键码/硬件要求:跳线J19接通,其他跳线断开/ 拨码开关S5、S6全部置ON/ 其他拨码开关全部置OFF#include_CONFIG(0x1832); /芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡#define uchar unsigned char#define uint unsigned intvoid delay(char x,char y);#define bitset(var,bitno)(var)|
11、=1(bitno)#define bitclr(var,bitno)(var)&=(1(bitno)union struct unsigned b0:1; unsigned b1:1; unsigned b2:1; unsigned b3:1; unsigned b4:1; unsigned b5:1; unsigned b6:1; unsigned b7:1; oneBit; unsigned char allBits; myFlag;#define CNT2_1 myFlag.oneBit.b1 #define CNT2_2 myFlag.oneBit.b2 #define CNT2_3
12、myFlag.oneBit.b3 #define CNT2 myFlag .allBitsstatic bit FLAGS ; static bit Bitin; union Csr unsigned long i; unsigned char Csra4; myCsra;#define RMT RA1 / ;遥控接收输入脚位地址(RA。1)#define BITIN 7 /遥控接收数据位位标志uchar CNT0, CNT3,CNT4; /用户临时寄存器1-4uint CNT1;uchar TABADD; /数码管显示码取码用寄存器uchar CSR0; /;遥控键码反码寄存器uchar C
13、SR1; /;遥控器键码寄存器uchar CSR2; /;遥控器用户码高8位寄存器uchar CSR3; /;遥控器用户码低8位寄存器uchar FLAGS2; /;临时寄存器uchar CSR2A ; /遥控接收32位数据暂存寄存器const uchar table=0x0C0,0x0F9,0x0A4,0x0B0,0x99,0x92,0x82,0x0F8,0x80,0x90,0x88,0x83,0x0C6,0x0a1,0x86,0x8e,;/0x00 / 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f,/-系统初始化子程序-void initia
14、l (void) PORTA=0; ADCON1=7; / 设置RA口全部为普通数字IO口 TRISA=0x02; / 将RMT设置为输入,其它所有IO口设置为输出 TRISD=0; / ;RC口全部为输出 PORTD=0xFF; /先让数码管全部不显示/-void RCV() if(!RMT) CNT1=640; /4*256*10us 640*16=10。24ms CNT2=0; /RCV1 do / ;先检测引导码的9MS低电平_ / ;每一个循环16US if(RMT) CNT2=CNT2+; if(!RMT) CNT2=0; if(CNT2_2) /高电平大于8*10US=80US则
15、为有效高电平, break; /否则是一些干扰信号16*4=64us while (CNT1-); /低电平大于4*256*10US=10.24MS则是错误脉冲 /RCV2 if(CNT2_2&(0CNT1)&(CNT1320) /;低电平小于2*256*10US=5.12MS_ /320*16=5。12ms则是错误脉冲 CNT1=480; /;3*256*10us 480*16=7.68 CNT2=0; /RCV3 /;每一个循环16US do if(!RMT) CNT2=CNT2+; if (RMT) CNT2=0; if(CNT2_2) / 低电平大于8*10US=80US则为有效低电平
16、,否则是一些干扰信号 break; /RCV4,否则是一些干扰信号16*4=64us / 高电平大于3*256*10US=7.68MS则是错误的 while (CNT1-); /RCV4 if(CNT2_2 & (0CNT1)&(CNT1320) /高电平小于1*256*10US=2.56MS则是错误的 /480-320=160 *16= 2.56ms CNT3 =32; /接收数据共32位,16位用户码,8位控制码加8位控制码的反码 /RCV5 do CNT2=0; CNT0=86; /低电平大于256-170=86*10US=860US错误 86*10 _ CNT4=200; /高电平大于
17、256-56=200*10US=2MS错误 200*10 /RCV5_HI do /;每一个循环10US if(RMT) CNT2=CNT2+; if(!RMT) CNT2=0; if(CNT2_3) /;高电平大于8*10US=80US则为有效高电平 break; /RCV6否则是一些干扰信号16*4=64us /;低电平大于860US则是错误的 while (CNT0-); /CV6 if(CNT0=0)|(CNT2_3=0) break; CNT2=0; /RCV6_LO do /_ if(!RMT) CNT2=CNT2+; if(RMT) CNT2=0; if(CNT2_3) /低电平
18、大于10*8US=80US则是有效低电平 break ; / COMPARE 否则是一些干扰信号16*4=64us while (CNT4-);/高电平大于256-56=200*10US=2MS错误 if(CNT4=0)|(CNT2_3=0) break; /OMPARE CNT0=(86-CNT0)+(200-CNT4) ; /;减CNT0的值 等于实际低电平计数值 / ;减CNT4的值 等于实际高电平计数值 / ;将高低电平的计数加在一起并存入CNT0,通过比较高低电平总的时间来确定是1还是0 / ;总的值大于255(即时间大于255*10US=2.55MS)则错误 255*10=2.55
19、 / ;总的时间小于70*10US=700US则是错误的 70*10=700 if( (70CNT0)&(CNT0130)|(160CNT0)&(CNT0230) ) ) / ;130*10=1.3MS if(70CNT0)&(CNT0130) /COMPARE_H / ;时间大于1.3MS转去确定是否1 Bitin=0; /;时间在700US-1.3MS之间则是0 else/ if (160CNT01; /;将每一位移入相应寄存器 if(Bitin) bitset ( myCsra. Csra3,7); else bitclr ( myCsra. Csra3,7); else break;
20、while (CNT3-); /;是否接收完32位 CSR3=myCsra. Csra0; CSR2=myCsra. Csra1; CSR1=myCsra. Csra2; CSR0=myCsra. Csra3; CSR2A= CSR0; /;比较键码的反码取反后是否等于键码 /;不等于则接收到的是错误的信息 / 将键码送显示 /-void display() int i; /定义查表变量 i=CSR3&0x0f; /求秒的个位 PORTD=tablei; /送D口显示 PORTA=0x3e; /点亮秒的个位 delay(5,70); /延长一段时间,保证亮度 i=CSR3&0xf0; /求秒的
21、十位 i=i4; /右移4位 PORTD=tablei; /送D口显示 PORTA=0x3d; /点亮秒的十位 delay(5,70); /延长一段时间,保证亮度 i=CSR2&0x0f; /求分的个位 PORTD=tablei; /送D口显示,并显示小数点 PORTA=0x37; /点亮分的个位 delay(5,70); /延长一段时间,保证亮度 i=CSR2&0xf0; /求分的十位 i=i4; PORTD=tablei; /送D口显示 PORTA=0x3b; /点亮分的十位 delay(5,70); /延长一段时间,保证亮度 i=CSR1&0x0f; /求时的个位 PORTD=table
22、i; /送D口显示,并加上小数点 PORTA=0x2f; /点亮时的个位 delay(5,70); /延长一段时间,保证亮度 i=CSR1&0xf0; /求时的十位 i=i4; PORTD=tablei; /送D口显示 PORTA=0x1f; /点亮时的十位 delay(5,70); /延长一段时间,保证亮度 /-主程序-void main(void) initial (); /系统初始化子程序 while(1) RCV(); /遥控接收程序 display(); /解码显示程序 /-/延时函数void delay(char x,char y) char z; do z=y; do;while
23、(-z); while(-x);/其指令时间为:7+(3*(Y-1)+7)*(X-1)如果再加上函数调用的call 指令、页面设定、传递参数花掉的7 个指令。/则是:14+(3*(Y-1)+7)*(#include_CONFIG(0x1832); /芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡#define uch unsigned char /给unsigned char起别名 uch# define DQ RA0 /定义18B20数据端口 # define DQ_DIR TRISA0 /定义18B20D口方向寄存器 # define DQ_HIGH()
24、DQ_DIR =1 /设置数据口为输入# define DQ_LOW() DQ = 0; DQ_DIR = 0 /设置数据口为输出unsigned char TLV=0 ; /采集到的温度高8位unsigned char THV=0; /采集到的温度低8位unsigned char TZ=0; /转换后的温度值整数部分unsigned char TX=0; /转换后的温度值小数部分unsigned int wd; /转换后的温度值BCD码形式unsigned char shi; /整数十位unsigned char ge; /整数个位unsigned char shifen; /十分位unsi
25、gned char baifen; /百分位unsigned char qianfen; /千分位unsigned char wanfen; /万分位unsigned char table=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90; /0-9的显示代码/-/延时函数void delay(char x,char y) char z; do z=y; do;while(-z); while(-x);/其指令时间为:7+(3*(Y-1)+7)*(X-1)如果再加上函数调用的call 指令、页面设定、传递参数花掉的7 个指令。/则是:14+(3
26、*(Y-1)+7)*(X-1)。/-/结果显示函数void display()TRISA=0X00; /设置A口全为输出PORTD=tableshi; /显示整数十位PORTA=0x3e;delay(10,70);PORTD=tablege&0X7F; /显示整数个位,并点亮小数点PORTA=0x3d;delay(10,70);PORTD=tableshifen; /显示小数十分位PORTA=0x3b;delay(10,70);PORTD=tablebaifen; /显示小数百分位PORTA=0x37;delay(10,70);PORTD=tableqianfen; /显示小数千分位PORTA
27、=0x2f;delay(10,70);PORTD=tablewanfen; /显示小数万分位PORTA=0x1f;delay(10,70);/-/系统初始化函数void init() ADCON1=0X07; /设置A口为普通数字口 TRISA=0X00; /设置A口方向为输出 TRISD=0X00; /设置D口方向为输出/-/复位DS18B20函数reset(void) char presence=1; while(presence) DQ_LOW() ; /主机拉至低电平 delay(2,70); /延时503us DQ_HIGH(); /释放总线等电阻拉高总线,并保持1560us del
28、ay(2,8); /延时70us if(DQ=1) presence=1; /没有接收到应答信号,继续复位 else presence=0; /接收到应答信号 delay(2,60); /延时430us /-/写18b20写字节函数void write_byte(uch val)uch i;uch temp;for(i=8;i0;i-) temp=val&0x01; /最低位移出 DQ_LOW(); NOP(); NOP(); NOP(); NOP(); NOP(); /从高拉至低电平,产生写时间隙 if(temp=1) DQ_HIGH(); /如果写1,拉高电平 delay(2,7); /延时63us DQ_HIGH(); NOP(); NOP(); val=val1; /右移一位 /-/18b20读字节函数uch read_byte(void)uch i;uch value=0; /读出温度static bit j;for(i=8;i0;i-) value=1; DQ_LOW(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); /6us DQ_HIGH(); /拉至高电平 NOP(); NOP(); NOP(); NOP(); NOP(); /4us j=DQ; if(j) value|=0x80;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 金融分析师考试动态把握与试题及答案
- 计算机辅助外语教学在初中英语教学中的个案研究
- 河北省衡水市阜城实验中学2024-2025学年高一下学期3月月考历史试题(含解析)
- 突破复习瓶颈的CFA试题及答案
- 【地理】2024届山东省滕州市高三一调试题(解析版)
- 中学英语校本教研的途径和方法
- 2024年特许金融分析师评估的试题及答案
- 特许金融分析师考试答题技巧大揭秘与试题及答案
- CFA课程复习试题及答案模板
- 视网膜静脉阻塞的护理
- 邮政集团社招柜员笔试题
- 《中国成人暴发性心肌炎诊断和治疗指南2024》解读
- JBT 14191-2023 管道带压开孔机 (正式版)
- 采购管理中的原材料采购风险评估
- 注射用多种维生素(13)临床应用专家共识
- 家政保洁培训课件教学
- 医院科室专项知识培训方案
- 医院感染科护士对防控感染的终末消毒与彻底清洁
- 酒店饭店服务流程
- GRR测量系统分析报告范例
- 钢筋分析表(电子版)
评论
0/150
提交评论