把数据从单片机如何读取数据内部eepom中读出来为什么用到ox2000

单片机课程设计温度报警系统源程序_慧知文库
附录2源程序#include&reg52.h&#include&eepom52.h&#defineucharunsignedchar#defineuintunsignedint//数码管段选定义ucharcodesmg...
附录 2 源程序 #include &reg52.h& #include &eepom52.h& #define uchar unsigned char #define uint unsigned int //数码管段选定义 0 1 2 3 4 5 6 7 8 9 uchar code smg_du[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, 0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff}; //断码 //数码管位选定义 uchar code smg_we[]={0xef,0xdf,0xbf,0x7f}; uchar dis_smg[8] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8}; uchar smg_i = 3; //显示数码管的个位数 sbit dq = P2^4; //18b20 IO 口的定义 sbit beep = P2^5; //蜂鸣器 IO 口定义 uchar a_a; // bit flag_300 uchar key_ //按键值的变量 uchar menu_1; //菜单设计的变量 uint t_high = 300,t_low = 100; bit flag_lj_ //按键连加使能 bit flag_lj_3_ //按键连 3 次连加后使能 加的数就越大了 uchar key_time,flag_ //用做连加的中间变量 bit key_500 uchar flag_ uchar zd_break_en,zd_break_ //自动退出设置界面 /***********************1ms 延时函数*****************************/ void delay_1ms(uint q) { uint i,j; for(i=0;i&q;i++) for(j=0;j&120;j++); } /***********************小延时函数*****************************/ void delay_uint(uint q) { while(q--); } /***********************数码显示函数*****************************/ void display() {
for(i=0;i&smg_i;i++) { P3 = smg_we[i]; P1 = dis_smg[i]; delay_1ms(1); P3 = 0 P1 = 0 } //位选 //段选 //位选 //消隐 } /******************把数据保存到单片机内部 eepom 中******************/ void write_eepom() { SectorErase(0x2000); byte_write(0x2000, t_high % 256); byte_write(0x2001, t_high / 256); byte_write(0x2002, t_low % 256); byte_write(0x2003, t_low / 256); byte_write(0x2055, a_a); } /******************把数据从单片机内部 eepom 中读出来*****************/ void read_eepom() { t_high = byte_read(0x2001); t_high &&= 8; t_high |= byte_read(0x2000); t_low = byte_read(0x2003); t_low &&= 8; t_low |= byte_read(0x2002); a_a = byte_read(0x2055); } /***********************18b20 初始化函数*****************************/ void init_18b20() { dq = 1; //把总线拿高 delay_uint(1); //15us dq = 0; //给复位脉冲 delay_uint(80); //750us dq = 1; //把总线拿高 等待 delay_uint(10); //110us q = //读取 18b20 初始化信号 delay_uint(20); //200us dq = 1; //把总线拿高 释放总线 }
/*************写 18b20 内的数据***************/ void write_18b20(uchar dat) { for(i=0;i&8;i++) { //写数据是低位开始 dq = 0; //把总线拿低写时间隙开始 dq = dat & 0x01; //向 18b20 总线写数据了 delay_uint(5); // 60us dq = 1; //释放总线 dat &&= 1; } } /*************读取 18b20 内的数据***************/ uchar read_18b20() { uchar i, for(i=0;i&8;i++) { dq = 0; //把总线拿低读时间隙开始 value &&= 1; //读数据是低位开始 dq = 1; //释放总线 if(dq == 1) //开始读写数据 value |= 0x80; delay_uint(5); //60us 读一个时间隙最少要保持 60us 的时间 } //返回数据 } /*************读取温度的值 读出来的是小数***************/ uint read_temp() { //在读取温度的时候如果中断的太频繁了,就应该把中断给关了,否 则会影响到 18b20 的时序 init_18b20(); //初始化 18b20 write_18b20(0xcc); //跳过 64 位 ROM write_18b20(0x44); //启动一次温度转换命令 delay_uint(50); //500us init_18b20(); write_18b20(0xcc); write_18b20(0xbe); EA = 0; //初始化 18b20 //跳过 64 位 ROM //发出读取暂存器命令
low = read_18b20(); value = read_18b20(); EA = 1; value &&= 8; value |= value *= 0.625; //读温度低字节 //读温度高字节 //把温度的高位左移 8 位 //把读出的温度低位放到 value 的低八位中 //转换到温度值 小数 //返回读出的温度 带小数 } /*************定时器 0 初始化程序***************/ void time_init() { EA = 1; //开总中断 TMOD = 0X01; //定时器 0、定时器 1 工作方式 1 ET0 = 1; //开定时器 0 中断 TR0 = 1; //允许定时器 0 定时 } /****************独立按键处理函数************************/ void key() { static uchar key_new = 0,key_old = 0,key_value = 0; if(key_new == 0) { //按键松开的时候做松手检测 if((P2 & 0x0f) == 0x0f) key_value ++; else key_value = 0; if(key_value &= 10) { write_eepom(); key_value = 0; key_new = 1; flag_lj_en = 0; //关闭连加使能 flag_lj_3_en = 0; //关闭 3 秒后使能 flag_value = 0; //清零 } } else { if((P2 & 0x0f) != 0x0f) key_value ++; //按键按下的时候 else key_value = 0; if(key_value &= 7) {
key_value = 0; key_new = 0; flag_lj_en = 1; //连加使能 zd_break_en = 1; //自动退出设置界使能 zd_break_value = 0; //自动退出设置界变量清零 } } key_can = 20; if(key_500ms == 1) { key_500ms = 0; zd_break_en = 1; //自动退出设置界使能 zd_break_value = 0; //自动退出设置界变量清零 key_new = 0; key_old = 1; } if((key_new == 0) && (key_old == 1)) { switch(P2 & 0x0f) { case 0x0e: key_can = 4; //得到 k1 键值 case 0x0d: key_can = 3; //得到 k2 键值 case 0x0b: key_can = 2; //得到 k3 键值 case 0x07: key_can = 1; //得到 k4 键值 } } key_old = key_ } /****************按键处理数码管显示函数***************/ void key_with() { if(key_can == 4) { menu_1 ++; if(menu_1 &= 3) { menu_1 = 0; } if(menu_1 == 0) { dis_smg[0] = smg_du[temperature % 10]; //取温度的小数显示 dis_smg[1] = smg_du[temperature / 10 % 10] & 0x7f; //取温度的个位显示 dis_smg[2] = smg_du[temperature / 100 % 10] ; //取温度的十位显示 smg_i = 3;
} if(menu_1 == 1) { dis_smg[0] = smg_du[t_high % 10]; //取小数显示 dis_smg[1] = smg_du[t_high / 10 % 10] & 0x7f; //取个位显示 dis_smg[2] = smg_du[t_high / 100 % 10] ; //取 low 十位显示 dis_smg[3] = 0x89; smg_i = 4; } if(menu_1 == 2) { dis_smg[0] = smg_du[t_low % 10]; //取 low 小数显示 dis_smg[1] = smg_du[t_low / 10 % 10] & 0x7f; //取个位显示 dis_smg[2] = smg_du[t_low / 100 % 10] ; //取十位显示 dis_smg[3] = 0xc7; smg_i = 4; } } if(menu_1 == 1) //设置高温报警 { if(key_can == 3) { if(flag_lj_3_en == 0) t_high ++ ; //按键按下未松开自动加三次 else t_high += 10; //按键按下未松开自动加三次之后每次自动加 10 if(t_high & 990) t_high = 990; dis_smg[0] = smg_du[t_high % 10]; //取小数显示 dis_smg[1] = smg_du[t_high / 10 % 10] & 0x7f; //取个位显示 dis_smg[2] = smg_du[t_high / 100 % 10] ; //取十位显示 dis_smg[3] = 0x89; //H } if(key_can == 1) { if(flag_lj_3_en == 0) t_high -- ; //按键按下未松开自动加三次 else t_high -= 10; //按键按下未松开自动减三次之后每次自动减 10 if(t_high &= t_low) t_high = t_low + 1; dis_smg[0] = smg_du[t_high % 10]; //取小数显示 dis_smg[1] = smg_du[t_high / 10 % 10] & 0x7f; //取个位显示 dis_smg[2] = smg_du[t_high / 100 % 10] ; //取十位显示
dis_smg[3] = 0x89; //H // } write_eepom(); } if(menu_1 == 2) //设置低温报警 { if(key_can == 3) { if(flag_lj_3_en == 0) t_low ++ ; else t_low += 10; if(t_low &= t_high) t_low = t_high - 1; dis_smg[0] = smg_du[t_low % 10]; dis_smg[1] = smg_du[t_low / 10 % 10] & 0x7f; dis_smg[2] = smg_du[t_low / 100 % 10] ; dis_smg[3] = 0xc7; //L } if(key_can == 1) { if(flag_lj_3_en == 0) t_low -- ; else t_low -= 10; if(t_low &= 10) t_low = 10; dis_smg[0] = smg_du[t_low % 10]; dis_smg[1] = smg_du[t_low / 10 % 10] & 0x7f; dis_smg[2] = smg_du[t_low / 100 % 10] ; dis_smg[3] = 0xc7; //L } // write_eepom(); } } /****************报警函数***************/ void clock_h_l() { if((temperature &= t_low) || (temperature &= t_high)) { flag_clock = 1; } else { //取小数显示 //取个位显示 //取十位显示 //取小数显示 //取个位显示 //取十位显示
flag_clock = 0; beep = 1; } } void main() { temperature = read_temp(); //先读出温度的值 time_init(); //初始化定时器 read_eepom(); if(a_a == 0xff) //新的单片机初始单片机内问 EEPOM { t_high = 300; t_low = 100; a_a = 1; write_eepom(); } delay_1ms(650); temperature = read_temp(); //先读出温度的值 dis_smg[0] = smg_du[temperature % 10]; //取温度的小数显示 dis_smg[1] = smg_du[temperature / 10 % 10] & 0x7f; //取温度的个位显示 dis_smg[2] = smg_du[temperature / 100 % 10] ; //取温度的十位显示 while(1) { display(); //显示函数 key(); //按键程序 if(key_can & 10) { key_with(); //设置报警温度 } temperature = read_temp(); //先读出温度的值 if(flag_300ms == 1) //300ms 处理一次温度程序 { clock_h_l(); //报警函数 if(flag_clock == 1) beep = ~ flag_300ms = 0; if(menu_1 == 0) { smg_i = 3; dis_smg[0] = smg_du[temperature % 10]; //取温度的小数显示 dis_smg[1] = smg_du[temperature / 10 % 10] & 0x7f; //取温度的个位显示 dis_smg[2] = smg_du[temperature / 100 % 10] ; //取温度的十位显示 } if(zd_break_en == 1) //自动退出设置界面程序
{ zd_break_value ++; //每 300ms 加一次 if(zd_break_value & 50) //15 秒后自动退出设置界面 { menu_1 = 0; zd_break_en = 0; zd_break_value = 0; } } } } } /*************定时器 0 中断服务程序***************/ void time0_int() interrupt 1 { TH0 = 0x3c; TL0 = 0xb0; // 50ms value ++; if(value % 6 == 0) { flag_300ms = 1; //300ms value = 0; } if(flag_lj_en == 1) //按下按键使能 { key_time ++; if(key_time &= 10) //500ms { key_time = 0; key_500ms = 1; //500ms flag_value ++; if(flag_value & 3) { flag_value = 10; flag_lj_3_en = 1; //3 次后 1.5 秒连加大些 } } } }
感觉不错的话,微信扫一扫关注官方微信公众账号,以后找资料更方便
是互联网分享学习的开放平台,汇集亿份高价值的文档资料,涵盖档下载,程序开发文档,教育文档,医药文档,办公文档,考试文档,营销文档,工程文档,分享文档等行业。为您提供愉悦的分享学习体验。
单片机课程设计温度报警系统源程序
你可以免费下载该文档
没满足你的要求? 查找更多相关内容基于单片机的烟雾火灾报警器毕业设计论文.doc -max上传文档投稿赚钱-文档C2C交易模式-100%分成比例文档分享网
基于单片机的烟雾火灾报警器毕业设计论文.doc
文档名称:基于单片机的烟雾火灾报警器毕业设计论文.doc
格式:doc&&&大小:2.23MB&&&总页数:44
可免费阅读页数:44页
下载源文档需要:40元人民币
预览与实际下载的一致,文档内容不会超过预览的范围,下载前请务必先预览,自行甄别内容是否完整、是否存在文不对题等情况(本网站为文档分享平台性质),一旦付费下载,本站不支持退款
我已知晓:实际下载内容以预览为准!
文档介绍:湖南科技职业学院毕业设计题目:基于单片机的烟雾火灾报警器专业:应用电子技术班级:应用电子3111班学号:11座机电话号码37作者:胡博文指导教师:彭劲松湖南科技职业学院电子信息工程与技术系二零一四年五月目录摘要3Abstract41绪论51.1课题背景51.2设计概述51.3烟雾报警器的国内外现状61.4烟雾报警器的发展趋势71.5设计任务分析72总体方案设计72.1烟雾检测传感器选型82.2.1烟雾传感器的介绍92.2.2MQ-2半导体气体烟雾传感器122.2单片机选型132.2.1STC89C52单片机简介132.2.2单片机的引脚功能描述142.1.3温度采集模块153系统的硬件电路163.1单片机最小系统163.2单片机的时钟电路与复位电路设计173.3烟雾检测AD采集电路173.4显示模块183.5声音报警电路183.6按键控制电路193.7电源模块193.8温度传感器DS18B20电路203.8.1DSl8B20简介203.8.2DSl8B20工作方式223.8.318B20接口电路234系统软件的设计244.1系统主程序设计及流程图245硬件调试及调试中遇到的问题256电路的调试257总结评价25致谢26参考文献27附件一:总体原理图设计28附件二:部分程序源代码29附件三:实物图43摘要随着社会和经济的发展,防火工作越来越重要,但是目前国内的许多研发都侧重于大型场所的火灾报警。因此,我们就有必要研制一种结构简单、经济实用的家庭烟雾报警器以适应市场的需求。基于供家庭使用的烟雾报警器应该具备的基本要求和功能,文章设计了一种比较适合的烟雾报警器。本设计以传感器和单片机作为烟雾报警器设计的核心器件,配合其它器件即可实现声光报警、自动排烟换气和消防灭火等功能。设计中单片机选用STC89C52作为控制器件,传感器选用MQ-2型半导体可燃气体敏感元件烟雾传感器实现烟雾的检SectorErase(0x2000);;byte_write(0x2000,bj_shu;byte_write(0x2001,bj_shu;byte_write(0x2002,zong_l;byte_write(0x2003,zong_l;byte_write(0x2004,zong_l;byte_write(0x2055,a_a);};/********
SectorErase(0x2000);
byte_write(0x2000, bj_shudu % 256);
byte_write(0x2001, bj_shudu / 256);
byte_write(0x2002, zong_lc % 256);
byte_write(0x2003, zong_lc / 256 % 256);
byte_write(0x2004, zong_lc / 256 / 256 % 256);
byte_write(0x2055, a_a);
/******************把数据从单片机内部eepom中读出来*****************/ void read_eeprom() {
= byte_read(0x2001);
bj_shudu &&= 8;
|= byte_read(0x2000);
= byte_read(0x2004);
zong_lc &&= 16;
= byte_read(0x2003);
zong_lc |= (value && 8);
|= byte_read(0x2002);
= byte_read(0x2055); }
/**************开机初始化保存的数据*****************/
void init_eeprom()
//开机初始化保存的数据* {
read_eeprom();
if(a_a != 1)
//新的单片机初始单片机内问eeprom
bj_shudu = 50;
write_eeprom();
//保存数据
/******************************************************************** * 名称 : delay_uint() * 功能 : 小延时。 * 输入 : 无 * 输出 : 无
***********************************************************************/ void delay_uint(uint q) {
while(q--); }
/******************************************************************** * 名称 : write_com(uchar com) * 功能 : 1602命令函数 * 输入 : 输入的命令值 * 输出 : 无
***********************************************************************/ void write_com(uchar com) {
delay_uint(3);
delay_uint(25);
/******************************************************************** * 名称 : write_data(uchar dat) * 功能 : 1602写数据函数
* 输入 : 需要写入1602的数据 * 输出 : 无
***********************************************************************/ void write_data(uchar dat) {
delay_uint(3);
delay_uint(25);
/******************************************************************** * 名称 : write_sfm2(uchar hang,uchar add,uchar date)
* 功能 : 显示2位十进制数,如果要让第一行,第五个字符开始显示&23& ,调用该函数如下
write_sfm1(1,5,23)
* 输入 : 行,列,需要输入1602的数据 * 输出 : 无
***********************************************************************/ void write_sfm2(uchar hang,uchar add,uint date) {
if(hang==1)
write_com(0x80+add);
write_com(0x80+0x40+add);
write_data(0x30+date/10%10);
write_data(0x30+date%10);
/******************************************************************** * 名称 : write_sfm4(uchar hang,uchar add,uchar date)
* 功能 : 显示2位十进制数,如果要让第一行,第五个字符开始显示&23& ,调用该函数如下
write_sfm1(1,5,23)
* 输入 : 行,列,需要输入1602的数据 * 输出 : 无
***********************************************************************/ void write_sfm4(uchar hang,uchar add,uint date) {
if(hang==1)
write_com(0x80+add);
write_com(0x80+0x40+add);
write_data(0x30+date/10000%10);
write_data(0x30+date/1000%10);
write_data('.');
write_data(0x30+date/100%10);
write_data(0x30+date/10%10);
write_data(0x30+date%10);
write_data('k');
write_data('m');
void write_sfm7(uchar hang,uchar add,uint date) {
if(hang==1)
write_com(0x80+add);
write_com(0x80+0x40+add);
write_data(0x30+date/);
write_data(0x30+date/);
write_data(0x30+date/10000%10);
write_data(0x30+date/1000%10);
write_data('.');
write_data(0x30+date/100%10);
write_data(0x30+date/10%10);
write_data('k');
write_data('m');
/***********************lcd1602上显示两位十进制数************************/
void write_sfm1(uchar hang,uchar add,uchar date) {
if(hang==1)
write_com(0x80+add);
write_com(0x80+0x40+add);
write_data(0x30+date % 10);
/******************************************************************** * 名称 : write_string(uchar hang,uchar add,uchar *p) * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示&ab cd ef& ,调用该函数如下
write_string(1,5,&&)
* 输入 : 行,列,需要输入1602的数据 * 输出 : 无
***********************************************************************/ void write_string(uchar hang,uchar add,uchar *p) {
if(hang==1)
write_com(0x80+add);
write_com(0x80+0x40+add);
if(*p == '\0')
write_data(*p);
/***********************lcd1602上显示两位十进制数************************/ void write_sfm2_ds1302(uchar hang,uchar add,uchar date)
if(hang==1)
write_com(0x80+add);
write_com(0x80+0x40+add);
write_data(table_num[date / 16]);
write_data(table_num[date % 16]);
/*****************控制光标函数********************/
void write_guanbiao(uchar hang,uchar add,uchar date) {
if(hang==1)
write_com(0x80+add);
write_com(0x80+0x40+add);
if(date == 1)
write_com(0x0f);
//显示光标并且闪烁
write_com(0x0c);
//关闭光标 }
/******************************************************************** * 名称 : init_1602()
* 功能 : 初始化1602液晶
* 输入 : 无 * 输出 : 无
***********************************************************************/ void init_1602()
//1602初始化 {
write_com(0x38);
write_com(0x0c);
write_com(0x06);
delay_uint(1000);
write_string(1,0,&sd:00km/h
write_string(2,0,&lc:00.00km
/*************写一个数据到对应的地址里***************/
void write_ds1302(uchar add,uchar dat) {
//把复位线拿高
for(i=0;i&8;i++)
//低位在前
//时钟线拿低开始写数据
io = add & 0x01;
add &&= 1;
//把地址右移一位
//时钟线拿高
for(i=0;i&8;i++)
//时钟线拿低开始写数据
io = dat & 0x01;
dat &&= 1;
//把数据右移一位
//时钟线拿高
//复位线合低
/*************从对应的地址读一个数据出来***************/ uchar read_ds1302(uchar add) {
uchar value,i;
//把复位线拿高
for(i=0;i&8;i++)
//低位在前
//时钟线拿低开始写数据
io = add & 0x01;
add &&= 1;
//把地址右移一位
//时钟线拿高
for(i=0;i&8;i++)
//时钟线拿低开始读数据
value &&= 1;
if(io == 1)
value |= 0x80;
//时钟线拿高
//复位线合低
//返回读出来的数据 }
/*************把要的时间 年月日 都读出来***************/ void read_time() {
miao = read_ds1302(read_add[0]); //读秒
= read_ds1302(read_add[1]); //读分
= read_ds1302(read_add[2]);
= read_ds1302(read_add[3]); //读日
= read_ds1302(read_add[4]); //读月
nian = read_ds1302(read_add[5]); //读年
week = read_ds1302(read_add[6]); //读星期 }
/*************把要写的时间 年月日 都写入ds1302里***************/ void write_time() {
write_dse,0x00);
//打开写保护
write_ds1302(write_add[0],miao); //写秒
write_ds1302(write_add[1],fen);
write_ds1302(write_add[2],shi);
write_ds1302(write_add[3],ri);
write_ds1302(write_add[4],yue);
write_ds1302(write_add[5],nian); //写星期
write_ds1302(write_add[6],week); //写年
write_dse,0x80);
//关闭写保护 }
/*************把数据保存到ds1302 RAM中**0-31*************/
void write_ds1302ram(uchar add,uchar dat) {
add &&= 1;
//地址是从第二位开始的
//把最低位清零
是写的命令
add |= 0xc0;
//地址最高两位为 1
write_dse,0x00);
write_ds1302(add,dat);
write_dse,0x80); }
/*************把数据从ds1302 RAM读出来**0-31*************/
uchar read_ds1302ram(uchar add) {
add &&= 1;
//地址是从第二位开始的
add |= 0x01;
//把最高位置1
add |= 0xc0;
//地址最高两位为 1
return(read_ds1302(add));
/*************初始化ds1302时间***************/ void init_ds1302() {
rst = 0; //第一次读写数据时要把IO品拿低
i = read_ds1302ram(30);
if(i != 3)
write_ds1302ram(30,i);
write_dse,0x00);
//打开写保护
for(i=0;i&7;i++)
write_ds1302(write_add[i],init_ds[i]); //把最高位值0 允许ds1302工作
write_dse,0x80); //关写保护
三亿文库包含各类专业文献、行业资料、幼儿教育、小学教育、中学教育、各类资格考试、专业论文、高等教育、自行车简易数字里程表设计毕业设计论文52等内容。 
 * * 学院 本科毕业设计自行车简易数字里程表的设计 所专 在业 学名 院称 机械与工程学院 机械设计制造及其自动化 工学 二一二级 申请学士学位所属学科 年级...  自行车里程表的设计毕业设计论文_工学_高等教育_教育专区。课程 题目 单片机原理及应用课程设计 自行车里程表的设计 主要内容、基本要求、主要参考资料等 1、主要内容...  毕业设计(论文)开题报告 学生姓名: 专业: 卢超 学号: 0 智能科学与技术 自行车里程表设计 设计(论文)题目: 指导教师: 辛红伟 2013 年 4 月 6 日 ...  毕业设计 题目: 自行车里程表设计 毕业设计(论文)原创性声明和使用授权说明 原创性声明 本人郑重承诺:所呈交的毕业设计(论文) ,是我个人在指导教 师的指导下进行...  -2- 河北工程大学毕业设计论文 2.3 系统设计技术指标计数方式:十进制 里程显示位数:4 位 速度显示位数:2 位 3 自行车数字里程表硬件设计 3.1 概述自行车数字...  光电式自行车速度里程表设计,毕业论文_信息与通信_工程科技_专业资料。光电式速度里程表设计 光电式自行车速度里程表设计 摘要随着科技的迅速发展,单片机的应用也越来越...  科学、美观、合理设计自行车里程表有一定的 实用价值...36 IV 河南科技大学本科毕业设计(论文) 前 言 ...数字存储电 路 单片机 键盘 控制 LCD 显示 图 2-...  毕业论文(设计)题目:基于单片机的自行车速度及里程表设计 系部名称: 学生姓名: 指导教师: 信息工程系 曹康 姜宏伟 专业班级: 学 电气 102 号:
副...  学号: 毕业设计说明书 GRADUATE DESIGN 设计...本论文主要阐述一种基于霍尔 元件的自行车的速度里程...现在国外很多车中使用了数字里程表,但在国内还并不...C51: 向24C02,写入n个数据,再读出n 个数据
09:07:51来源: eefocus
//函数功能,
//写入n个数据,再读出n 个数据。用LCD 显示。
//变量声明
#define uchar unsigned char
#define uint unsigned int
//延时 1ms
void delayms()
&for(i=0;i<250;i++);
&for(i=0;i<80;i++);
void delaynms(uint s)
&for(tem=0;tem<s;tem++)
&&delayms();
//LCD 忙碌查询
sbit LCDbusy=P1^7;
//LCD 操作位 设置
sbit RS=P3^2;
sbit RW=P3^1;
sbit E=P3^0;
sbit BF=P1^7;
//------& LCD 程序 ----
//读LCD 状态
uchar BusyTest()
&//读LCD 状态
&result=BF;
//写 LCD 指令
void WriteInstruction(uchar instruction)
&//LCD 忙碌,等待。
&while(BusyTest()==1);
&_nop_();&& //要求
//初始化 LCD
void InitLCD()
&delaynms(15);&
&WriteInstruction(0x38);//& 显示模式设置
&delaynms(5);
&WriteInstruction(0x38);
&delaynms(5);
&WriteInstruction(0x38);
&delaynms(5);
&WriteInstruction(0x0d);//显示模式设置: 开显示,不显示光标,闪烁光标
&delaynms(5);
&WriteInstruction(0x06);//显示模式设置: 光标右移,文字不移动。
&delaynms(5);
//写LCD 数据
void WriteData(uchar d)
&&//LCD 忙碌,等待。
&while(BusyTest()==1);
//写地址,属于写指令
void WriteAdd(uchar ad)
&uchar addr=ad+0x80;
&WriteInstruction(addr);
sbit SDA=P2^0;&&&&&&&&& //数据SDA位定义在P2^0引脚
sbit SCL=P2^1;&&&&&&&& //时钟总线SCL位定义在P2^1引脚&&&&
&//定义写入器件,寻址地址
& // 定义读出器件,寻址地址
//函数功能:开始数据传送&&
void start()
&SDA = 1;&&& //SDA初始化为高电平&1&
&& SCL = 1;&&& //开始数据传送时,要求SCL为高电平&1&
&_nop_();&&& //等待一个机器周期
&_nop_();&&& //等待一个机器周期
&_nop_();&&& //等待一个机器周期
&_nop_();&&& //等待一个机器周期
&SDA = 0;&&& //SDA的下降沿被认为是开始信号
&_nop_();&&& //等待一个机器周期
&_nop_();&&& //等待一个机器周期
&_nop_();&&& //等待一个机器周期
&_nop_();&&& //等待一个机器周期
&SCL = 0;&&& //SCL为低电平时,SDA上数据才允许变化(即允许以后的数据传递)&&
//函数功能:结束数据传送&
void stop()
&SDA = 0;&&&& //SDA初始化为低电平&0&&_n
&SCL = 1;&&&& //结束数据传送时,要求SCL为高电平&1&
&_nop_();&&&& //等待一个机器周期
&_nop_();&&&& //等待一个机器周期
&_nop_();&&&& //等待一个机器周期
&_nop_();&&&& //等待一个机器周期
&SDA = 1;&&& //SDA的上升沿被认为是结束信号
&_nop_();&&&& //等待一个机器周期
&_nop_();&&&& //等待一个机器周期
&_nop_();&&&& //等待一个机器周期
&_nop_();&&&& //等待一个机器周期
}&&&&&&&&&
//应答检查
bit testack()
&SDA = 1;&&&& // 发送设备(主机)应在时钟脉冲的高电平期间(SCL=1)释放SDA线,
&&&&&&&&&&&&&&&& //以让SDA线转由接收设备(AT24Cxx)控制
&_nop_();&&&&&&& //等待一个机器周期&
&_nop_();&&&&&&& //等待一个机器周期&
&SCL = 1;&&&&&& //根据上述规定,SCL应为高电平
&_nop_();&&&&&& //等待一个机器周期&
&_nop_();&&&&&& //等待一个机器周期&
&_nop_();&&&&&& //等待一个机器周期&
&_nop_();&&&&&& //等待一个机器周期&
&ack_bit = SDA; //接受设备(AT24Cxx)向SDA送低电平,表示已经接收到一个字节
&&&&&&&&&&&&&&& //若送高电平,表示没有接收到,传送异常
&SCL = 0;&&&&&& //SCL为低电平时,SDA上数据才允许变化(即允许以后的数据传递)
&return& ack_&
&_nop_();&
void noack()
//函数功能:从AT24Cxx读取一个字节
unsigned char ReadData()
&&& //储存从AT24Cxx中读出的数据
&for(i = 0; i < 8; i++)
&&SCL = 1;&&&&&&&&&&&&&&& //SCL置为高电平
&&x<<=1;&&&&&&&&&&&&&&&&& //将x中的各二进位向左移一位
&&x|=(unsigned char)SDA;& //将SDA上的数据通过按位&或&运算存入x中
&&SCL = 0;&&&&&&&&&&&&&&&&&&&&&&& //在SCL的下降沿读出数据
&return(x);&&&&&&&&&&&&&&& //将读取的数据返回
//写入一个字节
void& WriteCurrent(unsigned char y)
&&& for(i = 0; i < 8; i++)&&// 循环移入8个位
&&& &SDA = (bit)(y&0x80);&& //通过按位&与&运算将最高位数据送到S
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //因为传送时高位在前,低位在后
&&_nop_();&&&&&&&&&&& //等待一个机器周期&&&
&&& SCL = 1;&&&&&&&&&&& //在SCL的上升沿将数据写入AT24Cxx&&&&&&
&& &_nop_();&&&&&&&&&&& //等待一个机器周期&
&& _nop_();&&&&&&&&&&&& //等待一个机器周期&&&&&&&
&& &SCL = 0;&&&&&&&&&&& //将SCL重新置为低电平,以在SCL线形成传送数据所需的8个脉冲
&&y <<= 1;&&&&&&&&&& //将y中的各二进位向左移一位
//在器件指定地址 写 n 个字节
//参数(数据地址,器件内存地址 ,写字节数)
void writeI2C(uchar *wdata,uchar add,uchar bytes)
&start();&&&&&&&&&&&&&& //开始数据传递
&WriteCurrent(wdeviceadd);& //选择要操作的AT24Cxx芯片,并告知要对其写入数据
&testack();
&WriteCurrent(add);&&&&&& //写入指定地址0x36
&testack();
&//进入循环
&for(;bytes!=0;bytes--)
&&WriteCurrent(*wdata);&&&&&& //向当前地址(上面指定的地址)写入数据 0x00&
&&testack();& //应答检查
&&wdata++;
&stop();&&&&&&&&&&&&&&& //停止数据传递
&delaynms(4);
//在器件指定地址 读出 n 个字节
//参数(接收读出数据缓存地址,读数据器件内存地址 ,读出字节数)
void readI2C(uchar *rdata,uchar add,uchar bytes)
&/*读出数据
&启动-写芯片寻址-应答检查-写数据首址-应答检查- 进入读数据程序段 */
&start();&&&&&&&&&&&&&&&&&&&&&&
&WriteCurrent(wdeviceadd);&&&&&& //选择要操作的AT24Cxx芯片,并告知要对其写入数据
&testack();
&WriteCurrent(add);&&&&&& //读出数据地址
&testack();
&/*读数据程序段流程:
&启动-写芯片寻址-应答检查- 进入读数据程序段*/ &
&start();&&&&&&&&&&&&&&
&WriteCurrent(rdeviceadd);&& //选择要操作的AT24Cxx芯片,并告知要读其数据
&testack();
&/*读数据程序段
&条件判断-读数据-应答-指针操作-循环,
&最后一个字节退出循环-读最后一个字节-非应答-停止& */&
&while(bytes!=1)
&&*rdata=ReadData();&
&&ack();& //应答
&&rdata++;
&&bytes--;
&*rdata=ReadData();&&& //读出最后一个字节&&&&
&noack();&&&&& //最后一个数据& 非应答&&
&stop();&&&&&&&&&&&&&&& //停止数据传递
//main 程序
void main()&
&&& //将此字符串存入24C02,再读出。
&uchar str[14]="this is a 2402" ;
&uchar *p;
&//读出缓存
&uchar readbuf[50];
&//定义器件地址
&wdeviceadd=0xa0;&//写入器件,寻址地址
&rdeviceadd=0xa1;& // 读出器件,寻址地址
&writeI2C(str,0x00,14);
&readI2C(readbuf,0x00,14);
&//初始化LCD
&InitLCD();
&WriteAdd(0x00);&&&&&&&&&&&
&while(*p!=&#39;\0&#39;)
&&WriteData(*p);
&delaynms(1000);
关键字:&&
编辑:什么鱼
引用地址:
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。
微信扫一扫加关注 论坛活动 E手掌握
微信扫一扫加关注
芯片资讯 锐利解读
大学堂最新课程
汇总了TI汽车信息娱乐系统方案、优质音频解决方案、汽车娱乐系统和仪表盘参考设计相关的文档、视频等资源
热门资源推荐
频道白皮书
何立民专栏
北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

我要回帖

更多关于 单片机数据类型 的文章

 

随机推荐