为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

虚拟单片机实验系统的开发程序代码_毕业论文_附录

2020-03-09 50页 doc 167KB 4阅读

用户头像

is_321635

暂无简介

举报
虚拟单片机实验系统的开发程序代码_毕业论文_附录附录 1.LED流水灯电路的C语言程序 //flow light and beep 流水灯从上到下流一遍,蜂鸣器发出“嘟嘟”的声音 #include #include unsigned char a,b,k,j; sbit beep=P2^3; void delay10ms() { for(a=100;a>0;a--) for(b=225;b>0;b--); } void main() { k=0xfe; while(1) { delay10ms(); beep=0; delay10...
虚拟单片机实验系统的开发程序代码_毕业论文_附录
附录 1.LED流水灯电路的C语言程序 //flow light and beep 流水灯从上到下流一遍,蜂鸣器发出“嘟嘟”的声音 #include #include unsigned char a,b,k,j; sbit beep=P2^3; void delay10ms() { for(a=100;a>0;a--) for(b=225;b>0;b--); } void main() { k=0xfe; while(1) { delay10ms(); beep=0; delay10ms(); beep=1; j=_crol_(k,1); k=j; P1=j; } } 2.LCD字符显示电路C语言程序 /************************************************************ 程序功能:敲入式地显示一段语句,由于语句超过了16*2个字节,故采取了分屏显示的方式,共分为六屏先后显示。 ************************************************************/ #include #define uchar unsigned char #define uint unsigned int sbit beep=P2^3; uchar code table []="I want to bring "; uchar code table1[]="out the secret "; uchar code table2[]="of nature and "; uchar code table3[]="apply them for "; uchar code table4[]="the happiness of"; uchar code table5[]="man.I don't know"; uchar code table6[]="of any better s-"; uchar code table7[]="-ervice to offer"; uchar code table8[]="for the short t-"; uchar code table9[]="-ime we are in "; uchar code table10[]="the world. "; uchar code table11[]="---Thomas Edison"; sbit lcden=P3^4; sbit lcdrs=P3^5; sbit dula=P2^6; sbit wela=P2^7; uchar num; void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void write_com(uchar com) { lcdrs=0; P0=com; delay(5); lcden=1; delay(5); lcden=0; } void write_data(uchar date) { lcdrs=1; P0=date; delay(5); lcden=1; delay(5); lcden=0; } void init() { dula=0; wela=0; lcden=0; write_com(0x38); write_com(0x0e); write_com(0x06); write_com(0x01); write_com(0x80); } void main() { init(); for(num=0;num<16;num++) //第一屏{ beep=0; write_data(table[num]); delay(100); beep=1; delay(50); } write_com(0x80+0x40); for(num=0;num<16;num++) { beep=0; write_data(table1[num]); delay(100); beep=1; delay(50); } write_com(0x01); //清屏 write_com(0x80); //设置字符显示位置指针于第一行for(num=0;num<16;num++) // 第二屏 { beep=0; write_data(table2[num]); delay(100); beep=1; delay(50); } write_com(0x80+0x40); //设置字符显示位置指针于第二行for(num=0;num<16;num++) { beep=0; write_data(table3[num]); delay(100); beep=1; delay(50); } write_com(0x80); write_com(0x01); for(num=0;num<16;num++) //第三屏 { beep=0; write_data(table4[num]); delay(100); beep=1; delay(50); } write_com(0x80+0x40); for(num=0;num<16;num++) { beep=0; write_data(table5[num]); delay(100); beep=1; delay(50); } write_com(0x01); write_com(0x80); for(num=0;num<16;num++) //第四屏{ beep=0; write_data(table6[num]); delay(100); beep=1; delay(50); } write_com(0x80+0x40); for(num=0;num<16;num++) { beep=0; write_data(table7[num]); delay(100); beep=1; delay(50); } write_com(0x01); write_com(0x80); for(num=0;num<16;num++) //第五屏{ beep=0; write_data(table8[num]); delay(100); beep=1; delay(50); } write_com(0x80+0x40); for(num=0;num<16;num++) { beep=0; write_data(table9[num]); delay(100); beep=1; delay(50); } write_com(0x01); write_com(0x80); for(num=0;num<16;num++) //第六屏{ beep=0; write_data(table10[num]); delay(100); beep=1; delay(50); } write_com(0x80+0x40); for(num=0;num<16;num++) { beep=0; write_data(table11[num]); delay(100); beep=1; delay(50); } while(1); } 3.数码管动态扫描电路C语言程序 #include #include #define uint unsigned int #define uchar unsigned char uchar temp,aa,num; sbit dula=P2^6; sbit wela=P2^7; uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; void delay(uint z); void main() { num=0; aa=0; TMOD=0x01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1; ET0=1; TR0=1; temp=0xfe; P1=temp; dula=1; P0=table[0]; dula=0; wela=1; P0=0xc0; wela=0; while(1) { delay(1000); temp=_crol_(temp,1); P1=temp; /* if(aa==40) { aa=0; num++; if(num==16) num=0; dula=1; P0=table[num]; dula=0; } */ } } void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void timer0() interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; aa++; if(aa==40) { aa=0; num++; if(num==16) num=0; dula=1; P0=table[num]; dula=0; } } 4.单键识别电路C语言程序 /*************************************************************** 程序功能:生活中常见一个按键随着按下次数不同对应不同功能, 本程序以s2键为例,模拟其具有2种功能, 一是点亮一个发光二极管,二是蜂鸣器发声 ******************************************************************/ #include #define uchar unsigned char uchar num; sbit beep=P2^3; sbit led=P1^0; sbit s2=P3^4; void delay(uchar i) { uchar j,k; for(j=i;j>0;j--) for(k=125;k>0;k--); } void main() { while(1) { if(s2==0) { delay(20); //消抖 if(s2==20) { while(!s2); //等待按键松开 num++; } switch(num) { case 1: led=0; beep=1; break; case 2: beep=0; led=1; num=0; break; } } } } 5.矩阵键盘电路C语言程序 //4*4键盘检测程序,按下键后相应的代码显示在数码管上 #include sbit beep=P2^3; sbit dula=P2^6; sbit wela=P2^7; unsigned char i=100; unsigned char j,k,temp,key; void delay(unsigned char i) { for(j=i;j>0;j--) for(k=125;k>0;k--); } unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; void display(unsigned char num) { P0=table[num]; // P0=0xff; dula=1; dula=0; P0=0xc0; wela=1; wela=0; } void main() { dula=0; wela=0; while(1) { P3=0xfe; temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delay(10); if(temp!=0xf0) { temp=P3; switch(temp) { case 0xee: key=0; break; case 0xde: key=1; break; case 0xbe: key=2; break; case 0x7e: key=3; break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; beep=0; } beep=1; display(key); // P0=table[key]; /* P0=0xff; dula=1; dula=0; P0=0xc0; wela=1; wela=0; dula=0; wela=0; P0=0xff; dula=1; dula=0; P0=0xc5; wela=1; wela=0; */ P1=0xfe; } } P3=0xfd; temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delay(10); if(temp!=0xf0) { temp=P3; switch(temp) { case 0xed: key=4; break; case 0xdd: key=5; break; key=6; break; case 0x7d: key=7; break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; beep=0; } beep=1; display(key); /* P0=table[key]; dula=1; // while(100--); dula=0; P0=0xc0; wela=1; wela=0; */ P1=0xfc; } } P3=0xfb; temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delay(10); if(temp!=0xf0) { temp=P3; switch(temp) { case 0xeb: key=8; break; case 0xdb: key=9; break; case 0xbb: key=10; break; case 0x7b: key=11; break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; beep=0; } beep=1; display(key); /* P0=table[key]; dula=1; // while(100--); dula=0; P0=0xc0; wela=1; wela=0; */ P1=0xf8; } } P3=0xf7; temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delay(10); if(temp!=0xf0) { temp=P3; switch(temp) { case 0xe7: key=12; break; case 0xd7: key=13; break; case 0xb7: key=14; break; case 0x77: key=15; break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; beep=0; } beep=1; display(key); /* P0=table[key]; dula=1; // while(100--); dula=0; P0=0xc0; wela=1; wela=0; */ P1=0xf0; } } } } 6.AD转换电路C语言程序 //拧动电位器,会在数码管的前三位显示0-255之间的数值。这就是把模拟电压转换成数字信号。 //有些拧动电位器后数码管数可能不会动态变化,请用户按下实验板上的S22复位按键可更新数据 //这种显象产生的原因是和AD芯片自身的一些特性有关。 #include #include #define uint unsigned int #define uchar unsigned char sbit adrd=P3^7; //IO口定义 sbit adwr=P3^6; sbit diola=P2^5; sbit dula=P2^6; sbit wela=P2^7; unsigned char j,k,adval; void delay(unsigned char i) //延时程序 { for(j=i;j>0;j--) for(k=125;k>0;k--); } uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, //数码管编码 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; void display(uchar bai_c,uchar sh_c,uchar g_c) //显示程序 { P0=table[bai_c]; //显示百位 dula=1; dula=0; P0=0xfe; wela=1; wela=0; delay(5); dula=0; P0=table[sh_c]; //显示十位 dula=1; dula=0; wela=0; P0=0xfd; wela=1; wela=0; delay(5); P0=table[g_c]; //显示个位 dula=1; dula=0; P0=0xfb; wela=1; wela=0; delay(5); } void main() // 主程序 { uchar a,A1,A2,A2t,A3; while(1) { wela=1; P0=0; //选通ADCS adwr=0; //AD写入(随便写个什么都行,主要是为了启动AD转换) _nop_(); adwr=1; P0=0xff; //关闭ADCS delay(10); wela=0; //关闭有AD片选信号锁存器的锁存端以防止在操作数码管时使AD的片选发生变化 for(a=20;a>0;a--) //需要注意的是ADC0804在写和读之间的时间间隔要足够长否则无法读出数据 { //这里把显示部分放这里的原因也是为了增加写读之间的时间间隔 display(A1,A2,A3); } //送去显示各位。 wela=1; //重新打开有AD片选信号锁存器的锁存端P1=0xff; //读取P1口之前先给其写全1 P0=0; //选通ADCS adrd=0; //AD读使能 adval=P1; //AD数据读取赋给P1口 adrd=1; P0=0xff; //关闭ADCS adwr=0; P1=adval; //同时把AD的值送八个发光二极显示 A1=adval/100; //分出百,十,和个位 A2t=adval%100; A2=A2t/10; A3=A2t%10; }; } 7.DA转换电路C语言程序#include sbit wela=P2^7; sbit dula=P2^6; sbit dawr=P3^6; sbit csda=P3^2; unsigned char a,j,k; void delay(unsigned char i) { for(j=i;j>0;j--) for(k=125;k>0;k--); } void main() { wela=0; dula=0; csda=0; a=0; dawr=0; while(1) { P0=a; // dawr=1; delay(50); // delay(200); // delay(200); // delay(200); a++; } //wela=0; //P0=0xff; //wela=1; // wela=0; } 8.计时器电路C语言程序 //59秒自动计数器 #include #define uchar unsigned char uchar j,k,i,a,A1,A2,second; sbit dula=P2^6; sbit wela=P2^7; uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; void delay(uchar i) { for(j=i;j>0;j--) for(k=125;k>0;k--); } void display(uchar sh_c,uchar g_c) { P0=0xff; wela=1; delay(1); wela=0; P0=table[sh_c]; dula=1; dula=0; P0=0xfe; wela=1; wela=0; delay(5); P0=0xff; wela=1; delay(1); wela=0; P0=table[g_c]; dula=1; dula=0; P0=0xfd; wela=1; wela=0; delay(5); } void main() { while(1) { second++; if(second==60) second=0; A1=second/10; A2=second%10; for(a=50;a>0;a--) { display(A1,A2);}; } } 9.1602液晶显示时钟电路C语言程序 #include #define uchar unsigned char #define uint unsigned int sbit dula=P2^6; sbit wela=P2^7; sbit rs=P3^5; sbit lcden=P3^4; sbit s1=P3^0; sbit s2=P3^1; sbit s3=P3^2; sbit rd=P3^7; uchar count,s1num; char miao,shi,fen; uchar code table[]=" 2013-6-1 MON"; uchar code table1[]=" 00:00:00"; void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void write_com(uchar com) { rs=0; lcden=0; P0=com; delay(5); lcden=1; delay(5); lcden=0; } void write_date(uchar date) { rs=1; lcden=0; P0=date; delay(5); lcden=1; delay(5); lcden=0; } void init() { uchar num; dula=0; wela=0; lcden=0; // fen=59; // miao=53; // shi=23; write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01); write_com(0x80); for(num=0;num<15;num++) { write_date(table[num]); delay(5); } write_com(0x80+0x40); for(num=0;num<12;num++) { write_date(table1[num]); delay(5); } TMOD=0x01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1; ET0=1; TR0=1; } 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 keyscan() { rd=0; if(s1==0) { delay(5); if(s1==0) { s1num++; while(!s1); if(s1num==1) { TR0=0; write_com(0x80+0x40+10); write_com(0x0f); } } if(s1num==2) { write_com(0x80+0x40+7); } if(s1num==3) { write_com(0x80+0x40+4); } if(s1num==4) { s1num=0; write_com(0x0c); TR0=1; } } if(s1num!=0) { if(s2==0) { delay(5); if(s2==0) { while(!s2); if(s1num==1) { miao++; if(miao==60) miao=0; write_sfm(10,miao); write_com(0x80+0x40+10); } if(s1num==2) { fen++; if(fen==60) fen=0; write_sfm(7,fen); write_com(0x80+0x40+7); } if(s1num==3) { shi++; if(shi==24) shi=0; write_sfm(4,shi); write_com(0x80+0x40+4); } } } if(s3==0) { delay(5); if(s3==0) { while(!s3); if(s1num==1) { /* if(miao==0) { miao=59; write_sfm(10,miao); write_com(0x80+0x40+10); }*/ miao--; if(miao==-1) miao=59; write_sfm(10,miao); write_com(0x80+0x40+10); } if(s1num==2) { fen--; if(fen==-1) fen=59; write_sfm(7,fen); write_com(0x80+0x40+7); } if(s1num==3) { shi--; if(shi==-1) shi=23; write_sfm(4,shi); write_com(0x80+0x40+4); } } } } } void main() { init(); while(1) { keyscan(); } // while(1); } void timer0() interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; count++; if(count==18) { count=0; miao++; if(miao==60) { miao=0; fen++; if(fen==60) { fen=0; shi++; if(shi==24) { shi=0; } write_sfm(4,shi); } write_sfm(7,fen); } write_sfm(10,miao); } } 10.DS18B20温度传感器电路C语言程序 #include #define uchar unsigned char #define uint unsigned int sbit DS=P2^2; //define interface uint temp; // variable of temperature uchar flag1; // sign of the result positive or negative sbit dula=P2^6; sbit wela=P2^7; unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; unsigned char code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd, 0x87,0xff,0xef}; void delay(uint count) //delay { uint i; while(count) { i=200; while(i>0) i--; count--; } } ///////功能:串口初始化,波特率9600,方式1/////// void Init_Com(void) { TMOD = 0x20; PCON = 0x00; SCON = 0x50; TH1 = 0xFd; TL1 = 0xFd; TR1 = 1; } void dsreset(void) //send reset and initialization command { uint i; DS=0; i=103; while(i>0)i--; DS=1; i=4; while(i>0)i--; } bit tmpreadbit(void) //read a bit { uint i; bit dat; DS=0;i++; //i++ for delay DS=1;i++;i++; dat=DS; i=8;while(i>0)i--; return (dat); } uchar tmpread(void) //read a byte date { uchar i,j,dat; dat=0; for(i=1;i<=8;i++) { j=tmpreadbit(); dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好一个字节在DAT里 } return(dat); } void tmpwritebyte(uchar dat) //write a byte to ds18b20 { uint i; uchar j; bit testb; for(j=1;j<=8;j++) { testb=dat&0x01; dat=dat>>1; if(testb) //write 1 { DS=0; i++;i++; DS=1; i=8;while(i>0)i--; } else { DS=0; //write 0 i=8;while(i>0)i--; DS=1; i++;i++; } } } void tmpchange(void) //DS18B20 begin change { dsreset(); delay(1); tmpwritebyte(0xcc); // address all drivers on bus tmpwritebyte(0x44); // initiates a single temperature conversion } uint tmp() //get the temperature { float tt; uchar a,b; dsreset(); delay(1); tmpwritebyte(0xcc); tmpwritebyte(0xbe); a=tmpread(); b=tmpread(); temp=b; temp<<=8; //two byte compose a int variable temp=temp|a; tt=temp*0.0625; temp=tt*10+0.5; return temp; } void readrom() //read the serial { uchar sn1,sn2; dsreset(); delay(1); tmpwritebyte(0x33); sn1=tmpread(); sn2=tmpread(); } void delay10ms() //delay { uchar a,b; for(a=10;a>0;a--) for(b=60;b>0;b--); } void display(uint temp) //显示程序 { uchar A1,A2,A2t,A3,ser; ser=temp/10; SBUF=ser; A1=temp/100; A2t=temp%100; A2=A2t/10; A3=A2t%10; P0=0xff; wela=1; wela=0; P0=table[A1]; //显示百位dula=1; dula=0; P0=0x7e; wela=1; delay(1); wela=0; delay(1); P0=0xff; wela=1; wela=0; P0=table1[A2]; //显示十位dula=1; dula=0; P0=0x7d; wela=1; wela=0; delay(1); P0=0xff; wela=1; wela=0; P0=table[A3]; //显示个位dula=1; dula=0; P0=0x7b; wela=1; wela=0; delay(1); } void main() { uchar a; Init_Com(); do { tmpchange(); // delay(200); for(a=10;a>0;a--) { display(tmp()); } } while(1); } 11.交通灯设计电路C语言程序 /***************************************************************** 程序功能:模拟交通灯显示。 其中,红灯与绿灯显示时间均为50s,中间的黄灯显示时间为15s。 绿灯用八位发光二极管流动闪烁作代表; 红灯用八位发光二极管全亮作代表; 黄灯用八位发光二极管全亮全灭闪烁作代表。 刚开始显示的为绿灯。 显示顺序:绿--黄--红--黄--绿--黄--红--……………… ******************************************************************/ #include #define uchar unsigned char #define uint unsigned int sbit dula=P2^6; sbit wela=P2^7; sbit beep=P2^3; unsigned int pp; unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; uchar j,k,l=255; uchar a1,a0; uchar shijian,deng=2; void delay(unsigned int i) { for(j=i;j>0;j--) for(k=125;k>0;k--); } void display(unsigned char sh_c,unsigned char g_c) { dula=0; P0=table[sh_c]; dula=1; dula=0; wela=0; P0=0xfe; wela=1; wela=0; delay(5); P0=table[g_c]; dula=1; dula=0; P0=0xfd; wela=1; wela=0; delay(5); } void main() { TMOD=0x01; TR0=1; TH0=(65536-46080)/256;// 由于晶振为11.0592,故所记次数应为46080,计时器每隔50000微秒发起一次中断。 TL0=(65536-46080)%256;//46080的来历,为50000*11.0592/12 ET0=1; EA=1; while(1) { if(shijian==0) { switch(deng) { case 0: shijian=50; //红灯 deng=1; break; case 1: shijian=15; //黄灯 deng=2; break; case 2: shijian=50; //绿灯 deng=3; break; case 3: shijian=15; //黄灯 deng=0; break; } } if(pp==20) { pp=0; shijian--; } a0=shijian%10; a1=shijian/10; display(a1,a0); switch(deng) { case 1: P1=0X00; //红灯 break; case 2: //黄灯 if(shijian%2==0) P1=0x00; if(shijian%2==1) P1=0xff; break; case 3: //绿灯 if(shijian%2==0) P1=0x55; if(shijian%2==1) P1=0xaa; break; case 0: if(shijian%2==0) //黄灯 P1=0x00; if(shijian%2==1) P1=0xff; break; } } } void time0() interrupt 1 { TH0=(65536-46080)/256; TL0=(65536-46080)%256; pp++; } 12.整体电路测试C语言程序 /****************************************************************** 程序功能: 下载程序后会依次看到以下5种状态。 1. 8个流水灯先会从上到下流动一遍,同时蜂鸣器发声。 2. 接着DAC电流指示灯由暗变亮。 3. 接着前三位数码管显示温度值。 4. 接着AD数值显示在数码管的前三位。 5. 接着等待矩阵键盘的按下,按下后相应的数码显示在数码管的后三位上。******************************************************************/ //flow light and beep #include #include #define uint unsigned int #define uchar unsigned char sbit adrd=P3^7; //IO口定义 sbit adwr=P3^6; sbit diola=P2^5; sbit dula=P2^6; sbit wela=P2^7; sbit csda=P3^2; sbit dawr=P3^6; unsigned char j,k; unsigned char a,b; sbit DS=P2^2; //define interface定义接口 uint temp; // variable of temperature 温度变化 uchar flag1; // sign of the result positive or negative sbit beep=P2^3; void dazhuanhuan(); void adzhuanhuan(); void jianpan(); void display1(unsigned char); uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, //数码管编码 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; unsigned char code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd, 0x87,0xff,0xef}; void delay1(uint count) //delay { uint i; while(count) { i=200; while(i>0) i--; count--; } } ///////功能:串口初始化,波特率9600,方式1/////// void Init_Com(void) { TMOD = 0x20; PCON = 0x00; SCON = 0x50; TH1 = 0xFd; TL1 = 0xFd; TR1 = 1; } void dsreset(void) //send reset and initialization command 发送复位和初始化命令 { uint i; DS=0; i=103; while(i>0)i--; DS=1; i=4; while(i>0)i--; } bit tmpreadbit(void) //read a bit { uint i; bit dat; DS=0;i++; //i++ for delay DS=1;i++;i++; dat=DS; i=8;while(i>0)i--; return (dat); } uchar tmpread(void) //read a byte date { uchar i,j,dat; dat=0; for(i=1;i<=8;i++) { j=tmpreadbit(); dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好一个字节在DAT里 } return(dat); } void tmpwritebyte(uchar dat) //write a byte to ds18b20 写一个字节到DS18B20 { uint i; uchar j; bit testb; for(j=1;j<=8;j++) { testb=dat&0x01; dat=dat>>1; if(testb) //write 1 { DS=0; i++;i++; DS=1; i=8;while(i>0)i--; } else { DS=0; //write 0 i=8;while(i>0)i--; DS=1; i++;i++; } } } void tmpchange(void) //DS18B20 begin change DS18B20开始变化 { dsreset(); delay1(1); tmpwritebyte(0xcc); // address all drivers on bus 总线上所有驱动程序tmpwritebyte(0x44); // initiates a single temperature conversion启动一个单一的温度转换 } uint tmp() //get the temperature得到的温度 { float tt; uchar a,b; dsreset(); delay1(1); tmpwritebyte(0xcc); tmpwritebyte(0xbe); a=tmpread(); b=tmpread(); temp=b; temp<<=8; //two byte compose a int variable 两个字节组成一个int变量 temp=temp|a; tt=temp*0.0625; temp=tt*10+0.5; return temp; } void readrom() //read the serial { uchar sn1,sn2; dsreset(); delay1(1); tmpwritebyte(0x33); sn1=tmpread(); sn2=tmpread(); } void delay10ms1() //delay { uchar a,b; for(a=10;a>0;a--) for(b=60;b>0;b--); } void display2(uint temp) //显示程序 { uchar A1,A2,A2t,A3,ser; ser=temp/10; SBUF=ser; A1=temp/100; A2t=temp%100; A2=A2t/10; A3=A2t%10; dula=0; P0=table[A1]; //显示百位dula=1; dula=0; wela=0; P0=0x7e; wela=1; wela=0; delay1(1); dula=0; P0=table1[A2]; //显示十位dula=1; dula=0; wela=0; P0=0x7d; wela=1; wela=0; delay1(1); P0=table[A3]; //显示个位dula=1; dula=0; P0=0x7b; wela=1; wela=0; delay1(1); } void wendu() { uchar a,c; Init_Com(); for(c=0;c<20;c++) { tmpchange(); // delay(200); for(a=10;a>0;a--) { display2(tmp()); } } } void delay10ms() { for(a=100;a>0;a--) for(b=225;b>0;b--); } //拧动AD旁边的电位器,会在数码管的前三位显示0-255之间的数值。这就是把模拟电压转换成数字信号。 void delay(unsigned char i) //延时程序 { for(j=i;j>0;j--) for(k=125;k>0;k--); } void display(uchar bai_c,uchar sh_c,uchar g_c) //显示程序 { dula=0; P0=table[bai_c]; //显示百位dula=1; dula=0; wela=0; P0=0x7e; wela=1; wela=0; delay(5); dula=0; P0=table[sh_c]; //显示十位dula=1; dula=0; wela=0; P0=0x7d; wela=1; wela=0; delay(5); P0=table[g_c]; //显示个位dula=1; dula=0; P0=0x7b; wela=1; wela=0; delay(5); } da();//DA void main() { uchar liushui; k=0xfe; for(liushui=0;liushui<8;liushui++) { delay10ms(); beep=0; delay10ms(); beep=1; j=_crol_(k,1); k=j; P1=j; } dazhuanhuan(); wendu(); adzhuanhuan(); jianpan(); } void dazhuanhuan() {unsigned char a,k; wela=0; dula=0; csda=0; a=0; dawr=0; for(k=0;k<255;k++) { P0=a; delay(50); a++; } } void adzhuanhuan() {uchar a,b,A1,A2,A2t,A3,adval; b=0xf0; while(b==0xf0) { wela=1; P0=0; //选通ADCS adwr=0; //AD写入(随便写个什么都行,主要是为了启动AD转换) _nop_(); adwr=1; P0=0xff; //关闭ADCS delay(10); wela=0; //关闭有AD片选信号锁存器的锁存端以防止在操作 数码管时使AD的片选发生变化 for(a=20;a>0;a--) //需要注意的是ADC0804在写和读之间的时间 间隔要足够长否则无法读出数据{ //这里把显示部分放这里的原因也是为了增 加写读之间的时间间隔 display(A1,A2,A3); } //送去显示各位。 wela=1; //重新打开有AD片选信号锁存器的锁存端P1=0xff; //读取P1口之前先给其写全1 P0=0; //选通ADCS adrd=0; //AD读使能 adval=P1; //AD数据读取赋给P1口 adrd=1; P0=0xff; //关闭ADCS adwr=0; P1=adval; //同时把AD的值送八个发光二极显示 A1=adval/100; //分出百,十,和个位 A2t=adval%100; A2=A2t/10; A3=A2t%10; P3=0xf0;//扫描键盘看是否有见键按下 b=P3&0xf0; } } //4*4键盘检测程序,按下键后相应的代码显示在数码管上void display1(unsigned char num) { P0=table[num]; // P0=0xff; dula=1; dula=0; P0=0xc7; wela=1; wela=0; } void jianpan() {unsigned char temp,key; dula=0; wela=0; while(1) { P3=0xfe; temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delay(10); if(temp!=0xf0) { temp=P3; switch(temp) { case 0xee: key=0; break; case 0xde: key=1; break; case 0xbe: key=2; break; case 0x7e: key=3; break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; beep=0; } beep=1; display1(key); // P0=table[key]; /* P0=0xff; dula=1; while(i--); dula=0; P0=0xc0; wela=1; wela=0; dula=0; wela=0; P0=0xff; dula=1; dula=0; P0=0xc5; wela=1; wela=0; */ P1=0xfe; } } P3=0xfd; temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delay(10); if(temp!=0xf0) { temp=P3; switch(temp) { case 0xed: key=4; break; case 0xdd: key=5; break; case 0xbd: key=6; break; case 0x7d: key=7; break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; beep=0; } beep=1; display1(key); /* P0=table[key]; dula=1; // while(100--); dula=0; P0=0xc0; wela=1; wela=0; */ P1=0xfc; } } P3=0xfb; temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delay(10); if(temp!=0xf0) { temp=P3; switch(temp) { case 0xeb: key=8; break; case 0xdb: key=9; break; case 0xbb: key=10; break; case 0x7b: key=11; break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; beep=0; } beep=1; display1(key); /* P0=table[key]; dula=1; // while(100--); dula=0; P0=0xc0; wela=1; wela=0; */ P1=0xf8; } } P3=0xf7; temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delay(10); if(temp!=0xf0) { temp=P3; switch(temp) { case 0xe7: key=12; break; case 0xd7: key=13; break; case 0xb7: key=14; break; case 0x77: key=15; break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; beep=0; } beep=1; display1(key); /* P0=table[key]; dula=1; // while(100--); dula=0; P0=0xc0; wela=1; wela=0; */ P1=0xf0; } } } } case 0xbd: key=6; break; case 0x7d: key=7; break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; beep=0; } beep=1; display1(key); /* P0=table[key]; dula=1; // while(100--); dula=0; P0=0xc0; wela=1; wela=0; */ P1=0xfc; } } P3=0xfb; temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delay(10); if(temp!=0xf0) { temp=P3; switch(temp) { case 0xeb: key=8; break; case 0xdb: key=9; break; case 0xbb: key=10; break; case 0x7b: key=11; break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; beep=0; } beep=1; display1(key); /* P0=table[key]; dula=1; // while(100--); dula=0; P0=0xc0; wela=1; wela=0; */ P1=0xf8; } } P3=0xf7; temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delay(10); if(temp!=0xf0) { temp=P3; switch(temp) { case 0xe7: key=12; break; case 0xd7: key=13; break; case 0xb7: key=14; break; case 0x77: key=15; break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; beep=0; } beep=1; display1(key); /* P0=table[key]; dula=1; // while(100--); dula=0; P0=0xc0; wela=1; wela=0; */ P1=0xf0; } } } } { uchar liushui; k=0xfe; for(liushui=0;liushui<8;liushui++) { delay10ms(); beep=0; delay10ms(); beep=1; j=_crol_(k,1); k=j; P1=j; } dazhuanhuan(); wendu(); adzhuanhuan(); jianpan(); } void dazhuanhuan() {unsigned char a,k; wela=0; dula=0; csda=0; a=0; dawr=0; for(k=0;k<255;k++) { P0=a; delay(50); a++; } } void adzhuanhuan() {uchar a,b,A1,A2,A2t,A3,adval; b=0xf0; while(b==0xf0) { wela=1; P0=0; //选通ADCS adwr=0; //AD写入(随便写个什么都行,主要是为了启动AD转换) _nop_(); adwr=1; P0=0xff; //关闭ADCS delay(10); wela=0; //关闭有AD片选信号锁存器的锁存端以防止在操作 数码管时使AD的片选发生变化 for(a=20;a>0;a--) //需要注意的是ADC0804在写和读之间的时间 间隔要足够长否则无法读出数据{ //这里把显示部分放这里的原因也是为了增 加写读之间的时间间隔 display(A1,A2,A3); } //送去显示各位。 wela=1; //重新打开有AD片选信号锁存器的锁存端P1=0xff; //读取P1口之前先给其写全1 P0=0; //选通ADCS adrd=0; //AD读使能 adval=P1; //AD数据读取赋给P1口 adrd=1; P0=0xff; //关闭ADCS adwr=0; P1=adval; //同时把AD的值送八个发光二极显示 A1=adval/100; //分出百,十,和个位 A2t=adval%100; A2=A2t/10; A3=A2t%10; P3=0xf0;//扫描键盘看是否有见键按下 b=P3&0xf0; } } //4*4键盘检测程序,按下键后相应的代码显示在数码管上void display1(unsigned char num) { P0=table[num]; // P0=0xff; dula=1; dula=0; P0=0xc7; wela=1; wela=0; } void jianpan() {unsigned char temp,key; dula=0; wela=0; while(1) { P3=0xfe; temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delay(10); if(temp!=0xf0) { temp=P3; switch(temp) { case 0xee: key=0; break; case 0xde: key=1; break; case 0xbe: key=2; break; case 0x7e: key=3; break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; beep=0; } beep=1; display1(key); // P0=table[key]; /* P0=0xff; dula=1; while(i--); dula=0; P0=0xc0; wela=1; wela=0; dula=0; wela=0; P0=0xff; dula=1; dula=0; P0=0xc5; wela=1; wela=0; */ P1=0xfe; } } P3=0xfd; temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delay(10); if(temp!=0xf0) { temp=P3; switch(temp) { case 0xed: key=4; break; case 0xdd: key=5; break; case 0xbd: key=6; break; case 0x7d: key=7; break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; beep=0; } beep=1; display1(key); /* P0=table[key]; dula=1; // while(100--); dula=0; P0=0xc0; wela=1; wela=0; */ P1=0xfc; } } P3=0xfb; temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delay(10); if(temp!=0xf0) { temp=P3; switch(temp) { case 0xeb: key=8; break; case 0xdb: key=9; break; case 0xbb: key=10; break; case 0x7b: key=11; break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; beep=0; } beep=1; display1(key); /* P0=table[key]; dula=1; // while(100--); dula=0; P0=0xc0; wela=1; wela=0; */ P1=0xf8; } } P3=0xf7; temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delay(10); if(temp!=0xf0) { temp=P3; switch(temp) { case 0xe7: key=12; break; case 0xd7: key=13; break; case 0xb7: key=14; break; case 0x77: key=15; break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; beep=0; } beep=1; display1(key); /* P0=table[key]; dula=1; // while(100--); dula=0; P0=0xc0; wela=1; wela=0; */ P1=0xf0; } } } }
/
本文档为【虚拟单片机实验系统的开发程序代码_毕业论文_附录】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索