51单片机 加速度传感器采集显示C程序
- 格式:doc
- 大小:58.00 KB
- 文档页数:9
#include <REG52.H>#define uchar unsigned char#define uint unsigned int#define ulong unsigned longuchar a,b,c,d;#define LED_DAT P0sbit pin_SpeedSenser = P3^5; //速度传感器脉冲信号输出端接在T1上#define TIME_CYLC 100 //12M晶振,定时器10ms 中断一次我们1秒计算一次转速,1000ms/10ms = 100#define PLUS_PER 2 //码盘的齿数,这里假定码盘上有2个齿,即传感器检测到2个脉冲,认为1圈#define K 1.0 //校准系数sbit zhen1=P1^0;sbit fan1=P1^1;sbit en1=P1^2;uchar code loops[] = {0x7f,0xbf,0xdf,0xef}; //定义显示位控制驱动码uchar code table[]={0x14,0xd7,0x4c,0x45,0x87,0x25,0x24,0x57,0x04,0x05}; // 0,1,2,3,4,5,6,7,8,9uint Tcounter = 0; //时间计数器bit Flag_Fresh = 0; // 刷新标志bit Flag_clac = 0; //计算转速标志bit Flag_Err = 0; //超量程标志//在数码管上显示一个四位数void DisplayFresh();//计算转速,并把结果放入数码管缓冲区void ClacSpeed();//初始化定时器void init_timer();//延时函数void Delay(uint ms);void it_timer0() interrupt 1 //定时器0中断的响应函数{TF0 = 0; //定时器T0用于数码管的动态刷新TH0 = 0xD8; //初始化TL0 = 0xF0;Flag_Fresh = 1;Tcounter++;if(Tcounter>TIME_CYLC){Flag_clac = 1;//周期到,该重新计算转速了}}void it_timer1() interrupt 3 //中断地址是0x001b{TF1 = 0; //定时器T1用于单位时间内收到的脉冲数,要速度不是很快,T1永远不会益处Flag_Err = 1; //如果速度很高,我们应考虑另外一种测速方法:脉冲宽度算转速}void main(void){init_timer();while(1){zhen1=1;fan1=0;en1=1;Delay(31);en1=0;Delay(169);if(Flag_Fresh){Flag_Fresh = 0;DisplayFresh(); // 定时刷新数码管显示}if(Flag_clac){Flag_clac = 0;ClacSpeed(); //计算转速,并把结果放入数码管缓冲区Tcounter = 0;//周期定时清零TH1=TL1 = 0x00;//脉冲计数清零}if(Flag_Err) //超量程处理{//数码管显示字母'EEEE',开机时初始化为0000a = 0x2c;b = 0x2c;c = 0x2c;d = 0x2c;while(1){DisplayFresh();//不再测速等待复位i}}}}//在数码管上显示一个四位数void DisplayFresh(){P2 =loops[0] ;LED_DAT = table[a];Delay(20);P2 =loops[1] ;LED_DAT = table[b];Delay(20);P2 =loops[2] ;LED_DAT = table[c];Delay(20);P2 =loops[3] ;LED_DAT = table[d];Delay(20);}//计算转速,并把结果放入数码管缓冲区void ClacSpeed(){uint speed ;ulong PlusCounter;PlusCounter = TH1*256 + TL1;speed = K*(PlusCounter/PLUS_PER);//K是校准系数,如速度不准,调节K的大小a = (speed/1000)%10;b = (speed/100)%10;c = (speed/10)%10;d = speed%10;}void init_timer() //初始化{TMOD = 0x51; //定时10毫秒,TOT1选择软件门方式1,T0定时,T1计数,96页可查TH0 = 0xD8; //T0初始化TL0 = 0xF0;ET0=1; //T0中断允许EA=1; //T0中断TR0=1; //TO运行TH1 = 0x00; //T1初始化TL1 = 0x00;ET1=1; //T1中断允许TR1=1; //T1运行zhen1=1;fan1=0;}void Delay(uint ms) //延时0.1ms函数{uchar x,y;for(x=ms;x>0;x--)for(y=11;y>0;y--);}。
/*************************************** 控制器:KS0108* MCU:AT89C5* ,晶体频率:12MHz* 取模方式:纵向字节倒序* CS1和CS2为低电平有效**************************************/#include <reg52.h>#define uchar unsigned char#define uint unsigned int#define LCD_PORT P0#define Left 1#define Right 2sbit LCD_Busy=P0^7;sbit LCD_EN = P1^2;sbit LCD_RS = P1^0;sbit LCD_RW = P1^1;sbit LCD_RST= P1^7;sbit LCD_CS2= P3^6;sbit LCD_CS1= P3^5;uchar DisBuf[32],Page_Num,Clm_Num;code char Table0[]={/*-- 文字: A --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00,0x20,0x3C,0x23,0x02,0x02,0x27 ,0x38,0x20,/*-- 文字: B --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x08,0xF8,0x88,0x88,0x88,0x70,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x11 ,0x0E,0x00,/*-- 文字: C --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,0x07,0x18,0x20,0x20,0x20,0x10 ,0x08,0x00,/*-- 文字: D --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00,0x20,0x3F,0x20,0x20,0x20,0x10 ,0x0F,0x00,/*-- 文字: E --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x20,0x23,0x20 ,0x18,0x00,/*-- 文字: F --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x00,0x03,0x00 ,0x00,0x00,/*-- 文字: G --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xC0,0x30,0x08,0x08,0x08,0x38,0x00,0x00,0x07,0x18,0x20,0x20,0x22,0x1E ,0x02,0x00,};code unsigned char Table3[]={/*-- 文字: 天 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x40,0x42,0x42,0x42,0x42,0x42,0xFE,0x42,0x42,0x42,0x42,0x42,0x42 ,0x40,0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x06,0x01,0x02,0x04,0x08,0x10,0x30,0x60 ,0x20,0x00,/*-- 文字: 仙 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x80,0x60,0xF8,0x07,0x02,0xE0,0x00,0x00,0x00,0xFF,0x00,0x00,0x00 ,0xE0,0x00,0x01,0x00,0x00,0x7F,0x00,0x20,0x7F,0x20,0x20,0x20,0x3F,0x20,0x20,0x20 ,0x7F,0x00,/*-- 文字: 妹 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x08,0x88,0x7F,0x0A,0x08,0xF8,0x80,0x88,0x88,0x88,0xFF,0x88,0x88,0x88 ,0x80,0x00,0x40,0x21,0x12,0x0C,0x3A,0x11,0x40,0x30,0x0C,0x03,0xFF,0x06,0x08,0x30 ,0x10,0x00,/*-- 文字: 妹 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x08,0x88,0x7F,0x0A,0x08,0xF8,0x80,0x88,0x88,0x88,0xFF,0x88,0x88,0x88 ,0x80,0x00,0x40,0x21,0x12,0x0C,0x3A,0x11,0x40,0x30,0x0C,0x03,0xFF,0x06,0x08,0x30 ,0x10,0x00};code unsigned char Table4[]={/*-- 文字: 我 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x20,0x20,0x22,0x22,0xFE,0x21,0x21,0x20,0x20,0xFF,0x20,0x22,0xAC,0x20 ,0x20,0x00,0x04,0x04,0x42,0x82,0x7F,0x01,0x01,0x10,0x10,0x08,0x07,0x1A,0x21,0x40 ,0xF0,0x00,/*-- 文字: 好 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x10,0x10,0xF0,0x1F,0x10,0xF0,0x80,0x82,0x82,0x82,0xF2,0x8A,0x86,0x82 ,0x80,0x00,0x80,0x43,0x22,0x14,0x0C,0x73,0x20,0x00,0x40,0x80,0x7F,0x00,0x00,0x00 ,0x00,0x00,/*-- 文字: 想 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x08,0xC8,0x38,0xFF,0x18,0x68,0x08,0x00,0xFE,0x2A,0x2A,0x2A,0x2A,0xFE ,0x00,0x00,0x01,0x40,0x70,0x01,0x38,0x40,0x40,0x44,0x59,0x41,0x41,0x61,0x01,0x09 ,0x30,0x00,/*-- 文字: 你 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x80,0x40,0xF0,0x2C,0x43,0x20,0x98,0x0F,0x0A,0xE8,0x08,0x88,0x28,0x1C ,0x08,0x00,0x00,0x00,0x7F,0x00,0x10,0x0C,0x03,0x21,0x40,0x3F,0x00,0x00,0x03,0x1C ,0x08,0x00};code unsigned char Table5[]={/*-- 调入了一幅图像:C:\Documents and Settings\sammy\桌面\小新.bmp --*//*-- 宽度x高度=64x64 --*/0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xE0,0xF0 ,0xF8,0x7C,0x3C,0x1E,0x1E,0x8F,0xCF,0xCF,0xCF,0xDF,0x9F,0x9F,0x1F,0x1F,0x3F,0x3E ,0x3E,0x3E,0x7C,0x7C,0x7C,0xF8,0xF8,0xF0,0xE0,0xC0,0x80,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x20,0x10,0x08,0x08,0x1E,0x3F,0x7F,0x03 ,0x00,0x00,0x00,0x06,0x07,0x07,0x03,0x03,0x03,0x0F,0x3F,0x3F,0x7E,0x78,0x78,0x30 ,0x00,0x00,0x00,0x00,0x60,0xE0,0xF0,0x78,0x39,0x39,0x73,0xFE,0x60,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x03,0x04,0x08,0x11,0x08,0x04,0x83,0x80,0x0C,0x92,0xA2,0x44 ,0x22,0x12,0x00,0x00,0x00,0x00,0x00,0x0F,0x30,0x40,0x80,0x80,0x80,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x02,0x02,0x04,0x04,0x04,0x08,0x08,0x08,0x08,0x10,0x10,0x00 ,0x00,0x00,0x00,0x40,0x40,0x80,0x80,0x80,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00 ,0x00,0x60,0x90,0x10,0x20,0x10,0x90,0x60,0x00,0x03,0x04,0x08,0x11,0x08,0x04,0x03 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x0C,0x10 ,0xE0,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x01,0x06,0xF8,0x00,0x00 ,0x00,0x00,0x00,0x01,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F ,0x7F,0xFF,0xF3,0xF3,0xFE,0xFC,0xFC,0xF8,0xF8,0xF0,0xF0,0xF0,0xE0,0xE0,0xE0,0xE0 ,0xE0,0xE0,0xE4,0xE0,0xE0,0xE0,0x10,0x10,0x10,0x08,0x08,0x04,0x02,0x01,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xD8,0xD8,0xFC ,0xFC,0xFC,0xFD,0xFD,0xFF,0xF7,0xF7,0xF7,0xF7,0xFF,0xFF,0xFF,0xFF,0xF3,0xF7,0xF7 ,0xFF,0xFF,0xFF,0xFD,0xFD,0xFC,0xDC,0xD8,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0 ,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0 ,0xC0,0xC0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF ,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF ,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF ,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF ,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF ,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF ,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF ,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF ,0xFF,0xFF};code uchar Table8[]={/*-- 文字: 相 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x10,0x10,0xD0,0xFF,0x30,0x50,0x90,0x00,0xFE,0x22,0x22,0x22,0x22,0xFE ,0x00,0x00,0x04,0x03,0x00,0xFF,0x00,0x00,0x01,0x00,0xFF,0x42,0x42,0x42,0x42,0xFF ,0x00,0x00,/*-- 文字: 约 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x40,0x60,0x58,0xC7,0x60,0x18,0x40,0x20,0x58,0x8F,0x08,0x08,0x08,0xF8 ,0x00,0x00,0x10,0x32,0x13,0x12,0x0A,0x0A,0x08,0x00,0x00,0x00,0x43,0x80,0x40,0x3F ,0x00,0x00,/*-- 文字: 丛 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0xFE,0x80,0x00,0x00,0x00 ,0x00,0x00,0x20,0x30,0x2C,0x23,0x20,0x21,0x36,0x2C,0x23,0x20,0x20,0x23,0x26,0x3C ,0x28,0x00,/*-- 文字: 林 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x10,0x10,0x90,0xFF,0x90,0x10,0x00,0x10,0x10,0xD0,0xFF,0x90,0x10,0x10 ,0x10,0x00,0x08,0x06,0x01,0xFF,0x00,0x13,0x08,0x04,0x03,0x00,0xFF,0x01,0x06,0x18 ,0x08,0x00};code uchar Table9[]={/*-- 文字: 浪 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x08,0x30,0x01,0xC6,0x30,0x00,0xFC,0x94,0x95,0x96,0x94,0x94,0xFC,0x00 ,0x00,0x00,0x04,0x04,0xFE,0x01,0x00,0x00,0xFF,0x40,0x21,0x06,0x08,0x34,0x62,0xC2 ,0x40,0x00,/*-- 文字: 漫 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x10,0x20,0x81,0x66,0x00,0xC0,0x5F,0xD5,0x55,0x55,0xD5,0x55,0x5F,0xC0 ,0x00,0x00,0x04,0xFC,0x03,0x00,0x00,0x81,0x85,0x4D,0x55,0x25,0x35,0x4D,0xC5,0x41 ,0x00,0x00,/*-- 文字: 野 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x7E,0x4A,0xFE,0x4A,0x4A,0x7E,0x00,0x42,0x52,0xD2,0x6A,0x46,0xC2 ,0x40,0x00,0x22,0x22,0x22,0x1F,0x12,0x12,0x12,0x00,0x40,0x80,0x7F,0x00,0x00,0x00 ,0x00,0x00,/*-- 文字: 岭 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0xF0,0x00,0xFF,0x00,0xF0,0x40,0x20,0x10,0x2C,0x43,0x04,0x08,0x70 ,0x20,0x00,0x08,0x1F,0x08,0x07,0x04,0x07,0x01,0x05,0x09,0x11,0x29,0x65,0x03,0x01 ,0x00,0x00};void Delay_us(unsigned int DelayTime){while(DelayTime) DelayTime--;}void Delay_x10ms(unsigned char DelayTime) //***************10ms延时**********//{unsigned char i,j,k;for(i=0;i<DelayTime;i++)for(j=0;j<10;j++)for(k=0;k<120;k++) {;}}/*----------------------------------------------------------------------------下面这个函数用于液晶模块的忙信号检测。
51单片机驱动LED点阵扫描显示C语言程序LED点阵屏发光亮度强,指示效果好,可以制作运动的发光图文,更容易吸引人的注意力,信息量大,随时更新,有着非常好的广告和告示效果。
笔者此处就LED点阵屏动态扫描显示作一个简单的介绍。
1、LED点阵屏显示原理概述图1-1为一种8x8的LED点阵单色行共阳模块的内部等效电路图,对于红光LED其工作正向电压约为1.8v,其持续工作的正向电流一般10ma左右,峰值电流可以更大。
如下图,当某一行线为高电平而某一列线为低时,其行列交叉的点就被点亮,当某一行线为低电平时,无论列线如何,对应的这一行的点全部为暗。
LED点阵屏显示就是通过一定的频率进行逐行扫描,数据端不断输入数据显示,只要扫描频率足够高,由于人眼的视觉残留效应,就可以看到完整的文字或图案信息。
通常有4、8、16线扫描方式,扫描行数越少,点阵的显示亮度越好,但相应硬件数据寄存器需求也越多。
图1-1 点阵内部原理图2、硬件设计微控制器的IO口均不能流过过大的电流,LED点亮时有约10ms 的电流,因此LED点阵引脚不要直接接单片机IO口,应先经过一个缓冲器74HC573。
单片机IO口只需很小的电流控制74HC573即可间接的控制LED点阵某一行(或某一列),而74HC573输出也能负载约10ms的电流。
设置LED每点驱动电流为ID =15ma,这个电流点亮度好,并且有一定的裕度,即使电源输出电压偏高也不会烧毁LED,限流电阻值R = (VCC- VCE – VOL – VLED) / IDVCC为5v供电,VCE为三极管C、E间饱和电压,估为0.2v,VOL为74hc573输出低电平时电压,不同灌电流,此值不一样,估为0.2v,具体查看规格书,VLED为红光驱动电压,估为1.7v,根据上式可算出限流电阻为R = 200R。
LED点阵屏需接收逐个扫描信号,扫描到相应列(或行),对应的列(或行)数据有效,即显示这一列(或行)的信息。
/*********************************************************//*程序名称:温度监控系统*//*程序功能:利用89C52单片机和DS18B20温度传感器实现环境*//* 温度的实时测量和高、低温报警*//*程序版本:v1.0 *//*作者:*//*编写时间:*//*********************************************************/#include 〈reg52。
h>#include 〈intrins.h〉//含_nop_()延时函数//定义数据类型#define uchar unsigned char#define uint unsigned int//定义端口#define LED P0 //段码输出口sbit DQ = P3^2;//传感器数据口sbit SMG_q = P1^0;//定义数码管阳级控制脚(千位)sbit SMG_b = P1^1;//定义数码管阳级控制脚(百位)sbit SMG_s = P1^2; //定义数码管阳级控制脚(十位)sbit SMG_g = P1^3;//定义数码管阳级控制脚(个位)sbit buzzer = P1^5;//蜂鸣器sbit led_low = P2^6; //低温指示灯sbit led_high = P2^7;//高温指示灯sbit led_ok = P2^5; //温度正常指示灯sbit led_work = P2^4;//工作指示灯sbit set = P3^7;//设置按键sbit add = P3^4;//加一按键sbit dec = P3^5;//减一按键//定义变量和常量int count = 0;//按键次数寄存器int h;//主函数用循环计数器uint temp; //温度值uchar r; //温度值整数形式uchar high = 35,low = 20; //上下限初值//共阳LED段码表"0" ”1”"2”"3" "4””5" "6””7”"8" ”9””不亮" ”—"uchar code LED_code[12] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; uchar code LED_code1[] = {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};uchar code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};//小数部分转换码表uchar data temp_data[2]= {0x00,0x00};//存储从传感器读出的温度值uchar data dp[5]= {0x00,0x00,0x00,0x00,0x00};//显示单元数据,共4个数据和一个运算//子函数声明void ds_reset();//DS18B20初始化函数void ds_write(uchar ds_wrdata);//DS18B20写数据函数uchar ds_read(); //DS18B20读数据函数read_temp(); //读取温度函数void change_temp(uint tem);//温度数据处理void xianshi(int horl);//温度显示转换void display(); //数码管显示函数void keyscan(); //按键查询函数void warn_led();//超限报警void delay(uint t);//延时函数,单次25us/********************主函数*********************/void main(){LED=0x00; //初始化显示端口led1=0;led2=0;led3=0;led4=0;for(h=0;h<4;h++){dp[h]=8;}while(1) //循环执行显示和温度读取{uchar i;for(i=0;i〈200;i++){warn_led(); //指示灯控制display(); //显示keyscan(); //按键扫描}change_temp(read_temp());//温度数据读取和处理}}/***********************************************//*函数名称:ds_reset()*//*函数功能:DS18B20初始化*//*入口参数:无*//*输出参数:无*//*调用函数:delay();_nop_(); *//*全局变量:无*//*局部变量:presence *//***********************************************/void ds_reset(void){char presence=1;while(presence){while(presence){DQ=1;//传感器数据段先置高电平_nop_();_nop_();//适当延时DQ=0; //传感器数据段从高电平拉到低电平delay(50); //延时DQ=1; //再置高电平delay(6);//延时presence=DQ; //初始化成功,继续下一步}delay(45); //延时presence=~DQ;}DQ=1; //拉高电平led_work=0; //开工作指示灯}/***********************************************//*函数名称:ds_write() *//*函数功能:向DS18B20写数据*//*入口参数:ds_wrdata *//*输出参数:无*//*调用函数:delay();_nop_(); *//*全局变量:无*//*局部变量:ds_wrdata *//***********************************************/ void ds_write(uchar ds_wrdata){uchar i;for(i=8;i〉0;i——){DQ=1;_nop_();_nop_();DQ=0;_nop_();_nop_();_nop_();_nop_();DQ=ds_wrdata&0x01; //最低位移出delay(6);ds_wrdata=ds_wrdata/2;//右移1位}DQ=1;delay(1);}/***********************************************/ /*函数名称:ds_read()*//*函数功能:从DS18B20读数据*//*入口参数:无*//*输出参数:value *//*调用函数:delay();_nop_();*//*全局变量:*//*局部变量:i;value; *//***********************************************/uchar ds_read(void){uchar i;uchar value=0;for(i=8;i>0;i-—){DQ=1;_nop_();_nop_();value〉>=1;DQ=0;_nop_();_nop_();_nop_();_nop_();DQ=1;_nop_();_nop_();_nop_();_nop_();if(DQ)value|=0x80;delay(6);}DQ=1;return(value);}/***********************************************/ /*函数名称:read_temp()*//*函数功能:读温度数据数据*//*入口参数:无*//*输出参数:yemp *//*调用函数:ds_reset();ds_write();ds_read();*//* delay(); *//*全局变量:temp *//*局部变量:temp_data[];*//***********************************************/ read_temp(){ds_reset();//传感器初始化delay(200);ds_write(0xcc);//发跳过读取序列号命令ds_write(0x44); //发温度转换命令ds_reset();delay(1);ds_write(0xcc);ds_write(0xbe);//读18B20中存储器temp_data[0]=ds_read();//读温度值的低字节命令temp_data[1]=ds_read(); //读温度值的高字节temp=temp_data[1];temp<〈=8;temp=temp|temp_data[0]; //两字节合成一个整型变量return temp;//返回温度值}/***********************************************/ /*函数名称:chang_temp() *//*函数功能:将温度传感器中独到的数据进行转换*//*入口参数:tem *//*输出参数:dp[]*//*调用函数:无*//*全局变量:dp[];ditab[];r; *//*局部变量:tem *//***********************************************/void change_temp(uint tem){uchar n=0;if(tem>6348) // 温度值正负判断{tem=65536—tem; // 负温度求补码n=1; //标志位置1}dp[4]=tem&0x0f; // 取小数部分的值dp[0]=ditab[dp[4]];// 存入小数部分显示值dp[4]=tem〉〉4;// 取中间八位,即整数部分的值dp[3]=dp[4]/100; // 取百位数据dp[1]=dp[4]%100;// 取后两位数据dp[2]=dp[1]/10;// 取十位数据dp[1]=dp[1]%10;// 个位r=dp[1]+dp[2]*10+dp[3]*100;//实际温度值(十进制)if(!dp[3])//符号位显示判断{dp[3]=0x0a; //最高位为0时不显示if(!dp[2]){dp[2]=0x0a;//次高位为0时不显示}}if(n){dp[3]=0x0b;//负温度时最高位显示"—”}}/***********************************************//*函数名称:xianshi() *//*函数功能:温度数据转换成显示所需LED段码*//*入口参数:horl *//*输出参数:dp[] *//*调用函数:无*//*全局变量:dp[]; *//*局部变量:n; *//***********************************************/ void xianshi(int horl){int n=0;if(horl〉128) //负数补码转换{horl=256—horl;n=1;}dp[3]=horl/100;dp[3]=dp[3]&0x0f; //百位dp[2]=horl%100/10; //十位dp[1]=horl%10;//个位dp[0]=0; //小数位if(!dp[3])//高位为零不显示{dp[3]=0x0a;if(!dp[2]){dp[2]=0x0a;}}if(n) //负数最高位显示“—"{dp[3]=0x0b;}}/***********************************************/ /*函数名称:display()*//*函数功能:数码管显示*//*入口参数:无*//*输出参数:无*//*调用函数:delay() *//*全局变量:dp[];LED_code[];LED_code1[];*//*led1;led2;led3;led4; *//*局部变量:j;*//***********************************************/ void display(){int j;for(j=0;j<4;j++) //4位LED扫描控制{switch(j){case 0:LED=LED_code[dp[0]];led4=1;delay(450);led4=0;break;//小数位case 1:LED=LED_code1[dp[1]];led3=1;delay(450);led3=0;break;//个位case 2:LED=LED_code[dp[2]];led2=1;delay(450);led2=0;break;//十位case 3:LED=LED_code[dp[3]];led1=1;delay(450);led1=0;break; //百位}}}/***********************************************/ /*函数名称:keyscan() *//*函数功能:按键查询*//*入口参数:无*//*输出参数:无*//*调用函数:delay();display();xianshi();*//*全局变量:count;high;low; *//*局部变量:无*//***********************************************/ void keyscan(){if(set==0) //set键按下{while(1){delay(500);//延时去抖动if(set==0)//重新判断set键是否按下{count++;while(!set)//按键弹起继续显示前面内容display();}if(count==1)//set按下一次执行此段{xianshi(high);//转换上限温度为段码并显示display();if(add==0) //add键是否按下{while(!add)//弹起时上限温度加一并显示display();high+=1;}if(dec==0)//dec键是否按下{while(!dec) //弹起时上限温度减一并显示display();high—=1;}}if(count==2)//set键按下两次执行此段{xianshi(low);//转换下限温度为段码并显示display();if(add==0) //add键是否按下{while(!add)//弹起时下限温度加一并显示display();low+=1;}//dec键是否按下if(dec==0){while(!dec)//弹起时下限温度减一并显示display();low—=1;}}if(count>=3)//set键按下三次回到温度显示状态{count=0;break;}}}}/***********************************************//*函数名称:warn_led() *//*函数功能:工作情况指示灯控制*//*入口参数:无*//*输出参数:无*//*调用函数:无*//*全局变量:high;low;r; *//*局部变量:无*//***********************************************/ void warn_led(){if(r〉high)//温度高于上限温度{led_low=1;//“低温”指示灯灭led_high=0;//“高温"指示灯亮led_ok =1;//“正常"指示灯灭buzzer = 0; //蜂鸣器发声}else if(r〈low)//温度低于下限温度{led_low=0;//“低温"指示灯亮led_high=1;//“高温”指示灯灭led_ok =1; //“正常”指示灯灭buzzer = 0; //蜂鸣器发声}else //温度正常{led_low=1; //“低温”指示灯灭led_high=1;//“高温”指示灯灭led_ok =0; //“正常"指示灯亮buzzer = 1; //蜂鸣器不发声}}/***********************************************/ /*函数名称:delay() *//*函数功能:延时函数,单次25us左右延时*//*入口参数:t; *//*输出参数:无*//*调用函数:无*//*全局变量:无*//*局部变量:t;*//***********************************************/void delay(uint t){for (;t〉0;t—-);}/*******************程序结束********************/。
振幅、频率测量程序://#include <AT89X51.H>#include<reg52.h>#include<absacc.h>#include<intrins.h>//函数声明void t_init(void);void display(uint);void display1(uint);void ad_init(void);void delay(uchar);#define uchar unsigned char#define uint unsigned intunsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66, //字段吗0x6d,0x7d,0x07,0x7f,0x6f};unsigned char code tablewei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; //字位码unsigned char T0count; //T0计数变量unsigned char timecount; //T1中段次数#define PA 0x7cff //PA口#define PB 0x7dff //PB口#define con 0x7fff //控制字sbit A8=P2^0; //地址线A0sbit A9=P2^1; //地址线A1sbit cs=P2^7; //片选sbit wr=P3^6; //读端口//ad转换的控制位sbit ST=P3^2;sbit OE=P3^0;sbit EOC=P3^1;sbit ADA=P2^4;sbit ADB=P2^5;sbit ADC=P2^6;bit flag; //测频率结束标志unsigned long x;void main(){t_init(); //T0、T1初始化ad_init(); //0809初始化while(1) //循环{uint getdata;uint pl;if(flag==1) //测频率完成{flag=0;x=T0count*65536+TH0*256+TL0;pl=(unsigned int)x;timecount=0;T0count=0;TH0=0;TL0=0;TR0=1;}display(pl); //显示频率(后3个数码管)ADA=1; //选择ad通道ADB=1;ADC=0;ST=0; //启动ad转换ST=1;ST=0;while(EOC==0); //转换结束OE=1; //允许读数据getdata=P1; //读数据OE=0;x=getdata; //换算成想要的数值x=x*500/256;x=x/3;getdata=(unsigned int)x;display1(getdata); //输出于前3个数码管}}void delay(uchar i) //延时函数{uchar j,k;for(j=i;j>0;j--)for(k=125;k>0;k--);}void display(uint temp) //显示函数(后3){uchar A1,A2,A3;A1=temp/100;A2=(temp%100)/10;A3=temp%10;wr=1;XBYTE[PB]=0xdf; //选通第一位数码管wr=0;delay(1);wr=1;XBYTE[PA]=table[A3]; //显示个位wr=0;delay(10);wr=1;XBYTE[PA]=0x00; //关掉显示个位wr=0;wr=1;XBYTE[PB]=0xef; //选通第2位数码管wr=0;delay(1);wr=1;XBYTE[PA]=table[A2];//显示十位wr=0;delay(10);wr=1;XBYTE[PA]=0x00; //关掉显示十位wr=0;wr=1;XBYTE[PB]=0xf7; //选通第3位数码管wr=0;delay(1);wr=1;XBYTE[PA]=table[A1]; //显示百位wr=0;delay(10);wr=1;XBYTE[PA]=0x00; //关掉显示百位wr=0;}void display1(uint temp) //显示函数(后3){uchar A1,A2,A3;A1=temp/100;A2=(temp%100)/10;A3=temp%10;wr=1;XBYTE[PB]=0xfe; //选通第一位数码管wr=0;delay(1);wr=1;XBYTE[PA]=table[A1]; //显示百位wr=0;delay(10);wr=1;XBYTE[PA]=0x00; //关掉显示百位wr=0;wr=1;XBYTE[PB]=0xfd; //选通第2位数码管wr=0;delay(1);wr=1;XBYTE[PA]=table[A2];//显示十位wr=0;delay(10);wr=1;XBYTE[PA]=0x00; //关掉显示十位wr=0;wr=1;XBYTE[PB]=0xfb; //选通第3位数码管wr=0;delay(1);wr=1;XBYTE[PA]=table[A3]; //显示个位wr=0;delay(10);wr=1;XBYTE[PA]=0x00; //关掉显示个位wr=0;}void t_init(void) //定时器初始化{TMOD=0x15;TH0=0;TL0=0;TH1=(65536-4000)/256;TL1=(65536-4000)%256;TR1=1;TR0=1;ET0=1;ET1=1;EA=1;}void ad_init(void) //0809和8255初始化{wr=1;XBYTE[con]=0x80; //A组输入B组输出方式0wr=0;delay(1); // 延时1ms//delay(1000); // 延时1s//P2 |=0x30;ADA=1;ADB=1;ADC=0;EOC=1;OE=0;ST=0;}void t0(void) interrupt 1 using 0 //T0中段,测频率{T0count++;}void t1(void) interrupt 3 using 0 //T1中段4000us*250=1s; {TH1=(65536-4000)/256;TL1=(65536-4000)%256;timecount++;if(timecount==250){TR0=0;timecount=0;flag=1;}}键盘控制正弦电压输出程序:#include <reg51.h>#define uchar unsigned char#define uint unsigned intsbit LCP=P2^2;sbit SCP=P2^1;sbit SI=P2^0;sbit S1=P2^3;sbit S2=P2^4;sbit DA0832=P3^3;sbit DA0832_ON=P3^2;uchar fun=0,b=0,c=0,d=0,tl,th;uchar code tab[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};uchar codetosin[256]={0x80,0x83,0x86,0x89,0x8d,0x90,0x93,0x96,0x99,0x9c,0x9f,0xa2,0xa5,0xa8, 0xab,0xae,0xb1,0xb4,0xb7,0xba,0xbc,0xbf,0xc2,0xc5,0xc7,0xca,0xcc,0xcf,0xd1,0xd4,0xd6,0xd8,0xda,0xdd,0xdf,0xe1,0xe3,0xe5,0xe7,0xe9,0 xea,0xec,0xee,0xef,0xf1,0xf2,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0 xff,0xff,0xff,0xfe,0xfd,0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,0xf5,0xf4,0xf2,0xf1,0xef,0xee,0xec,0xea,0xe9,0x e7,0xe5,0xe3,0xe1,0xde,0xdd,0xda,0xd8,0xd6,0xd4,0xd1,0xcf,0xcc,0xca,0xc7,0xc5,0xc2,0xbf,0xbc,0xba,0xb7,0xb4,0xb1,0x ae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x99,0x96,0x93,0x90,0x8d,0x89,0x86,0x83,0x80,0x80,0x7c,0x79,0x76,0x72,0x6f,0x6c,0x69, 0x66,0x63,0x60,0x5d,0x5a,0x57,0x55,0x51,0x4e,0x4c,0x48,0x45,0x43,0x40,0x3d,0x3a,0x38,0x35,0x33,0x30,0x2e,0x2b,0x29,0x27, 0x25,0x22,0x20,0x1e,0x1c,0x1a,0x18,0x16,0x15,0x13,0x11,0x10,0x0e,0x0d,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02, 0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02 ,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09 ,0x0a,0x0b,0x0d,0x0e,0x10,0x11,0x13,0x15,0x16,0x18,0x1a,0x1c,0x1e,0x20,0x22,0x25,0x27,0x29,0x2b,0x2e,0x30,0x33,0x35,0x38, 0x3a,0x3d,0x40,0x43,0x45,0x48,0x4c,0x4e,0x51,0x55,0x57,0x5a,0x5d,0x60,0x63,0x66 ,0x69,0x6c,0x6f,0x72,0x76,0x79,0x7c,0x80 };void key1(void){fun++;if(fun==2)fun=0x00;}void key2(void){tl++;if(tl==0x1f)th++;}void judge(void){uchar line,row,de1,de2,keym;P1=0x0f;keym=P1;if(keym==0x0f)return;for(de1=0;de1<200;de1++)for(de2=0;de2<125;de2++){;}P1=0x0f;keym=P1;if(keym==0x0f)return;P1=0x0f;line=P1;P1=0xf0;row=P1;line=line+row; /*存放特征键值*/if(line==0xde)key1();if(line==0x7e)key2();}void time0_int(void) interrupt 1 //中断服务程序{TR0=0;if(fun==1){DA0832=tosin[b]; //正弦波b++;void main(void){TMOD=0X01; TR0=1;th=0xff;tl=0xd0;TH0=th;TL0=tl;ET0=1;EA=1;while(1)}。
新概念51单片机C语言教程----入门、提高、开发、拓展全攻略郭天祥编著电子工业出版社例2.2.1编写程序,点亮第一个发光二极管(part2_1.c P27)#include <reg52.h> //52系列单片机头文件sbit led1=P1^0; //声明单片机P1口的第一位void main() //主函数{led1=0; /*点亮第一个发光二极管*/}例2.2.2编写程序,点亮P1口的若干二极管(part2_2.c P39)#include <reg52.h> //52系列单片机头文件void main() //主函数{P1=0xaa;//while(1);}例2.5.1利用for语句延时特性,编写第一个发光二极管以间隔1S亮灭闪动的程序(part2_3.c P42)#include <reg52.h> //52系列单片机头文件#define uint unsigned int //宏定义sbit led1=P1^0; //声明单片机P1口的第一位uint i,j;void main() //主函数{while(1) //大循环{led1=0; /*点亮第一个发光二极管*/for(i=1000;i>0;i--) //延时for(j=110;j>0;j--);led1=1; /*关闭第一个发光二极管*/for(i=1000;i>0;i--) //延时for(j=110;j>0;j--);}}- 2 - 例2.6.1编写程序使第一个发光二极管以间隔500ms亮灭闪动。
(part2_4.c P48)#include <reg52.h> //52系列单片机头文件#define uint unsigned int //宏定义sbit led1=P1^0; //声明单片机P1口的第一位void delay1s(); //声明子函数void main() //主函数{while(1) //大循环{led1=0; /*点亮第一个发光二极管*/delay1s(); //调用延时子函数led1=1; /*关闭第一个发光二极管*/delay1s(); //调用延时子函数}}void delay1s() //子函数体{uint i,j;for(i=500;i>0;i--)for(j=110;j>0;j--);}例2.7.1编写程序使第一个二极管以亮200ms、灭800ms的方式闪动。
//实例 100:电机转速表设计#include<reg51.h> // 包含单片机寄存器的头文件#include<intrins.h> //包含 _nop_() 函数定义的头文件sbit RS=P2A0; sbit RW=P2A1; sbit E=P2A2; II寄存器选择位,将 RS位定义为P2.0引脚〃读写选择位,将 RW位定义为P2.1引脚II使能信号位,将E位定义为P2.2引脚sbit BF=P0A7; II忙碌标志位,,将BF位定义为P0.7引脚unsigned char code digit[ ]={"0123456789"}; // 定义字符数组显示数字 un sig ned in t v;II储存电机转速unsigned char count; 〃储存定时器TO中断次数bit flag; //计满1秒钟标志位***************************************************函数功能:延时 1ms (3j+2)*i=(3 X 33+2) X 10=1010(微秒),可以认为是 1 毫秒***************************************************/ void delay1ms(){unsigned char i,j; for(i=0;i<10;i++) for(j=0;j<33;j++)}I*****************************************************函数功能:延时若干毫秒入口参数: n***************************************************Ivoid delay(unsigned char n){unsigned char i;for(i=0;i<n;i++)delay1ms();}I*****************************************************函数功能:判断液晶模块的忙碌状态返回值:result。
#include <at89x52.h>#define DO P3_7#define SEG P0 //数码管自左至右依次为1234位#define MS2L 0x18 //1ms的延时参数#define MS2H 0xfc#define uchar unsigned char#define uint unsigned intuchar code comm[4] = {0x01,0x02,0x04,0x08};uchar code seg[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};uchar code seg_add_dicimal[10] = {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};uchar code seg_dicimal[2] ={0xc0, 0x92};uchar k = 0;uchar temp_l = 0;uchar temp_h = 0;uchar tempsign = 0;uchar hundreds = 0;uchar tens = 0;uchar ones = 0;uchar low_four = 0;/*延时以ms为单位的t时间*/void Delay(uint t)uint i;while(t--)for(i=0; i<125; i++)/*us级延时,延时时间约4+2*i*/void Delayus(uchar i)while(--i);/*产生复位脉冲,等待应答信号*/void Resetpaulse()DO = 0; //拉低约600usDelayus(150);Delayus(150);DO = 1;//产生上升沿,延时约15~60us Delayus(30);while(~DO); //等待应答信号/*读取数据一位*/bit Readbit()uint i = 0;bit b = 0;DO = 0; //产生读时隙i++; //维持低电平至少1usDO = 1; //1us以上后拉高Delayus(2); //延时8us,DO下降沿15内ds18b20输出的数据才有效 b = DO; //读取数据Delayus(40); //每个读时隙至少持续60usreturn(b);/*读取一个字节*/uchar Readbyte()uchar byte_read = 0;uchar i, j;for(i=0; i<8; i++)j = Readbit();byte_read = (j<<i) | byte_read; //低位读起return(byte_read);/*写一个字节*/void Writebyte(uchar byte_to_write)uchar i = 0;uchar j = 0;bit write_bit = 0;for(j=0; j<8; j++)write_bit = (byte_to_write & 0x01);if(write_bit == 1) //写1DO = 0; //产生写时隙Delayus(3); //延时15usDO = 1; //写1Delayus(40); //延时,写时隙不得低于60uselseDO = 0; //产生写时隙Delayus(50); //延时,保持低约60us~120usDO = 1;i++;byte_to_write = byte_to_write >> 1;/*配置ds18b20,9位分辨率 */void Configurate()EA = 0;Resetpaulse(); //发出复位脉冲,每次操作都从复位开始 Delay(1);Writebyte(0xcc); //skip room命令Writebyte(0x4e);Writebyte(0x7f);Writebyte(0x80);Writebyte(0x1f);EA = 1;/*启动温度转换*/void StartConvert()Resetpaulse(); // 发出复位脉冲,每次操作都从复位开始Delay(1);EA = 0;Writebyte(0xcc); //skip room命令Writebyte(0x44); //启动温度转换命令EA = 1;/*读取温度值*/void ReadTempreture()EA = 0;Resetpaulse(); // 发出复位脉冲,每次操作都从复位开始Delay(1);Writebyte(0xcc); //skip room命令Writebyte(0xbe); //读取暂存器命令temp_l = Readbyte(); //存储温度低字节值(整数部分低四位和小数部分)temp_h = Readbyte(); //存储温度高字节值(其中高五位为符号位) EA = 1;/*数据转换*/void DigitalConvert()uchar total = 0;tempsign = (temp_h >> 7) & 0x01; //得出符号位if(tempsign == 0) //正数的处理方法total = ((temp_h << 4)&0xf0) | ((temp_l >> 4)&0x0f); //取整数位low_four = (temp_l>>3) & 0x01; //取小数位,9位分辨率,低字节第3位为小数位,只有0、1两种取值hundreds = total / 100; //计算百、十、个位tens = (total%100)/10;ones = (total%100)%10;else //负数处理求负数补码规则是,按位取反,得到反码,加1即得补码(符号位不变)tempsign = 1;total = ((temp_l >> 4) & 0x0f); //取整数部分低4位total |= ((temp_h << 4) & 0xf0); //整数部分高三位和符号位low_four = (temp_l >> 3) & 0x01; //取小数位if(low_four == 0) //这里total位uchar型变量,所以根据最低位来确定整数取补规则total = ~total + 1; //最低位为0的时候,取反加1后有进位,所以这里total要取反加1elsetotal = ~total; //最低位为1的时候,取反加1没有进位,所以total直接取反即可tens = (total%100)/10;ones = (total%100)%10;/*中断处理*/void Display() interrupt 1EA = 0;TL0 = MS2L;TH0 = MS2H;DigitalConvert(); //数据转换if(tempsign == 0) //正数if(k == 0)if(hundreds == 0) //高位0消隐{P1 = 0;}elseP1 = comm[k];SEG = seg[hundreds];else if(k == 1)if(tens == 0 && hundreds == 0) //高位0消隐{P1 = 0;}elseP1 = comm[k];SEG = seg[tens];else if(k == 2) //显示个位,因为个位有小数点,所以又定义了一个数组分开来显示P1 = comm[k];SEG = seg_add_dicimal[ones]; //要加上小数点else //显示小数,0或5P1 = comm[k];SEG = seg_dicimal[low_four];else if(tempsign == 1) //负数if(k == 0) //显示符号位P1 = comm[k];SEG = 0xbf;else if(k == 1)if(tens == 0){P1 = 0;}elseP1 = comm[k];SEG = seg[tens];else if(k == 2) //显示个位,因为各位有小数点,所以分开来显示 P1 = comm[k];SEG = seg_add_dicimal[ones]; //要加上小数点else //显示小数,0或5P1 = comm[k];SEG = seg_dicimal[low_four];k++;if(k == 4)k = 0;EA = 1;/*主函数部分*/void main()TMOD = 0x01;TL0 = MS2L;TH0 = MS2H;TF0 = 0;EA = 1;ET0 = 1;TR0 = 1;Configurate();do{Delay(1);StartConvert();Delay(100);ReadTempreture();while(1);希望以上资料对你有所帮助,附励志名言3条::1、世事忙忙如水流,休将名利挂心头。
振幅、频率测量程序://#include <AT89X51.H>#include<reg52.h>#include<absacc.h>#include<intrins.h>//函数声明void t_init(void);void display(uint);void display1(uint);void ad_init(void);void delay(uchar);#define uchar unsigned char#define uint unsigned intunsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66, //字段吗0x6d,0x7d,0x07,0x7f,0x6f};unsigned char code tablewei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; //字位码unsigned char T0count; //T0计数变量unsigned char timecount; //T1中段次数#define PA 0x7cff //PA口#define PB 0x7dff //PB口#define con 0x7fff //控制字sbit A8=P2^0; //地址线A0sbit A9=P2^1; //地址线A1sbit cs=P2^7; //片选sbit wr=P3^6; //读端口//ad转换的控制位sbit ST=P3^2;sbit OE=P3^0;sbit EOC=P3^1;sbit ADA=P2^4;sbit ADB=P2^5;sbit ADC=P2^6;bit flag; //测频率结束标志unsigned long x;void main(){t_init(); //T0、T1初始化ad_init(); //0809初始化while(1) //循环{uint getdata;uint pl;if(flag==1) //测频率完成{flag=0;x=T0count*65536+TH0*256+TL0;pl=(unsigned int)x;timecount=0;T0count=0;TH0=0;TL0=0;TR0=1;}display(pl); //显示频率(后3个数码管)ADA=1; //选择ad通道ADB=1;ADC=0;ST=0; //启动ad转换ST=1;ST=0;while(EOC==0); //转换结束OE=1; //允许读数据getdata=P1; //读数据OE=0;x=getdata; //换算成想要的数值x=x*500/256;x=x/3;getdata=(unsigned int)x;display1(getdata); //输出于前3个数码管}}void delay(uchar i) //延时函数{uchar j,k;for(j=i;j>0;j--)for(k=125;k>0;k--);}void display(uint temp) //显示函数(后3){uchar A1,A2,A3;A1=temp/100;A2=(temp%100)/10;A3=temp%10;wr=1;XBYTE[PB]=0xdf; //选通第一位数码管wr=0;delay(1);wr=1;XBYTE[PA]=table[A3]; //显示个位wr=0;delay(10);wr=1;XBYTE[PA]=0x00; //关掉显示个位wr=0;wr=1;XBYTE[PB]=0xef; //选通第2位数码管wr=0;delay(1);wr=1;XBYTE[PA]=table[A2];//显示十位wr=0;delay(10);wr=1;XBYTE[PA]=0x00; //关掉显示十位wr=0;wr=1;XBYTE[PB]=0xf7; //选通第3位数码管wr=0;delay(1);wr=1;XBYTE[PA]=table[A1]; //显示百位wr=0;delay(10);wr=1;XBYTE[PA]=0x00; //关掉显示百位wr=0;}void display1(uint temp) //显示函数(后3){uchar A1,A2,A3;A1=temp/100;A2=(temp%100)/10;A3=temp%10;wr=1;XBYTE[PB]=0xfe; //选通第一位数码管wr=0;delay(1);wr=1;XBYTE[PA]=table[A1]; //显示百位wr=0;delay(10);wr=1;XBYTE[PA]=0x00; //关掉显示百位wr=0;wr=1;XBYTE[PB]=0xfd; //选通第2位数码管wr=0;delay(1);wr=1;XBYTE[PA]=table[A2];//显示十位wr=0;delay(10);wr=1;XBYTE[PA]=0x00; //关掉显示十位wr=0;wr=1;XBYTE[PB]=0xfb; //选通第3位数码管wr=0;delay(1);wr=1;XBYTE[PA]=table[A3]; //显示个位wr=0;delay(10);wr=1;XBYTE[PA]=0x00; //关掉显示个位wr=0;}void t_init(void) //定时器初始化{TMOD=0x15;TH0=0;TL0=0;TH1=(65536-4000)/256;TL1=(65536-4000)%256;TR1=1;TR0=1;ET0=1;ET1=1;EA=1;}void ad_init(void) //0809和8255初始化{wr=1;XBYTE[con]=0x80; //A组输入B组输出方式0wr=0;delay(1); // 延时1ms//delay(1000); // 延时1s//P2 |=0x30;ADA=1;ADB=1;ADC=0;EOC=1;OE=0;ST=0;}void t0(void) interrupt 1 using 0 //T0中段,测频率{T0count++;}void t1(void) interrupt 3 using 0 //T1中段4000us*250=1s; {TH1=(65536-4000)/256;TL1=(65536-4000)%256;timecount++;if(timecount==250){TR0=0;timecount=0;flag=1;}}键盘控制正弦电压输出程序:#include <reg51.h>#define uchar unsigned char#define uint unsigned intsbit LCP=P2^2;sbit SCP=P2^1;sbit SI=P2^0;sbit S1=P2^3;sbit S2=P2^4;sbit DA0832=P3^3;sbit DA0832_ON=P3^2;uchar fun=0,b=0,c=0,d=0,tl,th;uchar code tab[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};uchar codetosin[256]={0x80,0x83,0x86,0x89,0x8d,0x90,0x93,0x96,0x99,0x9c,0x9f,0xa2,0xa5,0xa8, 0xab,0xae,0xb1,0xb4,0xb7,0xba,0xbc,0xbf,0xc2,0xc5,0xc7,0xca,0xcc,0xcf,0xd1,0xd4,0xd6,0xd8,0xda,0xdd,0xdf,0xe1,0xe3,0xe5,0xe7,0xe9,0 xea,0xec,0xee,0xef,0xf1,0xf2,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0 xff,0xff,0xff,0xfe,0xfd,0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,0xf5,0xf4,0xf2,0xf1,0xef,0xee,0xec,0xea,0xe9,0x e7,0xe5,0xe3,0xe1,0xde,0xdd,0xda,0xd8,0xd6,0xd4,0xd1,0xcf,0xcc,0xca,0xc7,0xc5,0xc2,0xbf,0xbc,0xba,0xb7,0xb4,0xb1,0x ae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x99,0x96,0x93,0x90,0x8d,0x89,0x86,0x83,0x80,0x80,0x7c,0x79,0x76,0x72,0x6f,0x6c,0x69, 0x66,0x63,0x60,0x5d,0x5a,0x57,0x55,0x51,0x4e,0x4c,0x48,0x45,0x43,0x40,0x3d,0x3a,0x38,0x35,0x33,0x30,0x2e,0x2b,0x29,0x27, 0x25,0x22,0x20,0x1e,0x1c,0x1a,0x18,0x16,0x15,0x13,0x11,0x10,0x0e,0x0d,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02, 0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02 ,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09 ,0x0a,0x0b,0x0d,0x0e,0x10,0x11,0x13,0x15,0x16,0x18,0x1a,0x1c,0x1e,0x20,0x22,0x25,0x27,0x29,0x2b,0x2e,0x30,0x33,0x35,0x38, 0x3a,0x3d,0x40,0x43,0x45,0x48,0x4c,0x4e,0x51,0x55,0x57,0x5a,0x5d,0x60,0x63,0x66 ,0x69,0x6c,0x6f,0x72,0x76,0x79,0x7c,0x80 };void key1(void){fun++;if(fun==2)fun=0x00;}void key2(void){tl++;if(tl==0x1f)th++;}void judge(void){uchar line,row,de1,de2,keym;P1=0x0f;keym=P1;if(keym==0x0f)return;for(de1=0;de1<200;de1++)for(de2=0;de2<125;de2++){;}P1=0x0f;keym=P1;if(keym==0x0f)return;P1=0x0f;line=P1;P1=0xf0;row=P1;line=line+row; /*存放特征键值*/if(line==0xde)key1();if(line==0x7e)key2();}void time0_int(void) interrupt 1 //中断服务程序{TR0=0;if(fun==1){DA0832=tosin[b]; //正弦波b++;void main(void){TMOD=0X01; TR0=1;th=0xff;tl=0xd0;TH0=th;TL0=tl;ET0=1;EA=1;while(1)}。