doc

简单的单片机源程序

  • 1星
  • 日期: 2018-07-31
  • 大小: 124KB
  • 所需积分:1分
  • 下载次数:0
  • favicon收藏
  • rep举报
  • 分享
  • free评论
标签: 源程序单片机

单片机源程序。

文档内容节选

void cunchuuchar secuchar tcnt secreadset2 beep1 ifsec100 sec0 TMOD0x01 定时器工作方式1 ET01 EA1 TH06553650000256对TH0 TL0赋值 TL06553650000256使定时器005秒中断一次 TR01 开始计时 void t0interrupt 1 定时中断服务函数 TH06553650000256对TH0 TL0赋值 TL06553650000256重装计数初值 tcnt iftcnt20 计满20次 tcnt0 重新再计 sec WriteCurrent1 ifsec100 sec0 includereg52h define uchar unsigned char bit write0 写24c02的标志 sbit sdaP12 sbit sclP17 sbit dulap20 sbit welap21 uchar sectcnt uchar co......

void cunchu(uchar sec,uchar tcnt) { sec=readset(2); beep=1; if(sec>100) sec=0; TMOD=0x01; //定时器工作方式1 ET0=1; EA=1; TH0=(65536-50000)/256;//对TH0 TL0赋值 TL0=(65536-50000)%256;//使定时器0.05秒中断一次 TR0=1; //开始计时 } void t0()interrupt 1 //定时中断服务函数 { TH0=(65536-50000)/256;//对TH0 TL0赋值 TL0=(65536-50000)%256;//重装计数初值 tcnt++; if(tcnt==20) //计满20次 { tcnt=0; //重新再计 sec++; WriteCurrent=1; if(sec==100) sec=0; } #include #define uchar unsigned char bit write=0; //写24c02的标志 sbit sda=P1^2; sbit scl=P1^7; sbit dula=p2^0; sbit wela=p2^1; uchar sec,tcnt; uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71} void delay() { ;; } void delay1ms(uint z) { uint x,y; for(x=z;x>0;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 respons() //应答 { uchar i; scl=1; delay(); while((sda==1)&&(i<250))i++; scl=0; delay(); } void init() { sda=1; delay(); scl=1; delay(); } void write_byte(uchar date) { uchar i,temp; temp=date; for(i=0;i<8;i++) { temp=temp<<1; scl=0; delay(); sda=CY; delay(); scl=1; delay(); scl=0; delay(); } scl=0; delay(); sda=1; delay(); } uchar read_byte() { uchar i,k; scl=0; delay(); sda=1; delay(); for(i=0;i<8;i++) { scl=1; delay(); k=(k<<1)|sda; scl=0; delay(); } return k; } void write_add(uchar address,uchar date) { start(); write_byte(0xa0); respons(); write_byte(address); respons(); write_byte(date); respons(); stop(); } uchar read_add(uchar address) { uchar date; start(); write_byte(0xa0); respons(); write_byte(address); respons(); start(); write_byte(0xa1); respons(); date=read_byte(); stop(); return date; } void display(uchar bai_c,uchar sh_c) { dula=0; P0=table[bai_c]; dula=1; dula=0; wela=0; P0=0x7e; wela=1; wela=0; delay1ms(5); dula=0; P0=table[sh_c]; dula=1; dula=0; wela=0; P0=0x7d; wela=1; wela=0; delay1ms(5); } void main() { init(); sec=read_add(2); if(sec>100) sec=0; TMOD=0x01; //定时器工作方式1 ET0=1; EA=1; TH0=(65536-50000)/256;//对TH0 TL0赋值 TL0=(65536-50000)%256;//使定时器0.05秒中断一次 TR0=1; //开始计时 while(1); { display(sec/10,sec%10); if(write==1) { write=0; write_add(2,sec); } } } void t0()interrupt 1 //定时中断服务函数 { TH0=(65536-50000)/256;//对TH0 TL0赋值 TL0=(65536-50000)%256;//重装计数初值 tcnt++; if(tcnt==20) //计满20次 { tcnt=0; //重新再计 sec++; WriteCurrent=1; if(sec==100) sec=0; } } hanzi_buff2[10] = mun_to_char[one=ad_data%51*10%51*10%51*10/51]; hanzi_buff2[11] = mun_to_char[two=ad_data%51*10%51*10/51]; hanzi_buff2[12] = mun_to_char[three=ad_data%51*10/51]; hanzi_buff2[13] = mun_to_char[four=ad_data/51]; #include #include #include #define uchar unsigned char #define uint unsigned int #define Nop() _nop_() #define _Nop() _nop_() #define disdata P0 //显示数据码输出口 sbit SDA=P1^2; // 将p1.2口模拟数据口 sbit SCL=P1^7; // 将p1.7口模拟时钟口 /*************12864引脚定义******************/ /*引脚端口定义*/ sbit LCD12864_RS_PORT = P1^0; /*LCD12864引脚定义*/ sbit LCD12864_RW_PORT = P1^1; sbit LCD12864_E_PORT = P2^5; #define LCD12864_DA_PORT P0 /////////////////////////////////////// sbit dula=P2^0;//数码管的段选信号 sbit wela=P2^1; //数码管的位选信号 void delay1 (void)//关闭数码管延时程序 { int k; for (k=0; k<1000; k++); } sbit DQ =P2^4; //定义DS18B20通信端口 sbit ACC0 = ACC^0; sbit ACC7 = ACC^7; uchar code mun_to_char[] = {"0123456789"}; /*数字转换为ASCII字符码*/ uchar hanzi_buff1[]={" 兰州工业学院 "}; uchar hanzi_buff2[]={"当前温度: 20.3度"}; uchar hanzi_buff3[]={"1-0.00V 2-0.00V"}; uchar hanzi_buff4[]={"3-0.00V 4-0.00V"}; uchar code lcd1602_line1[]={"Please insert "}; uchar code lcd1602_line2[]={"LCD12864 Display"}; /*********************** PCF8591专用变量定义 ***********************/ #define PCF8591_WRITE 0x90 #define PCF8591_READ 0x91 #define NUM 4 //接收和发送缓存区的深度 uchar idata receivebuf[NUM]; //数据接收缓冲区 //////////////////以下是DS18B20驱动程序//////////////// //延时函数 void delay(uint i) { while(i--); } //初始化函数 void Init_DS18B20() { unsigned char x=0; DQ = 1; //DQ复位 delay(8); //稍做延时 DQ = 0; //单片机将DQ拉低 delay(80); //精确延时 大于 480us DQ = 1; //拉高总线 delay(14); x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败 delay(20); } //读一个字节 uchar ReadOneChar() { uchar i=0; uchar dat = 0; for (i=8;i>0;i--){ DQ = 0; // 给脉冲信号 dat>>=1; DQ = 1; // 给脉冲信号 if(DQ) dat|=0x80; delay(4); } return(dat); } //写一个字节 void WriteOneChar(unsigned char dat) { uchar i=0; for (i=8; i>0; i--){ DQ = 0; DQ = dat&0x01; delay(5); DQ = 1; dat>>=1; } } //读取温度 uint ReadTemperature() { uchar a=0; uchar b=0; uint t=0; float tt=0; Init_DS18B20(); WriteOneChar(0xCC); // 跳过读序号列号的操作 WriteOneChar(0x44); // 启动温度转换 Init_DS18B20(); WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度 a=ReadOneChar(); b=ReadOneChar(); t=b; t<<=8; t=t|a; tt=t*0.0625; //将温度的高位与低位合并 t= tt*10+0.5; //对结果进行4舍5入 return(t); } //////////////////以上是DS18B20驱动程序//////////////// //////////////////以下是LCD12864驱动程序//////////////// void LCD12864_WaitIdle() //LCD12864 忙 信号检测 { LCD12864_DA_PORT = 0xff; LCD12864_RS_PORT = 0; LCD12864_RW_PORT = 1; LCD12864_E_PORT = 1; while((LCD12864_DA_PORT&0x80)==1); /*等待BF 不为1*/ LCD12864_E_PORT = 0; } void LCD12864_COM_Write( uchar com_da) /* 检测忙信号写入命令字 com_da 为待写入的命令字*/ { LCD12864_WaitIdle(); LCD12864_RS_PORT = 0; LCD12864_RW_PORT = 0; LCD12864_DA_PORT = com_da; LCD12864_E_PORT = 1; Nop(); Nop(); Nop(); Nop(); Nop(); Nop(); Nop(); Nop(); LCD12864_E_PORT = 0; } void LCD12864_NoWaitIdle_COM_Write(uchar com_da) /* 不检测忙信号写入命令字 com_da 为待写入的命令字*/ { LCD12864_RS_PORT = 0; LCD12864_RW_PORT = 0; LCD12864_DA_PORT = com_da; LCD12864_E_PORT = 1; Nop(); Nop(); Nop(); Nop(); Nop(); Nop(); Nop(); Nop(); LCD12864_E_PORT = 0; } void LCD12864_Data_Write(uchar da) /* 数据写入 da 为待写入的8位数据*/ { LCD12864_WaitIdle(); /*检测忙信号*/ LCD12864_RS_PORT = 1; LCD12864_RW_PORT = 0; LCD12864_DA_PORT = da; LCD12864_E_PORT = 1; Nop(); Nop(); Nop(); Nop(); Nop(); Nop(); Nop(); Nop(); LCD12864_E_PORT = 0; } void lcd_delay_ms(uchar x) /*1MS为单位的延时程序,不准确*/ { uchar j; while(x--){ for(j=0;j<125;j++) {;} } } void LCD12864_Reset() /*LCD12864初始化*/ { lcd_delay_ms(100); /*适当延时待LCD自动复位完成*/ LCD12864_NoWaitIdle_COM_Write(0x30); /*使用8位并口通讯*/ lcd_delay_ms(10); LCD12864_NoWaitIdle_COM_Write(0x30); /*使用8位并口通讯*/ lcd_delay_ms(10); LCD12864_NoWaitIdle_COM_Write(0x0c); /*显示开及光标设置*/ lcd_delay_ms(10); LCD12864_NoWaitIdle_COM_Write(0x01); /*显示清屏*/ lcd_delay_ms(30); LCD12864_NoWaitIdle_COM_Write(0x06); /*DDRAM的地址计数器(AC)加1*/ lcd_delay_ms(30); } void LCD12864_HAIZI_WRITE(uchar xpos,uchar ypos,uchar daH,uchar daL) //ST7920 汉字字符写入 //参数说明: xpos 待写入的X位置 //ypos 待写入的Y位置 //daH 待写入的汉字的高八位 daL待写入的汉字的低八位 { uchar xy_pos; if((xpos>=8)||(ypos>=4) ) return; /*X位置超出显示范围退出*/ if(ypos==0) xy_pos = 0x80 + xpos; else if(ypos==1) xy_pos = 0x90 + xpos; /*计算转换地址*/ else if(ypos==2) xy_pos = 0x88 + xpos; else if(ypos==3) xy_pos = 0x98 + xpos; LCD12864_COM_Write(xy_pos); /*写地址*/ lcd_delay_ms(1); LCD12864_Data_Write(daH); /*写高八位数据*/ lcd_delay_ms(1); LCD12864_Data_Write(daL); /*写低八位数据*/ lcd_delay_ms(1); } //////////////////以上是LCD12864驱动程序//////////////// /*1MS为单位的延时程序*/ void delay_1ms(uchar x) { uchar j; while(x--){ for(j=0;j<125;j++) {;} } } void cugg(void) { P0=0X00;//关掉数码管的信号。阻止数码管受到P0口信号的影响。 dula=1; wela=0; delay1(); dula=0; wela=0; delay1(); } /*******读取电压********/ void dianya(uchar ad_data) { uchar temp1; dianya[2] =ad_data/51+'0'; temp1=ad_data%51*10; dianya[1] =temp1/51+'0'; temp1=temp1%51*10; dianya[0] =temp1/51+'0'; } //------------------------------------------------------------------- // 函数名称: iic_start() // 函数功能: 启动I2C总线子程序 //------------------------------------------------------------------- void iic_start(void) { //时钟保持高,数据线从高到低一次跳变,I2C通信开始 SDA = 1; SCL = 1; delayNOP(); // 延时5us SDA = 0; delayNOP(); SCL = 0; } //------------------------------------------------------------------- // 函数名称: iic_stop() // 函数功能: 停止I2C总线数据传送子程序 //------------------------------------------------------------------- void iic_stop(void) { SDA = 0; //时钟保持高,数据线从低到高一次跳变,I2C通信停止 SCL = 1; delayNOP(); SDA = 1; delayNOP(); SCL = 0; } //------------------------------------------------------------------ // 函数名称: iicInit_() // 函数功能: 初始化I2C总线子程序 //------------------------------------------------------------------ void iicInit(void) { SCL = 0; iic_stop(); } //------------------------------------------------------------------- // 函数名称: slave_ACK // 函数功能: 从机发送应答位子程序 //------------------------------------------------------------------- void slave_ACK(void) { SDA = 0; SCL = 1; delayNOP(); SCL = 0; } //------------------------------------------------------------------- // 函数名称: slave_NOACK // 函数功能: 从机发送非应答位子程序,迫使数据传输过程结束 //------------------------------------------------------------------- void slave_NOACK(void) { SDA = 1; SCL = 1; delayNOP(); SDA = 0; SCL = 0; } //------------------------------------------------------------------- // 函数名称: check_ACK // 函数功能: 主机应答位检查子程序,迫使数据传输过程结束 //------------------------------------------------------------------- void check_ACK(void) { SDA = 1; // 将SDA设置成输入,必须先向端口写1 SCL = 1; F0 = 0; delayNOP(); if(SDA == 1) // 若SDA=1表明非应答,置位非应答标志F0 F0 = 1; SCL = 0; } //------------------------------------------------------------------- // 函数名称: IICSendByte // 入口参数: ch // 函数功能: 发送一个字节 //------------------------------------------------------------------- void IICSendByte(uchar ch) { unsigned char idata n=8; // 向SDA上发送一位数据字节,共八位 while(n--) { if((ch&0x80) == 0x80) // 若要发送的数据最高位为1则发送位1 { SDA = 1; // 传送位1 SCL = 1; delayNOP(); // SDA = 0; SCL = 0; } else { SDA = 0; // 否则传送位0 SCL = 1; delayNOP(); SCL = 0; } ch = ch<<1; // 数据左移一位 } } //------------------------------------------------------------------- // 函数名称: IICreceiveByte // 返回接收的数据 // 函数功能: 接收一字节子程序 //------------------------------------------------------------------- uchar IICreceiveByte(void) { uchar idata n=8; // 从SDA线上读取一上数据字节,共八位 uchar tdata=0; while(n--) { SDA = 1; SCL = 1; tdata =tdata<<1; //左移一位 if(SDA == 1) tdata = tdata|0x01; // 若接收到的位为1,则数据的最后一位置1 else tdata = tdata&0xfe; // 否则数据的最后一位置0 SCL = 0; } return(tdata); } //------------------------------------------------------------------- // 函数名称: DAC_PCF8591 // 入口参数: slave_add从机地址,n要发送的数据个数 // 函数功能: 发送n位数据子程序 //------------------------------------------------------------------- void DAC_PCF8591(uchar controlbyte,uchar w_data) { iic_start(); // 启动I2C delayNOP(); IICSendByte(PCF8591_WRITE); // 发送地址位 check_ACK(); // 检查应答位 if(F0 == 1) { SystemError = 1; return; // 若非应答,置错误标志位 } IICSendByte(controlbyte&0x77); //Control byte check_ACK(); //检查应答位 if(F0 == 1) { SystemError = 1; return; // 若非应答,置错误标志位 } IICSendByte(w_data); //data byte check_ACK(); // 检查应答位 if(F0 == 1) { SystemError = 1; return; // 若非应答表明器件错误或已坏,置错误标志位SystemError } iic_stop(); // 全部发完则停止 delayNOP(); delayNOP(); delayNOP(); delayNOP(); } //------------------------------------------------------------------- // 函数名称: ADC_PCF8591 // 入口参数: controlbyte控制字 // 函数功能: 连续读入4路通道的A/D转换结果到receivebuf //------------------------------------------------------------------- void ADC_PCF8591(uchar controlbyte) { uchar idata receive_da,i=0; iic_start(); IICSendByte(PCF8591_WRITE); //控制字 check_ACK(); if(F0 == 1) { SystemError = 1; return; } IICSendByte(controlbyte); //控制字 check_ACK(); if(F0 == 1) { SystemError = 1; return; } iic_start(); //重新发送开始命令 IICSendByte(PCF8591_READ); //控制字 check_ACK(); if(F0 == 1) { SystemError = 1; return; } IICreceiveByte(); //空读一次,调整读顺序 slave_ACK(); //收到一个字节后发送一个应答位 while(i<4) { receive_da=IICreceiveByte(); receivebuf[i++]=receive_da; slave_ACK(); //收到一个字节后发送一个应答位 } slave_NOACK(); //收到最后一个字节后发送一个非应答位 iic_stop(); } void main() { uchar i; uint temp_buff; uint dianya1_buff,dianya2_buff; LCD12864_Reset(); /*LCD初始化*/ cugg(); while(1) { iicInit(); //I2C总线初始化 ADC_PCF8591(0x04); { iicInit(); //I2C总线初始化 ADC_PCF8591(0x04); } for(i=0;i<8;i++) LCD12864_HAIZI_WRITE(i,0,hanzi_buff1[i*2],hanzi_buff1[i*2+1]); for(i=0;i<8;i++) LCD12864_HAIZI_WRITE(i,1,hanzi_buff2[i*2],hanzi_buff2[i*2+1]); /*显示温度*/ for(i=0;i<8;i++) LCD12864_HAIZI_WRITE(i,2,hanzi_buff3[i*2],hanzi_buff3[i*2+1]); for(i=0;i<8;i++) LCD12864_HAIZI_WRITE(i,3,hanzi_buff4[i*2],hanzi_buff4[i*2+1]); /*显示温度*/ temp_buff = ReadTemperature(); /*读取温度*/ hanzi_buff2[10] = mun_to_char[temp_buff/100]; /*填充温度到缓存*/ hanzi_buff2[11] = mun_to_char[temp_buff%100/10]; hanzi_buff2[13] = mun_to_char[temp_buff%10]; delay_1ms(200); dianya1_buff = dianya(); /*读取电压*/ hanzi_buff3[10] = mun_to_char[dianya1_buff/100]; /*填充温度到缓存*/ hanzi_buff3[11] = mun_to_char[dianya1_buff%100/10]; hanzi_buff3[13] = mun_to_char[dianya1_buff%10]; delay_1ms(200); dianya2_buff = dianya(); /*读取电压*/ hanzi_buff4[10] = mun_to_char[dianya2_buff/100]; /*填充温度到缓存*/ hanzi_buff4[11] = mun_to_char[dianya2_buff%100/10]; hanzi_buff4[13] = mun_to_char[dianya2_buff%10]; delay_1ms(200); iicInit(); //I2C总线初始化 DAC_PCF8591(0x40,receivebuf[0]); //D/A输出 { iicInit(); //I2C总线初始化 DAC_PCF8591(0x40,receivebuf[0]); //D/A输出 } delay(100); } } } /*************************************************************************** ***/ //控制口定义////////////////////// #include #include #define uchar unsigned char #define uint unsigned int #define ad0_7 P1 //AD数据口 sbit cs=P0^7; //芯片选择信号,控制芯片的启动和结果读取,低电平有效 sbit rd=P3^7; //读数据控制,低电平有效 sbit wr=P3^6; //AD转换起动控制,上升沿有效 sbit dula=P2^6; //数码管段选,锁存器控制信号 sbit wela=P2^7; //数码管位选,锁存器控制信号 void cmg88()//关数码管,点阵函数 { dula=1; P0=0X00; dula=0; } #define Nop() _nop_() #define _Nop() _nop_() /*引脚端口定义*/ sbit LCD12864_RS_PORT = P3^5; /*LCD12864引脚定义*/ sbit LCD12864_RW_PORT = P3^6; sbit LCD12864_E_PORT = P3^4; #define LCD12864_DA_PORT P0 uchar code mun_to_char[] = {"0123456789"}; /*数字转换为ASCII字符码*/ uchar hanzi_buff1[]={"波形采集存储回放"}; uchar hanzi_buff2[]={"采集电压:0.00 V "}; /////////////////以下是LCD12864驱动程序//////////////// void LCD12864_WaitIdle() //LCD12864 忙 信号检测 { LCD12864_DA_PORT = 0xff; LCD12864_RS_PORT = 0; LCD12864_RW_PORT = 1; LCD12864_E_PORT = 1; while((LCD12864_DA_PORT&0x80)==1); /*等待BF 不为1*/ LCD12864_E_PORT = 0; } void LCD12864_COM_Write( uchar com_da) /* 检测忙信号写入命令字 com_da 为待写入的命令字*/ { LCD12864_WaitIdle(); LCD12864_RS_PORT = 0; LCD12864_RW_PORT = 0; LCD12864_DA_PORT = com_da; LCD12864_E_PORT = 1; Nop(); Nop(); Nop(); Nop(); Nop(); Nop(); Nop(); Nop(); LCD12864_E_PORT = 0; } void LCD12864_NoWaitIdle_COM_Write(uchar com_da) /* 不检测忙信号写入命令字 com_da 为待写入的命令字*/ { LCD12864_RS_PORT = 0; LCD12864_RW_PORT = 0; LCD12864_DA_PORT = com_da; LCD12864_E_PORT = 1; Nop(); Nop(); Nop(); Nop(); Nop(); Nop(); Nop(); Nop(); LCD12864_E_PORT = 0; } void LCD12864_Data_Write(uchar da) /* 数据写入 da 为待写入的8位数据*/ { LCD12864_WaitIdle(); /*检测忙信号*/ LCD12864_RS_PORT = 1; LCD12864_RW_PORT = 0; LCD12864_DA_PORT = da; LCD12864_E_PORT = 1; Nop(); Nop(); Nop(); Nop(); Nop(); Nop(); Nop(); Nop(); LCD12864_E_PORT = 0; } void lcd_delay_ms(uchar x) /*1MS为单位的延时程序,不准确*/ { uchar j; while(x--){ for(j=0;j<125;j++) {;} } } void LCD12864_Reset() /*LCD12864初始化*/ { lcd_delay_ms(100); /*适当延时待LCD自动复位完成*/ LCD12864_NoWaitIdle_COM_Write(0x30); /*使用8位并口通讯*/ lcd_delay_ms(10); LCD12864_NoWaitIdle_COM_Write(0x30); /*使用8位并口通讯*/ lcd_delay_ms(10); LCD12864_NoWaitIdle_COM_Write(0x0c); /*显示开及光标设置*/ lcd_delay_ms(10); LCD12864_NoWaitIdle_COM_Write(0x01); /*显示清屏*/ lcd_delay_ms(30); LCD12864_NoWaitIdle_COM_Write(0x06); /*DDRAM的地址计数器(AC)加1*/ lcd_delay_ms(30); } void LCD12864_HAIZI_WRITE(uchar xpos,uchar ypos,uchar daH,uchar daL) //ST7920 汉字字符写入 //参数说明: xpos 待写入的X位置 //ypos 待写入的Y位置 //daH 待写入的汉字的高八位 daL待写入的汉字的低八位 { uchar xy_pos; if((xpos>=8)||(ypos>=4) ) return; /*X位置超出显示范围退出*/ if(ypos==0) xy_pos = 0x80 + xpos; else if(ypos==1) xy_pos = 0x90 + xpos; /*计算转换地址*/ else if(ypos==2) xy_pos = 0x88 + xpos; else if(ypos==3) xy_pos = 0x98 + xpos; LCD12864_COM_Write(xy_pos); /*写地址*/ lcd_delay_ms(1); LCD12864_Data_Write(daH); /*写高八位数据*/ lcd_delay_ms(1); LCD12864_Data_Write(daL); /*写低八位数据*/ lcd_delay_ms(1); } //////////////////以上是LCD12864驱动程序//////////////// /*1MS为单位的延时程序*/ void delay_1ms(uchar x) { uchar j; while(x--){ for(j=0;j<125;j++) {;} } } //启动AD转换子程序////////////////////////////////////////////////////////// void start_ad(void) { wela=1; cs=0; //允许进行A/D转换 wr=0;_nop_();wr=1; //WR由低变高时,AD开始转换 cs=1; //停止AD转换 } //读A/D数据子程序/////////////////////////////////////// read_ad() { uint ad_data; ad0_7=0xff; wela=1; cs=0; //允许读 rd=0; //读取转换数据结果数据结果 _nop_(); ad_data=ad0_7; //把数据存到ad_data中 wela=1; rd=1;cs=1; //停止A/D读取 return(ad_data); } //数据处理与显示子程序////////////////////////////////////// //说明:当输入电压为5V时,A/D输出为FFH,即输入电压=AD数据*(5/255)=AD数据/(255/5 )=AD数据/51 void data_shout(uint ad_data) { uint a=50,one,two,three,four; hanzi_buff2[11] = mun_to_char[one=ad_data%51*10%51*10%51*10/51]; hanzi_buff2[13] = mun_to_char[two=ad_data%51*10%51*10/51]; hanzi_buff2[14] = mun_to_char[three=ad_data%51*10/51]; hanzi_buff2[15] = mun_to_char[four=ad_data/51]; } void main() { uchar i; LCD12864_Reset(); /*LCD初始化*/ cmg88(); while(1) { start_ad(); //启动AD data_shout(read_ad()); //读AD数据并显示 for(i=0;i<8;i++) LCD12864_HAIZI_WRITE(i,0,hanzi_buff1[i*2],hanzi_buff1[i*2+1]); /*显示年月日*/ for(i=0;i<8;i++) LCD12864_HAIZI_WRITE(i,1,hanzi_buff2[i*2],hanzi_buff2[i*2+1]); /*显示星期*/ } } //------------------------------------------------------------------- void writebyte(unsigned char j) //写一个字节 { unsigned char i,temp; temp=j; for (i=0;i<8;i++) { temp=temp<<1; SCL=0; delayNOP(); SDA=CY; //temp左移时,移出的值放入了CY中 delayNOP(); SCL=1; //待sda线上的数据稳定后,将scl拉高 delayNOP(); } SCL=0; delayNOP(); SDA=1; delayNOP(); } unsigned char readbyte() //读一个字节 { unsigned char i,j,k=0; SCL=0; delayNOP(); SDA=1; for (i=0;i<8;i++) { delayNOP(); SCL=1; delayNOP(); if(SDA==1) j=1; else j=0; k=(k<<1)|j; SCL=0; } delayNOP(); return(k); } void clock() //I2C总线时钟 { unsigned char i=0; SCL=1; delayNOP(); while((SDA==1)&&(i<255)) i++; SCL=0; delayNOP(); } ////////从24c02的地址address中读取一个字节数据///// unsigned char read24c02(unsigned char address) { unsigned char i; iic_start(); writebyte(0xa0); clock(); writebyte(address); clock(); iic_start(); writebyte(0xa1); clock(); i=readbyte(); iic_stop(); delay1(100); return(i); } //////向24c02的address地址中写入一字节数据info///// void write24c02(unsigned char address,unsigned char info) { iic_start(); writebyte(0xa0); clock(); writebyte(address); clock(); writebyte(info); clock(); iic_stop(); delay1(5000); //这个延时一定要足够长,否则会出错。因为24c02在从sda上取得数据后,还需要一定 时间的烧录过程。 } /////////24C02读写驱动程序//////////////////// void delay1(unsigned int m) { unsigned int n; for(n=0;n
更多简介内容

推荐帖子

电阻并联电路故障如何自测?
电阻并联电路是最基本的并联电路,所有负责的电路都可以转化成电阻串联电路和电阻并联电路来进行工作原理的理解。并联电路和串联电路特性完全不一样,是完全不同的电路,它们之间不能相互等效(电阻并联电路图)。 图为电阻并联电路,从图中可以看出电阻的R1和R2两根引脚分别相连,构成两个电阻的并联电路,+V是这一电路的直流工作电压。R1,R2并联在电路工作于交流电路中时,电路形式不变,只是直流电压+V
Aguilera 【模拟与混合信号】
浅析CC2540的OSAL原理
一概述   OSAL (Operating System Abstraction Layer),翻译为“操作系统抽象层”。OSAL就是一种支持多任务运行的系统资源分配机制。OSAL与标准的操作系统还是有很大的区别的。简单而言,OSAL实现了类似操作系统的某些功能,但并不能称之为真正意义上的操作系统。 二、OSAL任务运行方式          我们以TI1.2.1的BLE协议栈中的S
fish001 【无线连接】
应用笔记(AN4509)使用低g三轴加速度计测量倾斜度
该应用笔记介绍了一种低g三轴加速度计的倾斜检测理论和倾斜角测量方法。一般来说,这 里描述的程序也可以应用于三轴模拟或数字加速度计,这取决于它们各自的规格。 低gMEMS加速度计广泛用于消费电子和工业应用中的倾斜检测,如屏幕旋转和汽车安全报警 系统。低g加速度计的另一个广泛用途是用于地图转换和个人导航设备的倾斜补偿式电子罗 盘。该应用笔记描述了如何通过对一些可能导致角度倾斜计算错误的非理想因素
littleshrimp MEMS传感器
TI博文--音频放大器调试小技巧
本帖最后由 qwqwqw2088 于 2020-5-11 11:40 编辑 1.组件放置      D类放大器产生PWM脉冲,扬声器端子桥接负载配置,扬声器驱动器大约是电源的两倍。 工作频率一般为384Khz至768Khz,快速切换对具有快速上升时间(nS)和短脉冲宽度,因此这可能会出现严重的RF发射干扰,使芯片到扬声器之间的走线成为天线,所以 处理组件放置很重要。 Output F
qwqwqw2088 【模拟与混合信号】
MSP430G2 LaunchPad,蜂鸣器演奏音乐的方法
本帖最后由 Jacktang 于 2020-5-11 21:56 编辑 #include "msp430g2553.h" unsigned char n=0;  //n为节拍常数变量     unsigned char  music_tab[] ={   0x18, 0x30, 0x1C , 0x10, //格式为: 频率常数, 节拍常数, 频率常数, 节拍常数,     0x2
Jacktang 【微控制器 MCU】
Qorvo PAC系列高集成度电机控制芯片及应用
Qorvo是一家专注于创新射频解决方案的提供商,公司针对移动设备、网络基础设施、国防和航天等市场提供一整套的射频解决方案,全球拥有8000名员工,在北京和山东德州建设有工厂。     作为一家以技术创新为导向的公司,Qorvo的产品线分为基础设施与国防产品、移动产品两个部门。主要的增长点放在GaN、IoT和5G等市场。根据市场的发展方向,Qorvo还会通过收购去扩充其增长
fish001 RF/无线

评论

登录/注册

意见反馈

求资源

回顶部

datasheet推荐 换一换

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版 版权声明

北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved
$(function(){ var appid = $(".select li a").data("channel"); $(".select li a").click(function(){ var appid = $(this).data("channel"); $('.select dt').html($(this).html()); $('#channel').val(appid); }) })