80C51单片机程序实例

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

uchar read_byte()//读出一个字节数据 { uchar i,j,k; scl=0; delay(); sda=1; delay(); for(i=0;i<8;i++) { scl=1; delay(); j=sda;//每次将 SDA 的二进制值赋给 j k=(k<<1)|j;//j 和 K(值为 0)的最低位相或运算,即 k 的最低位记录了 j 的值,并且依次 向左移位 scl=0; delay(); } return k;//返回 8 位的 k 值 } void main() { scl=1; sda=1; start();//开始输出写入数值 write_byte(0xA0);//定位所要通信的从机,最后一位表示要对其写入数据 ans(); write_byte(3);//定位从机中需要写入数据的存储器(一个从机中有多个存储器) ans(); write_byte(0x6f);//正式写入一串 8 位数据 ans(); stop();//对从机的写数据操作完成 delay1(100);//等待从机将数据保存完毕 start();//开始对从机进行读取数据操作 write_byte(0xA0);//定位从机 ans(); write_byte(3);//定位存储器 ans(); start();//正式开始 write_byte(0xA1);//再次定位存储器,最后一位表示要读取数据
80C52 单片机程序实例
以下 80C52 单片机程序是我在大学期间自学郭天祥老师的《十天征服单片机》时所写的, 代码都附有注释,都实际下载运行过,希望对有望成为电子工程师的同学有所帮助。
******************************************* EEPROM 写入并读取一个数(I2C) ******************************************* #include<reg52.h> #define uint unsigned int #define uchar unsigned char int code duan[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; int wei[8]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07}; sbit scl=P1^5; sbit sda=P3^6; delay()//短时间延时函数 {;;} delay1(uint z)//延时函数 { uint x,y; for(x=0;x<z;x++) for(y=110;y>0;y--); } void start()//通信起始函数 { sda=1; delay(); scl=1; delay(); sda=0; delay(); } void stop()//通信结束函数
{ sda=0; delay(); scl=1; delay(); sda=1; delay(); } void ans()//接收方应答函数 { uchar i; scl=1; delay(); while((sda=1)&&(i<250))i++; scl=0; delay(); } void write_byte(uchar date)//写入一个字节数据 { uchar i,temp; temp=date; for(i=0;i<8;i++) { temp=temp<<1;//temp 每次向左一位,最高位溢出保存到 CY 中 scl=0; delay(); sda=CY;//SDA 以 temp 的最高位为起始值分八次输出 delay(); scl=1; delay(); scl=0; delay(); } sda=1; delay(); scl=1; delay(); }
ans(); P0=read_byte();//对返回的数值进行操作 P2=wei[1]; stop();//停止读取数据 while(1); }
Leabharlann Baidu
******************************************* 0 到 99 计数 ******************************************* #include<reg52.h> #define uint unsigned int #define uchar unsigned char int code duan[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; int wei[8]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07}; uchar tt,i; void delay(uint z)//延时函数 { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void main() { TMOD=0x01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1; ET0=1; TR0=1; while(1) { for(i=0;i<100;) { P0=duan[i%10]; P2=wei[1]; delay(5); P0=0;
void write_com(uchar com)//写指令 { rs=0; P0=com; delay(1); en=1; delay(1); en=0; } void write_date(uchar date)//写数据 { rs=1; P0=date; delay(1); en=1; delay(1); en=0; } void write_sfm(uchar add,uchar date)//在指定位置显示指定的数 { uchar shi,ge; shi=date/10; ge=date%10; write_com(0x80+0x40+add); write_date(0x30+shi); write_date(0x30+ge); } void init()//初始化函数 { rw=0; en=0; write_com(0x38);//设置 16×2 显示,5×7 点阵,8 位数据接口 write_com(0x0c);//开显示,不显示光标,光标不闪烁 write_com(0x06);//写一个字符后地址指针加 1,写字符时整屏不左移 write_com(0x01);//显示清屏 write_com(0x80);//设置数据地址指针为第一行第 16 排 for(num=0;num<14;num++) { write_date(table[num]); delay(1);
void dsreset() //初始化 18B20 { uint i; sin=0; i=103; while(i>0)i--; sin=1; i=4; while(i>0)i--; } bit temread() //接收读取一位数据 { uint i; bit dat; sin=0; i++; sin=1; i++;i++; dat=sin; i=8; while(i>0)i--; return(dat); } uchar temread2() //接收读取一个字节数据 { uchar i,j,dat; dat=0; for(i=1;i<=8;i++) { j=temread(); dat=(j<<7)|(dat>>1); } return(dat); } void temwrite(uchar dat) //发送写入一个字节数据 { uint i; uchar j; bit testb; for(j=1;j<=8;j++) {
} write_com(0x80+0x40); for(num=0;num<12;num++) { write_date(table1[num]); delay(1); } TMOD=0x01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1; ET0=1; TR0=1; } void scan() { if(s17==0) { delay(5); if(s17==0) { while(!s17); TR0=0; scannum++; if(scannum==1) { write_com(0x0f); write_com(0x80+0x40+10); } if(scannum==2) { write_com(0x80+0x40+7); } if(scannum==3) { write_com(0x80+0x40+4); } if(scannum==4) {
P2=wei[0]; P0=duan[i/10]; delay(5); if(TF0) { tt++; if(tt==20) { tt=0; i++; } TF0=0; TH0=(65536-50000)/256; TL0=(65536-50000)%256; } } } }
******************************************* 18B20 温度测量 ******************************************* #include<reg52.h> #define uint unsigned int #define uchar unsigned char int code duan[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; int wei[8]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07}; sbit sin=P2^3; uchar temp; uchar flag1; void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); }
{ temp=a; } } void main() { while(1) { temchange(); delay(200); tem(); } }
******************************************* 1602 液晶时钟(键盘可调) ******************************************* #include<reg52.h> #define uchar unsigned char #define uint unsigned int uchar code table[]=" 2012-5-2 WED"; uchar code table1[]=" 00:00:00"; sbit rs=P2^5; sbit rw=P2^6; sbit en=P2^7; sbit s17=P3^4; sbit s18=P3^3; sbit s19=P3^2; uchar num,tt,scannum; char miao,fen,shi; void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=100;y>0;y--); }
testb=dat&0x01; dat=dat>>1; if(testb) { sin=0; i++;i++; sin=1; i=8; while(i>0)i--; } else { sin=0; i=8; while(i>0)i--; sin=1; i++;i++; } } } void temchange()//开始温度转换 { dsreset(); delay(1); temwrite(0xcc); temwrite(0x44); } void tem() //读取温度 { uchar a,b; dsreset(); delay(1); temwrite(0xcc); temwrite(0xbe); a=temread2(); b=temread2(); flag1=b; if(flag1) { temp=~a+1; } else
相关文档
最新文档