欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
這上面還有些按鍵功能怎么刪掉啊還不影響本來的單片機程序 求大神
[打印本頁]
作者:
VWN
時間:
2022-4-7 22:46
標題:
這上面還有些按鍵功能怎么刪掉啊還不影響本來的單片機程序 求大神
#include <reg51.h> //頭文件
#include "1.h"
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define u8 unsigned char
#define PWM_Cycle 100
//數據定義區(qū)
unsigned char Minute_set=1; //定時時間設置
unsigned char Distance_DIS=50; //設定的距離提醒舉例
sbit TX=P1^6; //超聲波傳感器的接口
sbit RX=P1^5;
sbit PWM_1=P1^7;
sbit PWM_2=P2^2;
sbit LED_ALARM=P1^4;
#define LED_PORT P3//燈光控制
unsigned long int counter_time=0;
unsigned char Minute_time=0;
unsigned char second_time=0;
uint time=0; //聲波時間
uint S=0; //距離
//LCD port
sbit LCD1602_RS= P1^2;
sbit LCD1602_RW= P1^1;
sbit LCD1602_EN= P1^0;
sfr LCD1602_DATAPINS= 0x80; //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.數據端口
sbit KEY1=P2^0;
sbit KEY2=P2^1;
sbit KEY3=P2^2;
sbit KEY4=P2^3;
#define KEY3_VALUE 3
#define KEY4_VALUE 4
extern void Delay1ms(uint c); //@11.0592MHz
uchar KEY_Scan(uchar mode);
//在LCD1602上顯示時間
void Display_Time_lcd1602();
uchar code number[10]={"0123456789"};
void delayms ( uint c) //@12.000MHz
{
unsigned char i, j;
for(;c>0;c--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
#define Lcd1602_Delay1ms delayms
/*******************************************************************************
* 函 數 名 : LcdWriteCom
* 函數功能 : 向LCD寫入一個字節(jié)的命令
* 輸 入 : com
* 輸 出 : 無
*******************************************************************************/
#ifndef LCD1602_4PINS //當沒有定義這個LCD1602_4PINS時
void Write_LCD_Command(uchar com) //寫入命令
{
LCD1602_EN = 0; //使能
LCD1602_RS = 0; //選擇發(fā)送命令
LCD1602_RW = 0; //選擇寫入
LCD1602_DATAPINS = com; //放入命令
Lcd1602_Delay1ms(1); //等待數據穩(wěn)定
LCD1602_EN = 1; //寫入時序
Lcd1602_Delay1ms(5); //保持時間
LCD1602_EN = 0;
}
#else
void Write_LCD_Command(uchar com) //寫入命令
{
LCD1602_EN = 0; //使能清零
LCD1602_RS = 0; //選擇寫入命令
LCD1602_RW = 0; //選擇寫入
LCD1602_DATAPINS = com; //由于4位的接線是接到P0口的高四位,所以傳送高四位不用改
Lcd1602_Delay1ms(1);
LCD1602_EN = 1; //寫入時序
Lcd1602_Delay1ms(5);
LCD1602_EN = 0;
LCD1602_DATAPINS = com << 4; //發(fā)送低四位
Lcd1602_Delay1ms(1);
LCD1602_EN = 1; //寫入時序
Lcd1602_Delay1ms(5);
LCD1602_EN = 0;
}
#endif
/*******************************************************************************
* 函 數 名 : LcdWriteData
* 函數功能 : 向LCD寫入一個字節(jié)的數據
* 輸 入 : dat
* 輸 出 : 無
*******************************************************************************/
#ifndef LCD1602_4PINS
void Write_LCD_Data(uchar dat) //寫入數據
{
LCD1602_EN = 0; //使能清零
LCD1602_RS = 1; //選擇輸入數據
LCD1602_RW = 0; //選擇寫入
LCD1602_DATAPINS = dat; //寫入數據
Lcd1602_Delay1ms(1);
LCD1602_EN = 1; //寫入時序
Lcd1602_Delay1ms(5); //保持時間
LCD1602_EN = 0;
}
#else
void Write_LCD_Data(uchar dat) //寫入數據
{
LCD1602_EN = 0; //使能清零
LCD1602_RS = 1; //選擇寫入數據
LCD1602_RW = 0; //選擇寫入
LCD1602_DATAPINS = dat; //由于4位的接線是接到P0口的高四位,所以傳送高四位不用改
Lcd1602_Delay1ms(1);
LCD1602_EN = 1; //寫入時序
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
LCD1602_DATAPINS = dat << 4; //寫入低四位
Lcd1602_Delay1ms(1);
LCD1602_EN = 1; //寫入時序
Lcd1602_Delay1ms(5);
LCD1602_EN = 0;
}
#endif
void LCD_Init() //1602LCD 初始化
{
Write_LCD_Command(0x01);//清屏
Write_LCD_Command(0x38);//設置8位格式,2行,5*8
Write_LCD_Command(0x0c);//整體顯示,關光標,不閃爍
Write_LCD_Command(0x06);//設定輸入方式,增量不移位
}
/****************寫一個字符數據到指定的位置***************/
void DisplayOneChar(uchar X,uchar Y,uchar DData)
{
Y&=1;
X&=15;
if(Y)X|=0x40;
X|=0x80;
Write_LCD_Command(X);
Write_LCD_Data(DData);
}
void Lcd1602SetCursor(uchar X,uchar Y)
{
Y&=1;
X&=15;
if(Y)X|=0x40;
X|=0x80;
Write_LCD_Command(X);
}
/****************寫多個個字符數據到指定的位置***************/
void DisplayChars(uchar X,uchar Y,uchar *str)
{
Lcd1602SetCursor(X, Y); //設置起始地址
while (*str != '\0')
{
Write_LCD_Data(*(str++));
}
}
/*********************************************************************
函數名稱:Disp_number()
功能描述:顯示四數字
入口參數:num:顯示的數字 n:數字位數
返回值:無
************************************************************************/
void Disp_number(uchar X,uchar Y,uint num,u8 n)
{
u8 a; //個位
u8 b; //十位
u8 c; //百位
u8 d; //千位
u8 e; //萬位
Y&=1;
X&=15;
if(Y)X|=0x40;
X|=0x80;
Write_LCD_Command(X);
switch(n)
{
case 1:Write_LCD_Data(num+0x30);
break;
case 2:b=num/10;
a=num%10;
Write_LCD_Data(number[b]);
Write_LCD_Data(number[a]);
break;
case 3:c=num/100;
b=num%100/10;
a=num%10;
Write_LCD_Data(number[c]);
Write_LCD_Data(number[b]);
Write_LCD_Data(number[a]);
break;
case 4:d=num/1000;
c=num%1000/100;
b=num%1000%100/10;
a=num%10;
Write_LCD_Data(number[d]);
Write_LCD_Data(number[c]);
Write_LCD_Data(number[b]);
Write_LCD_Data(number[a]);
break;
case 5:
e=num/10000;
d=num%10000/1000;
c=num%1000/100;
b=num%100/10;
a=num%10;
Write_LCD_Data(number[e]);
Write_LCD_Data(number[d]);
Write_LCD_Data(number[c]);
Write_LCD_Data(number[b]);
Write_LCD_Data(number[a]);
break;
}
}
void Count(void) //計算距離的函數
{
time=(TH0<<8)+TL0;
TH0=0;
TL0=0;
time=time+counter_time*65536;//us
S=time/58; //算出來是CM 340m/S聲速
}
//************************************
//定時器初始化
//初始化為10MS定時器
//************************************
void Time0_init()
{
TMOD |= 0x01; //使用模式1,16位定時器
TH0 = 0; //定時器裝入初始值10ms
TL0 = 0;
EA = 1; //總中斷
ET0 = 1;//定時器0初始化
TR0 = 0;
}
//定時器1初始化
void Timer1Init(void) //1毫秒@12.000MHz
{
//AUXR &= 0xBF; //定時器時鐘12T模式
TMOD &= 0x0F; //設置定時器模式
TMOD |= 0x10; //設置定時器模式
TL1 = 0x18; //設置定時初值
TH1 = 0xFC; //設置定時初值
TF1 = 0; //清除TF1標志
TR1 = 1; //定時器1開始計時
ET1=1;
}
void StartModule()
{
TX=1; //800MS 啟動一次模塊
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TX=0;
}
unsigned int DATA_V;
bit channel=0;
uint AD_val=0;
float code H_num=0.625 ; //這是一個距離的比例系數
//超聲波檢測
uchar HC_SR04_Task(void)
{
static unsigned long try=0;
static uchar timeout_flag=0;
StartModule();
while(!RX) //當RX為零時等待
{
try++;
if(try>600000) //等待時間不能太長,防止程序死機
{
try=0;
timeout_flag=1;//置位超時標志
break;
}
}
counter_time=0;
TH0=0;
TL0=0;
TR0=1; //開啟計數
if(timeout_flag==0)
{
while(RX) //當RX為1計數并等待
{
try++;
if(try>6000000) //等待時間不能太長,防止程序死機
{
try=0;
timeout_flag=1; //置位超時標志
break;
}
}
}
TR0=0; //關閉計數
if(timeout_flag)//如果超時了
{
TH0=0;
TL0=0;
timeout_flag=0;
}
else//正常數據
{
Count(); //計算
}
if(S>=Distance_DIS)
return 0;
else//當距離小于或等于50時,
{
return 4;
}
return 0;
}
bit Alarm_Time_flag=0;
void compare_light_time()
{
uchar key=0;
if(Alarm_Time_flag)
{
Write_LCD_Command(0x01);//清屏
while(1)
{
//請注意休息,聲光報警
LED_ALARM=0;
DisplayChars(0,0,"Please have");//在LCD1602上顯示Light
DisplayChars(0,1,"A good rest");
key=KEY_Scan(0);
if(key==KEY4_VALUE)//進入設置界面
{
Alarm_Time_flag=0;//時間到達設定值
LED_ALARM=1;
Write_LCD_Command(0x01);//清屏
break;
}
}
}
LED_ALARM=1;
}
/********************************************************************
* 名稱 : Main()
* 功能 : 主函數
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void Main(void)
{
uchar key=0,state=0;
Time0_init(); //初始化定時器 超聲波使用的
Timer1Init();//定時器1初始化 1ms中斷1次
LCD_Init();//LCD1602初始化
while(1)
{
key=KEY_Scan(0); //按鍵的掃描
switch(state)
{
case 0:
state=HC_SR04_Task();//超聲波檢測代碼
DisplayChars(0,1,"DIS:"); //
Disp_number(4,1,S,2);
DisplayChars(6,1,"cm");
compare_light_time();//比較時間報警
Disp_number(10,1,Minute_time,2);
DisplayOneChar(12,1,'-');
Disp_number(13,1,second_time,2);
if(key==KEY4_VALUE)//進入設置界面
{
second_time=0;
Minute_time=0;//清除時間
Alarm_Time_flag=0;//時間到達設定值
Write_LCD_Command(0x01);//清屏
break;
}
break;
case 4:
LED_ALARM=0;
state=HC_SR04_Task();//超聲波檢測代碼
DisplayChars(0,0,"Please adjust");
DisplayChars(0,1,"Your sitting pos");
if(state==0)
{ LED_ALARM=1;
Write_LCD_Command(0x01);//清屏
}
break;
default:break;
}
}
}
void timer0() interrupt 1 //10us定時器累加
{
TH0 = 0; //定時器裝入初始值10ms
TL0 = 0;
counter_time++;
}
void time1_ISR() interrupt 3
{
static uint count=0;
TL1 = 0x18; //設置定時初值
TH1 = 0xFC; //設置定時初值
count++;
if(count>=1000)//1s
{
count=0;
second_time++;
if(second_time>=60)
{
Minute_time++;
second_time=0;
if(Minute_time>=Minute_set)
Alarm_Time_flag=1; //超出時間
else
Alarm_Time_flag=0;
}
}
}
//按鍵控制
uchar KEY_Scan(uchar mode)
{
static u8 key=1;
if(mode==1) //連續(xù)按鍵按下
{
key=1;
}
if(KEY3==0||KEY4==0) //任意一個按鍵按下
{
delayms(10); //消抖
key=0;
if(KEY3==0)
{
return KEY3_VALUE;
}
else if(KEY4==0)
{
return KEY4_VALUE;
}
}
else if(KEY3==1&&KEY4==1) //無按鍵按下
{
key=1;
}
return 0;
}
復制代碼
作者:
yzwzfyz
時間:
2022-4-8 13:46
刪除一句,運行N次。如果你認為可以,就刪掉。反之就留著。
作者:
VWN
時間:
2022-4-9 21:27
yzwzfyz 發(fā)表于 2022-4-8 13:46
刪除一句,運行N次。如果你認為可以,就刪掉。反之就留著。
這。。。。。。
作者:
天ノ憶
時間:
2022-4-13 11:58
如果你覺得沙發(fā)的的辦法比較笨,那我就告訴你一個顯得他的方法不那么笨的方式
把你這程序完完全全弄明白了,包括1602的配置使用,io口檢測,也就是你說的按鍵,定時器,中斷,串口配置,包括你用的這款芯片的 數據手冊
相比之下還是沙發(fā)給的方法更省時省力吧
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1