单片机程序12-18B20和PLD与EDA讲义.docx_第1页
单片机程序12-18B20和PLD与EDA讲义.docx_第2页
单片机程序12-18B20和PLD与EDA讲义.docx_第3页
单片机程序12-18B20和PLD与EDA讲义.docx_第4页
单片机程序12-18B20和PLD与EDA讲义.docx_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

/*数字中C程序设计*/#include#include#define uint unsigned int #define uchar unsigned char/*时间位变量定义*/sbit mode=P37;sbit inc=P36;sbit dec=P35;sbit enter=P34;sbit point=P07;bit flag=1;sbit DQ=P11; /设定温度采集端sbit led=P27;/三色指示时钟sbit speaker=P26;/声音报警端口sbit d2=P25;sbit d3=P24;sbit d4=P23;sbit d5=P22;sbit d6=P21;sbit d7=P20;/*变量定义*/uchar t,hhour,lhour,hmin,lmin,hsec,lsec;uchar hour,min,sec,vmode; uchar ahour,amin;uchar m,n,deta;uchar day,week,mon;/定义日期uint year;uchar temp;/存放温度值uchar str3;/存放温度分离值uchar code table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x00;/共阴型七段数码管09的断码uchar code choosebit=0x01,0x02,0x04,0x08,0x10,0x20;/P20P25是6个数码管从地位到高位的位选uchar table1=31,31,29,31,30,31,30,31,31,30,31,30,31; /闰年uchar table2=31,31,28,31,30,31,30,31,31,30,31,30,31; /非闰年/*声明时钟调用子函数*/void delay(uint z);void delay_spk(uint cnt);void mode0();void mode1();void mode2();void mode3();void mode4();void mode5();/显示日期void mode6();/显示温度void display(uchar t_hour,uchar t_min,uchar t_sec);/*声明ds18b20调用的子函数*/ uchar ReadTemperature(void); /读取温度void Init_DS18B20(void); /18b20初始化函数uchar ReadOneChar(void);/读一个字节void WriteOneChar(uchar dat); /写一个字节void delay_temperature(uint y);/延时函数void display_temperature();/*主函数*/void main() vmode=0;speaker=0; hour=0;min=1;sec=0;ahour=0;amin=3;led=0;year=2009;mon=05;day=25;week=01;/日期赋初值TMOD=0x11;/设置定时器0,1为工作方式1TH0=0xd8;/定时器定时10msTL0=0xf0; TH1=(65536-5000)/256;TL1=(65536-5000)%256;IE=0X8a;/开定时器0,1中断 TR0=1;/启动定时器0TR1=1;/启动定时器1 t=0;/赋显示初值while(1) switch(vmode)case 0:mode0();break;/正常走时case 1:mode1();break;/调整当前时间分钟case 2:mode2();break;/调整当前时间小时case 3:mode3();break;/调整闹钟时间分钟case 4:mode4();break;/调整闹钟时间分钟 case 5:/正常日期case 6:/调整月值case 7:/调整日值case 8:mode5();break;/调整周值 case 9:mode6();break;/显示温度default:break;/*10mS定时中断服务子函数*/void timer1_ISR(void) interrupt 3 TH1=(65536-5000)/256;TL1=(65536-5000)%256;if(m=1)n+;if(n=50)n=0;m=0;P3=0xff;if(P3!=0xff) if(n=0)m=1; if(n=1) if(mode=0) vmode+; if(enter=0) vmode=0;TR0=1; if(vmode=1&inc=0) TR0=0;min+;if(min=60) min=0; if(vmode=1&dec=0) TR0=0;min-;if(min=24) hour=0; if(vmode=2&dec=0) TR0=0;hour-;if(hour=60) amin=0; if(vmode=3&dec=0) TR0=0;amin-;if(amin=24) ahour=0; if(vmode=4&dec=0) TR0=0;ahour-;if(ahour=13) mon=1; if(vmode=6&dec=0) TR0=0;mon-;if(mon=0) mon=12; if(vmode=7&inc=0) TR0=0;day+;if(year%4=0&year%100!=0|year%400=0) if(day=table1mon+1) day=1; else /非闰年if(day=table2mon+1) day=1; if(vmode=7&dec=0) TR0=0;day-;if(year%4=0&year%100!=0|year%400=0) if(day=0) day=table1mon-1; else if(day=8) week=1; if(vmode=8&dec=0) TR0=0;week-;if(week=10)vmode=0;switch(vmode) case 0:mode0();break;/正常走时case 1:mode1();break;/调整正常走时的分钟case 2:mode2();break;/调整正常走时的小时case 3:mode3();break;/调整定时的分钟case 4:mode4();break;/调整定时的小时 case 5: /显示正常月日周 case 6: /调整月份值 case 7: /调整日期值 case 8:mode5();break; /调整星期值 case 9:mode6();break; /显示温度default:break; /时间正常运行void timer0_ISR(void) interrupt 1TH0=0xd8;TL0=0xf0;t+;deta+;if(deta=50)deta=0;flag=!flag;/每隔一秒最低位的小数点闪烁一次if(t=100)t=0;sec+;if(sec=60)sec=0;min+;if(min=60)min=0;hour+;if(hour=24) hour=0;day+;week+;if(week=8) week=1;if(year%4=0&year%100!=0|year%400=0) /闰年 if(day=table1mon+1) day=1; mon+; if(mon=13) mon=1;year+;else /非闰年 if(day=table2mon+1) day=1; mon+;if(mon=13) mon=1;year+;/*模式设置*/模式0 正常走时并显示void delay_spk(uint cnt)/延时while(-cnt);void mode0() uchar i; display(hour,min,sec); while(hour=ahour&min=amin)|(min=0)/闹钟和整点报时 for(i=0;i=60)hhour=10;lhour=10;else hhour=t_hour/10;lhour=t_hour%10; if(t_min=60)hmin=10;lmin=10;elsehmin=t_min/10;lmin=t_min%10;if(t_sec=60)hsec=10;lsec=10;elsehsec=t_sec/10;lsec=t_sec%10;/choose the first led d2=1;d3=0;d4=0;d5=0;d6=0;d7=0;P0=tablehhour;delay(2);P0=0;/choose the second led d2=0;d3=1;d4=0;d5=0;d6=0;d7=0;P0=tablelhour;delay(2);P0=0;/choose the third ledd2=0; d3=0;d4=1;d5=0;d6=0;d7=0;P0=tablehmin;delay(2);P0=0;/choose the fourth ledd2=0;d3=0;d4=0;d5=1;d6=0;d7=0;P0=tablelmin;delay(2);P0=0;/choose the fifth led d2=0;d3=0;d4=0;d5=0;d6=1;d7=0;P0=tablehsec;delay(2);P0=0;/choose the sixth led d2=0;d3=0;d4=0;d5=0;d6=0;d7=1;P0=tablelsec;if(flag=1)point=1;delay(2);P0=0;void delay(uint z)uint y;for(;z0;z-)for(y=0;y0;i-) DQ = 0; / 给脉冲信号 dat=1; DQ = 1; / 给脉冲信号 if(DQ) dat|=0x80; delay_temperature(5); return(dat);/写一个字节void WriteOneChar(uchar dat) uchar i=0; for (i=8; i0; i-) DQ = 0; DQ = dat&0x01; delay_temperature(5); DQ = 1; dat=1; delay_temperature(5);/*/*读取温度*/uchar ReadTemperature(void)uchar a=0;uchar b=0;uchar t1=0;/float tt=0;Init_DS18B20();WriteOneChar(0xCC); / 跳过ROMWriteOneChar(0x44); / 启动温度转换delay_temperature(200);Init_DS18B20();WriteOneChar(0xCC); /跳过ROM WriteOneChar(0xBE); /读取温度寄存器等(共可读9个寄存器) 前两个就是温度a=ReadOneChar(); /a是低八位,传送先高位,后低位b=ReadOneChar(); /b是高八位b4; /高四位与低四位互换t1=b;/tt=t*0.0625;/t1= tt*10+0.5; /放大10倍输出并四舍五入return(t1);/*/*温度显示子函数*/void display_temperature()/显示十位speaker=0;/蜂鸣器不响d3=0;d4=0;d5=1;d6=0;d7=0;P0=str2;delay(30);P0=0;/显示位个speaker=0;d3=0;d4=0;d5=0;d6=1;d7=0;P0=str1;delay(30);P0=0;/显示符号cspeaker=0;d3=0;d4=0;d5=0;d6=0;d7=1;P0=str0;delay(30);P0=0;/*ds18b20延时函数*/*/void delay_temperature(uint y)/延时函数 while(y-);-/*1-VSS 2-VDD 3-V0 4-RS 5-R/W 6-E *7-14 DB0-DB7 15-BLA 16-BLK */*copyright 2007,ShangHai HaoTun Electronic Technology co.,Ltd * *This sample is used for lcm1602 . * *write by Shifang 2007-8-11 * *V1.1 */#include#include#includeunsigned int hour,minute,second,count;sbit RS = P22;/Pin4sbit RW = P23; /Pin5sbit E = P24;/Pin6#define Data P0 /数据端口char data TimeNum= ;char data Test1= ;/*/* 函数声明 */*/*/void DelayUs(unsigned char us)/delay us unsigned char uscnt; uscnt=us1;/* Crystal frequency in 12MHz*/ while(-uscnt);/*/void DelayMs(unsigned char ms)/delay Ms while(-ms) DelayUs(250); DelayUs(250); DelayUs(250); DelayUs(250); void WriteCommand(unsigned char c) DelayMs(5);/short delay before operation E=0; RS=0; RW=0; _nop_(); E=1; Data=c; E=0;/*/void WriteData(unsigned char c) DelayMs(5); /short delay before operation E=0; RS=1; RW=0; _nop_(); E=1; Data=c; E=0; RS=0;/*/void ShowChar(unsigned char pos,unsigned char c) unsigned char p; if (pos=0x10) p=pos+0xb0; /是第二行则命令代码高4位为0xc else p=pos+0x80; /是第二行则命令代码高4位为0x8 WriteCommand (p);/write command WriteData (c); /write data/*/void ShowString (unsigned char line,char *ptr) unsigned char l,i; l=line4; for (i=0;i16;i+) ShowChar (l+,*(ptr+i);/循环显示16个字符/*/void InitLcd() DelayMs(15); WriteCommand(0x38); /display mode WriteCommand(0x38); /display mode WriteCommand(0x38); /display mode WriteCommand(0x06); /显示光标移动位置 WriteCommand(0x0c); /显示开及光标设置 WriteCommand(0x01); /显示清屏/void main(void)InitLcd();/DelayMs(15);sprintf(Test1, );/the first lineShowString(0,Test1);sprintf(TimeNum,LCM1602 Test ok!);/the first lineShowString(1,TimeNum);while(1);-/18B20单线温度检测的应用样例程序#include#include#include#define uchar unsigned char#define uint unsigned int;/*/sbit DQ=P35;/ds18b20 端口/*/ unsigned int temp;uchar flag_get;/*/void delay1(uchar MS);unsigned char ReadTemperature(void);void Init_DS18B20(void);unsigned char ReadOneChar(void);void WriteOneChar(unsigned char dat);void delay(unsigned int i);void DelayMs(unsigned char ms);/delay Msvoid InitLcd();void lcd_sef_chr();/*/void display(void);/外部函数main()TMOD|=0x01;/定时器设置TH0=0xef;TL0=0xf0;IE=0x82;TR0=1; InitLcd();/DelayMs(15);lcd_sef_chr(); /写入自定义字符号while(1) if(flag_get=1) /定时读取当前温度 temp=ReadTemperature(); flag_get=0; display();/显示 void tim(void) interrupt 1 using 1/中断,用于数码管扫描和温度检测间隔static unsigned char num;TH0=0xef;/定时器重装值TL0=0xf0;num+;if (num=50) num=0; flag_get=1;/标志位有效 /*/void delay(unsigned int i)/延时函数 while(i-);/*/18b20初始化函数void Init_DS18B20(void) unsigned char x=0; DQ = 1; /DQ复位 delay(8); /稍做延时 DQ = 0; /单片机将DQ拉低 delay(80); /精确延时 大于 480us DQ = 1; /拉高总线 delay(10); x=DQ; /稍做延时后 如果x=0则初始化成功 x=1则初始化失败 delay(5);/读一个字节unsigned char ReadOneChar(void)unsigned char i=0;unsigned char dat = 0;for (i=8;i0;i-) DQ = 0; / 给脉冲信号 dat=1; DQ = 1; / 给脉冲信号 if(DQ) dat|=0x80; delay(5); return(dat);/写一个字节void WriteOneChar(unsigned char dat) unsigned char i=0; for (i=8; i0; i-) DQ = 0; DQ = dat&0x01; delay(5); DQ = 1; dat=1; delay(5);/读取温度unsigned char ReadTemperature(void)unsigned char a=0;unsigned char b=0;unsigned char t=0;/float tt=0;Init_DS18B20();WriteOneChar(0xCC); / 跳过读序号列号的操作WriteOneChar(0x44); / 启动温度转换delay(200);Init_DS18B20();WriteOneChar(0xCC); /跳过读序号列号的操作 WriteOneChar(0xBE); /读取温度寄存器等(共可读9个寄存器) 前两个就是温度a=ReadOneChar();b=ReadOneChar();b4;t=b;/tt=t*0.0625;/t= tt*10+0.5; /放大10倍输出并四舍五入return(t);-/18B20单线温度检测的应用样例程序#include#include#include#define uchar unsigned char#define uint unsigned int;/*/sbit seg1=P20;sbit seg2=P21;sbit seg3=P22;sbit DQ=P35;/ds18b20 端口sfr dataled=0x80;/显示数据端口/*/ uchar temp;uchar flag_get,count,num,minute,second;uchar code tab=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;/7段数码管段码表共阳uchar str3;/*/void delay1(uchar MS);unsigned char ReadTemperature(void);void Init_DS18B20(void);unsigned char ReadOneChar(void);void WriteOneChar(unsigned char dat);void delay(unsigned int i);/*/main()TMOD|=0x01;/定时器设置TH0=0xef;TL0=0xf0;IE=0x82;TR0=1;P2=0x00; count=0;while(1) str0=0xc6;/显示C符号 str2=tabtemp/10; /十位温度 str1=tabtemp%10; /个位温度 if(flag_get=1) /定时读取当前温度 temp=ReadTemperature(); flag_get=0; void tim(void) interrupt 1 using 1/中断,用于数码管扫描和温度检测间隔TH0=0xef;/定时器重装值TL0=0xf0;num+;if (num=50) num=0; flag_get=1;/标志位有效 second+; if(second=60) second=0; minute+; count+;if(count=1) P2=0xf7; dataled=str0;/数码管扫描if(count=2) P2=0xfb; dataled=str1;if(count=3) P2=0xfd; dataled=str2; count=0;/*/void delay(unsigned int i)/延时函数 while(i-);/*/18b20初始化函数void Init_DS18B20(void) unsigned char x=0; DQ = 1; /DQ复位 delay(8); /稍做延时 DQ = 0; /单片机将DQ拉低 delay(80); /精确延时 大于 480us DQ = 1; /拉高总线 delay(10); x=DQ; /稍做延时后 如果x=0则初始化成功 x=1则初始化失败 delay(5);/读一个字节unsigned char ReadOneChar(void)unsigned char i=0;unsigned char dat = 0;for (i=8;i0;i-) DQ = 0; / 给脉冲信号 dat=1; DQ = 1; / 给脉冲信号 if(DQ) dat|=0x80; delay(5); retu

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论