鋼絲繩檢測仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (18.23 KB, 下載次數: 46)
下載附件
2019-6-7 05:08 上傳
單片機源程序如下:
- #include <reg51.h>
- #include <stdio.h>
- #include <intrins.h>
- #include <math.h> //Keil library
- #include <stdlib.h> //Keil library
- #define uchar unsigned char //定義一下方便使用
- #define uint unsigned int
- #define ulong unsigned long
- sbit RS = P2^0;
- sbit RW = P2^1;
- sbit EN = P2^2;
- sbit BF = P0^7; //忙碌標志位,,將BF位定義為P0.7引腳
- sbit ADOUT=P1^7; //ADC 數據輸入
- sbit ADCLK=P1^6; //ADC CLK
- sbit ADCS=P1^5; //ADC CS
- sbit key1=P3^6; //定義按鍵
- sbit spk=P3^7; //定義蜂鳴器
- sbit led=P3^5; //定義led
- uchar count;
- uint DATA1=0; //采集值
- /*************延時函數*************/
- void delay(uint n)
- { uint x,y;
- for(x=n;x>0;x--)
- for(y=121;y>0;y--);
- }
- /***********判忙函數***********/
- bit LCD_Check_Busy()
- {
- bit result;
- RS=0; //根據規定,RS為低電平,RW為高電平時,可以讀狀態
- RW=1;
- EN=1; //E=1,才允許讀寫
- _nop_(); //空操作
- _nop_();
- _nop_();
- _nop_(); //空操作四個機器周期,給硬件反應時間
- result=BF; //將忙碌標志電平賦給result
- EN=0; //將E恢復低電平
- return result;
- }
- /***********寫入命令函數***********/
- void write_com(uchar com)
- {
- while(LCD_Check_Busy()); //忙則等待
- RS=0;
- RW=0;
- EN=1;
- P0= com;
- _nop_();
- EN=0;
- }
- /**********寫入數據函數**********/
- void write_dat(uchar dat)
- {
- while(LCD_Check_Busy()); //忙則等待
- RS=1;
- RW=0;
- EN=1;
- P0= dat;
- _nop_();
- EN=0;
- }
- /*******寫入字符函數***********/
- void LCD_Write_Char(uchar x,uchar y,uchar dat)
- {
- if (y == 0)
- { write_com(0x80 + x); }
- else
- { write_com(0xC0 + x); }
- write_dat( dat);
- }
- /******寫入字符串函數***********/
- void Write_String(uchar x,uchar y,uchar *s)
- {
- while (*s)
- {
- LCD_Write_Char(x,y,*s);
- s++;
- x++;
- }
- }
- /*****初始化函數******/
- void LCD_Init()
- {
- write_com(0x38); /*顯示模式設置*/
- delay(5);
- write_com(0x06);/*顯示光標移動設置*/
- delay(5);
- write_com(0x0C); /*顯示開及光標設置*/
- write_com(0x01); /*顯示清屏*/
- }
- /*----------------ADC采樣函數程序-----------------------------------------------*/
- void adc0831()
- {
- uchar i;
- DATA1=1;
- _nop_(); _nop_(); _nop_();
- ADCS=0;
- _nop_(); _nop_(); _nop_();
- ADCLK=1;
- _nop_(); _nop_(); _nop_();
- ADCLK=0;
- _nop_(); _nop_(); _nop_();
- ADCLK=1;
- _nop_(); _nop_(); _nop_();
- ADCLK=0;
- for(i=0;i<8;i++)
- {
- DATA1<<=1;
- if(ADOUT)
- {
- DATA1++;
- }
- ADCLK=1;
- _nop_(); _nop_(); _nop_();
- ADCLK=0;
- _nop_(); _nop_(); _nop_();
- }
- ADCS=1;
- _nop_(); _nop_();
- // return DATA1;
- }
- ///***********************************************************************
- void lcd1()
- {
- // uint e;
- // uchar e0,e1,e2,e3;
- if(DATA1>340)
- {
- Write_String(0,1," OFF Normal ");
- spk=0;
- led=0;
- }
- else
- {
- Write_String(0,1," Normal ");
- spk=1;
- led=1;
- }
- /*
- e=DATA1;
- e0 = e/1000 +48;
- e1 = (e/100)%10+48;
- e2 = (e/10)%10+48;
- e3 = e%10+48;
- Write_String(8,1,"Q="); //
- LCD_Write_Char(10,1,e0);
- LCD_Write_Char(11,1,e1);
- LCD_Write_Char(12,1,e2);
- LCD_Write_Char(13,1,e3);
- Write_String(14,1,"Kg");
- */
- }
- void key()
- {
- if(key1==0) //kay5 +1
- {
- delay(1); //延時消抖
- if(key1==0)
- while(!key1);//等待松手
- // KA=!KA;
- }
- }
- /*----------------主函數-----------------------------------------------*/
- int main(void)
- {
- LCD_Init(); //初始化液晶屏
- delay(10); //延時用于穩定,可以去掉
- write_com(0x01); //清屏
- Write_String(0,0," Welcome to use "); //寫入的是設備信息
- Write_String(0,1," "); //寫入第二行信息,可以寫自己的名字什么的
- delay(500);
- //write_com(0x01); //清屏
- while (1)
- {
- adc0831(); //質量采集
- key();
- lcd1();
- delay(100); //延時,兩次發射之間要至少有10ms間隔
- }
- }
復制代碼
所有資料51hei提供下載:
C052931.zip
(189.81 KB, 下載次數: 24)
2019-6-4 00:14 上傳
點擊文件名下載附件
仿真程序文件 下載積分: 黑幣 -5
|