|
本帖最后由 daniu 于 2014-12-26 21:31 编辑
STC12C5406AD 晶振频率为12MHz 指令周期:本程序取:1.0us/6倍。
本程序已调试完成:
功能说明:STC12C5406AD+74HC164+1602液晶显示的电压表。
测量电压:采用10位AD测量,测量结果非常准确。
- #include "stc12c5410ad.h"//头文件
- #include "intrins.h"
- #define uchar unsigned char//宏定义
- #define uint unsigned int//宏定义
- sbit RS=P3^4;//定义I/O的硬件接口
- sbit E=P3^7;
- sbit A_B=P3^2;
- sbit CP=P3^3;
- sbit Simulation=P1^7;//模拟电压输入
- uint temp;
- uchar code DispTab_1[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};//1602:0-9 数字
- uchar code DispTab_2[]={0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00};//温度符号
- uchar DispBuf[6]; //6字节的显示缓冲区
- char char_char_1[]={" www#mdizi#com "};//定义字符串
- void delay(uint z)//1ms延时
- {
- uchar x,x1;
- for(;z>0;z--)
- {
- for(x=0;x<114;x++)
- {
- for(x1=0;x1<1;x1++);
- }
- }
- }
- void delay1()//经精准计算,该段程序1次延时时间为 19.53us;多次调用需要重新计算。
- {
- _nop_();
- _nop_();
- _nop_();
- }
- void write_Directive(uchar a)//写指令
- {
- uchar i,temp;
- for(i=0;i<8;i++)
- {
- temp=a;
- temp&=0x80;
- if(temp==0x80)
- A_B=1;
- else
- A_B=0;
- a=a<<1;
- delay1();
- CP=0;
- delay1();
- CP=1;
- delay1();
- CP=0;
- }
- RS=0;
- delay(3);
- E=0;
- delay(3);
- E=1;
- delay(3);
- E=0;
- delay(3);
- }
- void write_Data(uchar a)//写数据
- {
- uchar i,temp;
- for(i=0;i<8;i++)
- {
- temp=a;
- temp&=0x80;
- if(temp==0x80)
- A_B=1;
- else
- A_B=0;
- a=a<<1;
- delay1();
- CP=0;
- delay1();
- CP=1;
- delay1();
- }
- RS=1;
- delay(3);
- E=0;
- delay(3);
- E=1;
- delay(3);
- E=0;
- delay(3);
- }
- void init()//初始化
- {
- uchar i;
- CP=1;
- A_B=1;
- delay(15);
- write_Directive(0x38);
- delay(5);
- write_Directive(0x38);
- delay(5);
- write_Directive(0x38);
- write_Directive(0x01);
- write_Directive(0x02);///初始化后数据地址为0x80;即第一行,第一个位置
- write_Directive(0x0c);
- write_Directive(0x80+0x40);//第二行第一位地址
- for(i=0;i<16;i++)
- {
- write_Data(char_char_1[ i]);//显示字符串" wwwmdizicom "
- }
- }
- void Temperature_symbol()//温度符号
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- write_Directive(0x40+i);//写入温度符号
- write_Data(DispTab_2[ i]);
- }
- }
- void write_Data_String()//显示时间函数
- {
- uchar i;
- unsigned int mm;
- DispBuf[0]=temp/10000;//显示百位
- mm=temp%10000;
- DispBuf[1]=mm/1000;//显示十位
- mm=mm%1000;
- DispBuf[2]=mm/100;//显示个位
- mm=mm%100;
- DispBuf[3]=mm/10;//显示小数点:0.001
- DispBuf[4]=mm%10;//显示小数点:0.0001
- i=DispBuf[0];
- DispBuf[0]=DispTab_1[ i];//查表,取字符
- i=DispBuf[1];
- DispBuf[1]=DispTab_1[ i];
- i=DispBuf[2];
- DispBuf[2]=DispTab_1[ i];
- i=DispBuf[3];
- DispBuf[3]=DispTab_1[ i];
- i=DispBuf[4];
- DispBuf[4]=DispTab_1[ i];
- write_Directive(0x80+0x04);//第一行,第五个位置地址
- write_Data(DispBuf[0]);//第一行,第五个位置
- write_Data('.');//第一行,第六个位置
- write_Data(DispBuf[1]);//第一行,第七个位置
- write_Data(DispBuf[2]);//第一行,第八个位置
- write_Data(DispBuf[3]);//第一行,第九个位置
- write_Data(DispBuf[4]);//第一行,第十个位置
- write_Data('V');
- }
- void I_O_init()
- {
- P1M1=0x80;
- P1M0=0x80;
- }
- void ADC_Conversion()//ADC开始转
- {
- ADC_CONTR=0x87;
- delay(1);
- ADC_CONTR=0x8f;
- delay(1);
- //while((ADC_CONTR==0x8f));
- ADC_CONTR=0x87;
- delay(1);
- }
- void ADC_Calculated()//ADC计算
- {
- float temp1;
- float temp2;
- uint temp3;
- temp=ADC_DATA;//高8位
- temp1=temp;
- temp=temp1/256*5*10000;//高8位计算
- temp3=ADC_LOW2;//低2位
- temp2=temp3;
- temp3=temp2/256*5*10000;//低2位计算
- temp=temp+temp3;//高8位的计算值+低2位的计算值=实际值
- }
- void main()
- {
- init();
- I_O_init();//I/O口初始化
- Temperature_symbol();//写入温度符号
- while(1)
- {
- ADC_Conversion();//ADC开始转
- ADC_Calculated();//ADC计算
- write_Data_String();//显示温度
- delay(1000);
- }
- }
-
复制代码
|
评分
-
查看全部评分
|