- #include<reg51.h>
- #include<intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- #define ad0_7 P0 //AD转换数字量输出
- void disp(uchar);
- void dig_trans(uchar);
- void RTL_C();
- void long_delay(void); //长延时约120us
- void short_delay(void); //短延时约8us
- void delay10ms(uchar); //延时10ms
- void longdelay(uint time);
- //************7279子程序声明*******
- void init_7279(void);
- void write7279(uchar cmd,uchar dta); //写入到HD7279
- uchar read7279(uchar); //从HD7279读出
- void send_byte(uchar); //发送一个字节
- uchar receive_byte(void); //接受一个字节
- //************AD转换子程序声明******
- void start_ad(void);
- read_ad();
- avr_read_ad();
- uchar digit[4];
- uchar key_number,j,k;
- uint tmr;
- unsigned long wait_cnter;
- //*************语音转换子程序*******
- void SC_Speech(uchar cm);
- void SC_WBusy(void);
- void SC_Speechs(void);
- void init_SC(void); //sc1010初始化
- sbit SC_RST=P3^0; //脉冲复位
- sbit SC_DATA=P3^1; //脉冲数据
- sbit SC_BUSY=P3^2; //放音busy
- uint sp[8]; //组合语音数组变量
- sbit AD_CS=P1^0;//芯片选择信号,控制芯片的启动和结果读取,低电平有效
- sbit AD_CLK=P1^1;//读数据控制,低电平有效
- sbit AD_DI=P1^2;//AD转换启动控制,上升沿有效
- sbit AD_DO=P1^3;//AD转换结束输出低电平
- sbit cs=P2^0;//7279片选
- sbit clk=P2^1;
- sbit dat=P2^2;
- sbit key=P2^3;
- sbit buzzer=P2^7;
- //***** HD7279 指令 *****
- #define CMD_RESET 0xa4
- #define CMD_TEST 0xbf //测试
- #define DECODE0 0x80 //译码方式
- #define DECODE1 0xc8 //译码方式
- #define CMD_READ 0x15 //读
- #define UNDECODE 0x90 //译码方式:不译码
- #define RTL_CYCLE 0xa3 //循环左移
- #define RTR_CYCLE 0xa2 //循环右移
- #define RTL_UNCYL 0xa1 //左移
- #define RTR_UNCYL 0xa0 //右移
- #define ACTCTL 0x98 //消影
- #define SEGON 0xe0 //段亮
- #define SEGOFF 0xc0 //段灭
- #define BLINKCTL 0x88 //闪烁
- void main(){
- //init_SC();
- init_7279();
- buzzer=1;
- while(1){
- //for(tmr=0;tmr<0x2000;tmr++);//上电延时
- //send_byte(CMD_RESET);
- //start_ad();//启动AD
- // long_delay();
-
-
- disp(avr_read_ad());
- //SC_Speechs();
- delay10ms(200);
- }
- }
- /*
- //***********启动AD转换子程序*********
- void start_ad(void){
- ad_cs=0;//允许进行AD转换
- ad_wr=0;
- _nop_();
- ad_wr=1;//WR由低变高时,AD开始转换
- while(ad_intr);
- ad_cs=1;//停止AD转换
- }
- //************读AD数据子程序**********
- read_ad(){
- uchar ad_data;
- ad0_7=0xff;
- ad_cs=0;//允许读
- ad_rd=0;//读取转换数据结果
- _nop_();
- ad_data=ad0_7;//把数据存到ad_data中
- ad_rd=1;
- ad_cs=1;//停止AD读取
- return(ad_data);
- }*/
- int adc_0832()
- {
- uint tmp=0;
- uint a,b;
- AD_CS=0;
- AD_CLK=0;
- AD_DI=1;
- _nop_();
- _nop_();
- AD_CLK=1;
- _nop_();
- _nop_();
- AD_CLK=0;
- AD_DI=1;
- _nop_();
- _nop_();
- AD_CLK=1;
- _nop_();
- _nop_();
- AD_CLK=0;
- AD_DI=0;
- _nop_();
- _nop_();
- AD_CLK=1;
- _nop_();
- _nop_();
- AD_CLK=0;
- _nop_();
- _nop_();
-
- for(a=0;a<8;a++)
-
- {
- AD_CLK=1;
- _nop_();
- _nop_();
- AD_CLK=0;
- _nop_();
- _nop_();
- tmp|=AD_DO;
- if(a<7)
- tmp<<=1;
- }
- for(b=0;b<8;b++)
- {
- AD_CLK=1;
- _nop_();
- _nop_();
- AD_CLK=0;
- _nop_();
- _nop_();
- }
- AD_CS=1;
- return tmp;
- }
- //************AD转换8次取平均**********
- avr_read_ad(){
- uint i;
- uint average,max,min,sum;
- uint array[8];
- sum=0;
- for(i=0;i<8;i++){
- //start_ad();
- array[i]=adc_0832();
- }
-
- max=array[0];
- min=array[0];
- for(i=0;i<8;i++){
- if(max<array[i])
- max=array[i];
- if(min>array[i])
- min=array[i];
- sum=sum+array[i];
- }
- average=(sum-max-min)/6;
- return average;
- }
- //********显示***********
- void disp(uchar ad_data){
- uint a;
-
- digit[3]=(ad_data-0x08)*400/51%10;
- digit[2]=(ad_data-0x08)*40/51%10;
- digit[1]=(ad_data-0x08)*40/51%100/10;
- digit[0]=(ad_data-0x08)*40/51/100; //百位
- /*if(ad_data=0xe6)
- xshu=0x00;
-
- */
- buzzer=1;
-
- if((ad_data-0x06)>=0xff){
- digit[1]=0x00;
- digit[2]=0x00;
- digit[3]=0x00;
- }
- if(ad_data>=0x7f){
- for(a=0;a<5;a++){
- buzzer=0;
- longdelay(250);
- buzzer=1;
- longdelay(150);
- }
- }
-
- digit[2]=digit[2]+0x80;
- //while(a--){
- write7279(0x84,digit[0]);
- short_delay();
- write7279(0x85,digit[1]);
- short_delay();
- write7279(0x86,digit[2]);
- short_delay();
- write7279(0x87,digit[3]);
- short_delay();
- //}
- }
- //*******语音模块初始化*****
- /*void init_SC(void){
- SC_DATA=0;
- SC_RST=1;
- delay_us(100);
- SC_RST=0;
- delay_us(100);
- sp[0]=0;
- sp[1]=0;
- sp[2]=0;
- }
- void SC_Speech(uchar cnt){
- uchar i;
- SC_RST=1;
- delay_us(100);
- SC_RST=0;
- delay_us(100);
- for(i=0;i<cnt;i++){
- SC_DATA=1;
- delay_us(100);
- SC_DATA=0;
- delay_us(100);
- }
- }
- void SC_WBusy(void){
- uint times;
- for(times=0;times<20;times++){
- delay_ms(100);
- if(SC_BUSY==0)
- break;
- }
- }
- //*******控制地址段组合放音******
- void SC_Speechs(void){
- sp[0]=24;
- sp[1]=22;
- sp[2]=23;
- sp[3]=digit[0]+2;
- sp[4]=27;
- sp[5]=digit[1]+2;
- sp[6]=15;
- sp[7]=digit[2]+2;
- sp[8]=20;
-
- SC_Speech(sp[0]);
- SC_WBusy();
- SC_Speech(sp[1]);
- SC_WBusy();
- SC_Speech(sp[2]);
- SC_WBusy();
- SC_Speech(sp[3]);
- SC_WBusy();
- SC_Speech(sp[4]);
- SC_WBusy();
- SC_Speech(sp[5]);
- SC_WBusy();
- SC_Speech(sp[6]);
- SC_WBusy();
- SC_Speech(sp[7]);
- SC_WBusy();
- SC_Speech(sp[8]);
- SC_WBusy();
- sp[0]=0;sp[1]=0;sp[2]=0;sp[3]=0;//播放完毕后将各位置于无语音播放的0地址位
- sp[4]=0;sp[5]=0;sp[6]=0;sp[7]=0;SC_Speech(sp[8]);
- }
- */
- void init_7279(){
- uchar i;
- send_byte(CMD_RESET);
- for(i=0;i<8;i++)
- write7279(UNDECODE+i,1);
- }
- void write7279(uchar cmd,uchar dta){
- send_byte(cmd);
- send_byte(dta);
- }
- uchar read7279(uchar command){
- send_byte(command);
- return(receive_byte());
- }
- void send_byte(uchar out_byte){
- uchar i;
- cs=0;
- long_delay();
- for(i=0;i<8;i++){
- if(out_byte&0x80)
- dat=1;
- else
- dat=0;
- clk=1;
- short_delay();
- clk=0;
- short_delay();
- out_byte=out_byte*2;
- }
- dat=0;
- }
- uchar receive_byte(void){
- uchar i,in_byte;
- dat=1;
- long_delay();
- for(i=0;i<8;i++){
- clk=1;
- short_delay();
- in_byte=in_byte*2;
- if(dat)
- in_byte=in_byte|0x01;
- clk=0;
- short_delay();
- }
- dat=0;
- return(in_byte);
- }
-
- void long_delay(void){
- uint i;
- for(i=0;i<30;i++);
- }
- void short_delay(void){
- uchar i;
- for(i=0;i<8;i++);
- }
- void delay10ms(uchar time){
-
-
- uchar i;
- uint j;
- for(i=0;i<time;i++){
- for(j=0;j<0x390;j++){
- //if(!key)
- //ket_int();
- }
- }
- }
- void longdelay(uint time){
-
-
- uint i;
- uint j;
- for(i=0;i<time;i++){
- for(j=0;j<110;j++){
- //if(!key)
- //ket_int();
- }
- }
- }
复制代码 |